使用iTextSharp将数据写入PDF效果很好,但Acrobat Reader在关闭文件时询问“是否要保存更改”

时间:2012-09-24 16:51:33

标签: c# pdf-generation itextsharp

我正在使用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做了一些“坏事”,但我是iTextSharp的新手并且很容易丢失一些东西。

FWIW,这是我们正在谈论的Acobat Reader 10.1.4。

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

2 个答案:

答案 0 :(得分:15)

非工作:

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方法存在问题。我不明白为什么,但我会接受结果!

Props to MKL for giving me an ideaFredrik for the right example at the right time

答案 1 :(得分:1)

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

  

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

我是解决这个错误的布鲁诺。我记得它发生在Adobe Reader 10中,但不是在Adobe Reader 9中。我能够修复该错误,因为报告它的人是向我发送显示此行为的PDF的客户。

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