我正在使用iTextSharp来填写PDF上的一些表单字段。
填写PDF表格后,我不会立即将表格压平,以便根据需要进行手动更改。一旦完成手动更改,我会打开PDF文件,设置最大压缩比,压平表单,并保存和关闭文档。
第一次运行上面的代码以压缩和扁平化PDF时,每个文件的大小略有减小,从300KB到256KB。但是,如果我第二次运行上面的代码,文件大小会大幅减小,从256KB到95KB。后续运行不会进一步改变文件大小。我的问题是,如何让iTextSharp在第一次输出最小的文件大小?
编辑:从扁平化表单的块中删除压缩代码会导致相同的结果,尽管最终大小略大,为105KB。
PdfReader pdfReader = new PdfReader(templateFile);
//https://dev59.com/dGMm5IYBdhLWcg3wHMN0 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。