【发布时间】:2023-04-04 16:18:01
【问题描述】:
我正在使用 iTextSharp 填写 PDF 上的一些表单域。
PdfReader pdfReader = new PdfReader(templateFile);
//http://stackoverflow.com/questions/17852902/disable-extended-features-with-itextsharp Prevent annoying "extended features disabled" warning in Adobe Reader
pdfReader.RemoveUsageRights();
PdfStamper pdfStamper = new PdfStamper(pdfReader, new FileStream(fileName, FileMode.Create), PdfWriter.VERSION_1_7);
pdfStamper.SetFullCompression();
pdfStamper.Writer.CompressionLevel = PdfStream.BEST_COMPRESSION;
AcroFields pdfFormFields = pdfStamper.AcroFields;
// set form pdfFormFields
pdfFormFields.SetField("field1", "value1");
pdfFormFields.SetField("field2", "value2");
pdfFormFields.SetField("field3", "value3");
//etc
pdfStamper.FormFlattening = false;
// close the pdf
pdfStamper.Close();
填写 PDF 字段后,我不会立即将表单展平,以便可以根据需要进行手动更改。进行手动更改后,我打开 PDF,设置最大压缩率,展平表单,保存并关闭文档。
//Move the original file so I can recreate it without editable form fields
string tempFileName = filename + ".temp";
File.Move(filename, tempFileName);
using (PdfReader pdfReader = new PdfReader(tempFileName))
{
using (PdfStamper pdfStamper = new PdfStamper(pdfReader, new FileStream(filename, FileMode.Create), PdfWriter.VERSION_1_7))
{
pdfStamper.SetFullCompression();
pdfStamper.Writer.CompressionLevel = PdfStream.BEST_COMPRESSION;
// flatten the form to remove editting options
pdfStamper.FormFlattening = true;
pdfStamper.Close();
}
pdfReader.Close();
}
//Delete the original temp file
File.Delete(tempFileName);
我第一次直接运行上面的代码来压缩和展平PDF,每个文件的大小略有减小,从300KB到256KB。但是,如果我第二次运行上面的代码,文件大小会大大减少,从 256KB 到 95KB。随后的运行不会进一步更改文件大小。我的问题是,如何让 iTextSharp 第一次输出最小的文件大小?
编辑
从使表单变平的块中删除压缩代码会产生相同的结果,尽管最终大小略大,为 105KB。
【问题讨论】:
-
明确一点,当您说“我第一次运行此代码”时,您是指您多次运行的第二个代码块吗?
-
我认为原因是在第一遍中使用的资源 b 字段仍然嵌入在 PDF 中(展平仅在关闭时发生,因此很长一段时间内这些资源被引用)并且仅在第二遍中删除。你能分享一个填写好的 PDF 来重现这个问题吗?
-
@ChrisHaas,这是正确的。在 PDF 上多次传递第二个代码块会导致此问题。
标签: c# itextsharp