- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在使用 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 第一次输出最小的文件大小?
编辑
从扁平化表单的 block 中删除压缩代码会产生相同的结果,但最终大小稍大一些,为 105KB。
最佳答案
这种行为的原因很简单:
PdfReader
时,未使用的对象会立即被删除。 (如果您在部分模式下工作则不会,但您不会那样做。)PdfStanper
时,它会从它标记的 PdfReader
复制所有对象并添加一些自己的、尚未写入的信息。因此,
第一遍中的小尺寸减小可能是由于源文件中已经存在少量未使用的对象或 iTest(Sharp) 更好的压缩。
第二遍中尺寸的大幅减小肯定是由于与表单字段相关的对象被丢弃。
关于你的问题
how can I get iTextSharp to output the smallest file size the first time
你不能。压模一般不能简单地丢弃与表格相关的对象,因为它们也可能被不同的对象使用。它甚至无法检查此类用法,因为之前执行的其他压模操作可能已经创建了新的 PDF 对象,这些对象确实引用了那些有问题的对象,但这些新生成的 PDF 对象早已被写入输出,压模无法再访问它们。
不过,您可以通过使用 MemoryStream
作为第 1 遍的输出和第 2 遍的输入来防止中间 PDF 出现在光盘上。
如果您想知道为什么 PdfStamper
不将那些新创建的对象保存在内存中以便以后检查未使用的对象:iText(Sharp) 是在创建服务器应用程序和大型 PDF 时考虑的;在这种情况下,应该尽早写入数据并释放内存。
关于c# - 使用 pdfStamper 多次通过可减少文件大小,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34600054/
下面的代码正确地将值“foo”分配给命名字段,但该字段没有被“展平”。我一定是忽略了一个步骤,但我不知道它是什么。请指教。谢谢。 public byte[] FlattenSpecifiedFormF
我正在使用 iTextSharp 通过 C# 将页码添加到 PDF。在运行代码分析时,怀疑输出的 MemoryStream 被处理了不止一次。 See this warning generated b
我正在使用 iTextSharp 填写 PDF 上的一些表单域。 PdfReader pdfReader = new PdfReader(templateFile); //http://stackov
我正在使用 ColdFusion 11 和 Java (com.lowagie.text.pdf.PdfStamper) 来填写 pdf,但是当我输入一个带有单个撇号的值时,例如 32' 它仅在 pd
我现在迷路了。 我试图完成的是在另一个(如水印)上添加一个 PDF。 问题是我似乎不明白使用的坐标系,因为 我的水印表现出乎意料。 这两个 PDF 具有不同的尺寸。 我的目标具有以下维度: 595高度
我使用 iText 5.4 PDFStamper 在我的 PDF 文档上使用以下代码进行数字签名: stamper = PdfStamper.createSignature(reader, os, '
我有下面的iText代码来读取文件并将其添加到主PDF文件中,所以它基本上是在现有PDF的绝对位置添加PDF页面。主 PDF 中的绝对位置和页码将动态确定。有时,它可能位于第 1 页上的 100,10
我正在尝试将新页面添加到 PdfStamper,但此代码不会将模板 pdf 字段添加到压模。 private void InsertNewPage(PdfStamper stamper, int pa
我正在开发一个系统,我必须在其中将一些图像添加到现有的 PDF 文档中。 这适用于 iText 5.1.3,但由于某种原因,在包含扫描图像的 PDF 中,它不会添加任何图像。 这是 PDF Docum
我这里指的是下面的方法。(Link 了解更多详情) public void setEncryption(boolean strength, Stri
我有这个代码 protected void doPost(HttpServletRequest request, HttpServletResponse response) throws Servle
为什么 PdfStamper 会增加我每次使用的签名 pdf 的大小? 这是我的代码: private static void test(String src, String pwd, String
您好,我已经成功地使用 HTMLWorker 使用 asp.NET/C# 转换 gridview。 (1) 我已对生成的表格应用了一些有限的样式,但看不到如何应用表格样式(例如网格线)或应用其他格式样
我正在使用 PdfStamper 在运行时创建 PDF。我的问题是我无法增加 PDF 字段的字体大小。我已经试过了,但没有成功, stamper.AcroFields.SetFieldProperty
我可以使用 PDFStamper 和 PdfContentByte content.AddImage 方法将图像叠加到现有 PDF 文档上。 当现有文档顶部已覆盖图像时,我的问题就出现了。您实际上可以
我几乎(我认为)能够在不先保存的情况下使用 servlet 呈现 PDF。我已经能够成功设置它,但我一直坚持尝试在客户端浏览器中使用打印对话框打开 PDF。 我已经能够通过以下方式成功将我的 PDF
我正在使用 ITextSharp 将多页 PDF 文件拆分为单页文件。我还设法使用 MemoryStream 将这些单页 PDF 添加到 zip 文件中。 现在,我需要使用 PdfStamper 为这
这是我第一次使用 iText5 for .NET,到目前为止,除了一项任务外,一切都相当成功。 我创建了两个 VB.Net 类,每个类都成功返回一个有效的 MemoryStream,其中包含一个单页
我正在使用 iTextSharp 加载现有 PDF 并使用 PdfStamper 添加文本。我想要完全控制文本,这意味着我想要能够控制字体(仅 TrueType)、字体大小和坐标。现在,我正在使用 S
我正在尝试在我的应用程序中使用 iText 2.1.7。我将问题确定为以下代码: InputStream inputFile = ... OutputStream outputStream = ...
我是一名优秀的程序员,十分优秀!