我正在使用 iTextSharp 5.3.2.0 将信息添加到包含 W-2 表单的现有 PDF 文件中。一切正常,PDF 文件在写入浏览器的响应流时看起来很棒;但是,当用户查看完 PDF 后,系统会询问他“是否要在关闭前保存对 'W2.pdf' 的更改?” 每次他从网页查看文档时。
在试图缩小问题范围时,我实际上已经删除了所有修改,但问题仍然存在。这是我的代码的简单版本,我的数据写入调用被注释掉了:
PdfReader pdfReader = new PdfReader(dataSource.ReportTemplate);
using(MemoryStream outputStream = new MemoryStream())
using (PdfStamper pdfStamper = new PdfStamper(pdfReader, outputStream))
{
//dataSource.DrawDataFields(pdfStamper);
pdfStamper.FormFlattening = true;
return outputStream;
}
在这种情况下,“空”PDF 被写入浏览器并且看起来不错,但是当我关闭 Acrobat 窗口时,仍然会被问到“是否要保存”。
在这一点上,我认为源 PDF 文件有问题。但是,当我将 PDF 文件的原始字节发送回浏览器时,在使用下面的代码时,不会询问我“是否要保存”的问题。
byte[] bytes = File.ReadAllBytes(dataSource.ReportTemplate);
using (MemoryStream outputStream = new MemoryStream())
{
outputStream.Write(bytes, 0, bytes.Length);
return outputStream;
}
我的结论是 iTextSharp 在打开 PDF 并将字节写入流的过程中对 PDF 做了一些“坏事”,但我是 iTextSharp 的新手,很容易遗漏一些东西。
FWIW,这是我们正在谈论的 Acobat Reader 10.1.4。
编辑:用作模板的原始 PDF 大小约为 80K。如果我查看通过浏览器向下传输的临时文件,iTextSharp 编写的 PDF 文件大约为 150K。但是,当我对 Acrobat Reader 提出的“保存更改”问题回答“是”时,生成的文件再次约为 80K。iTextSharp 肯定对这个文件做了一些意想不到的事情。