6

我正在使用 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 肯定对这个文件做了一些意想不到的事情。

4

2 回答 2

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

支持 MKL 给我一个想法Fredrik 在正确的时间给出正确的例子

于 2012-09-25T19:07:37.227 回答
1

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

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

我是修复这个错误的布鲁诺。我记得它发生在 Adob​​e Reader 10 中,但不是在 Adob​​e Reader 9 中。我能够修复这个错误,因为报告它的人是一位客户,他向我发送了显示此行为的 PDF。

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

于 2012-09-25T16:00:36.923 回答