使用 iTextSharp 将数据写入 PDF 效果很好,但 Acrobat Reader 在关闭文件时会询问'Do you want to save changes'



我使用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;
}

我的结论是,在打开PDF并将字节写入流的过程中,iTextSharp对PDF做了一些"不好"的事情,但我对iTextSharm是新手,很容易会错过一些东西。

FWIW,这是我们谈论的Acobat阅读器10.1.4。

编辑:用作模板的原始PDF大小约为80K。如果我查看通过浏览器流式传输的临时文件,iTextSharp编写的PDF文件大约为150K。但是,当我对Acrobat Reader提出的"保存更改"问题回答"是"时,得到的文件又大约是80K。iTextSharp肯定对这个文件做了一些意想不到的事情。

非工作:

public byte[] MergeDataByDrawing(int copies)
{
PdfReader pdfReader = new PdfReader(reportTemplate);
using (MemoryStream outputStream = new MemoryStream())
using (PdfStamper pdfStamper = new PdfStamper(pdfReader, outputStream))
{
pdfStamper.FormFlattening = true;
return outputStream.GetBuffer();
}
} 

工作:

public byte[] MergeDataByDrawing(int copies)
{
PdfReader pdfReader = new PdfReader(reportTemplate);
using (MemoryStream outputStream = new MemoryStream())
using (PdfStamper pdfStamper = new PdfStamper(pdfReader, outputStream))
{
pdfStamper.FormFlattening = true;
return outputStream.ToArray();
}
}

GetBuffer方法似乎有问题。我不明白为什么,但我会接受结果!

支持MKL给我一个想法,支持Fredrik在正确的时间做出正确的榜样。

请参阅http://itextpdf.com/history/?branch=52&节点=521

修复AcroForms错误:在某些情况下,Adobe Reader X会询问您是否愿意关闭展开的PDF表单后"保存更改"。这是由于/ArcoForm字典中存在一些不必要的条目(用于使用OOo创建表单时添加的实例)。

我是修复此错误的Bruno。我记得它发生在Adobe Reader 10中,但没有出现在Adobe Reader 9中。我之所以能够修复这个错误,是因为报告这个错误的人是一位客户,他给我发了一份显示这种行为的PDF。

如果你想分享你的PDF,我们可以看看应该从/AcroForm字典中删除哪些其他条目。我只删除了使用Open Office创建表单时添加的那些内容。如果你不想分享PDF,原因将永远是个谜。

最新更新