从现有模板创建新PDF - Acrobat XI中的奇怪行为

时间:2013-11-21 16:48:58

标签: c# .net pdf itextsharp

我正在从LibreOffice中创建的现有模板生成新的PDF。它包含一个文本框。

代码编译并成功将PDF保存到新文件后,如果我在Acrobat Reader XI中打开新创建的文档,它会正确呈现,但即使我没有修改最终文档,也会在关闭文档后,它询问“你想在关闭之前将更改保存到”filename.pdf“吗?”

我已经阅读了StackOverflow及其官方网站(iTextSharp)上的其他帖子,并找到了一个解决方案,也许我正在以错误的方式实施。

    public string spdftemplate = @"C:\test\input.pdf";
    public string newFile = @"C:\test\output.pdf";

    private void FillFormsProperly()
    {

        PdfReader reader = new PdfReader(spdftemplate);
        byte[] bytes;
        using (MemoryStream ms = new MemoryStream())
        {
            PdfStamper stamper = new PdfStamper(reader, ms);

            #region ForTesting
            //PdfContentByte cb = stamper.GetOverContent(1);
            //ColumnText ct = new ColumnText(cb);
            //ct.SetSimpleColumn(100, 100, 500, 200);
            //ct.AddElement(new Paragraph("This was added using ColumnText"));
            //ct.Go();
            #endregion ForTesting

            AcroFields pdfFormFields = stamper.AcroFields;

            foreach (DictionaryEntry de in reader.AcroFields.Fields)
            {
                pdfFormFields.SetField(de.Key.ToString(), "test"); //"Text Box 1"
            }

            //string sTmp = "W-4 Completed for " + pdfFormFields.GetField("Text Box 1");
            //MessageBox.Show(sTmp, "Finished");

            //Flush the PdfStamper's buffer
            stamper.FormFlattening = true;
            stamper.Close();
            //Get the raw bytes of the PDF
            bytes = ms.ToArray();

        }

        //Do whatever you want with the bytes
        //Below I'm writing them to disk 
        using (FileStream fs = new FileStream(newFile, FileMode.Create, FileAccess.Write, FileShare.None))
        {
            fs.Write(bytes, 0, bytes.Length);
        }
    }

我找到的最佳答案是:creating a pdf from a template in itextsharp and outputting as content disposition.

上面的代码是我的(复制粘贴或多或少)实现。

很明显该文件已损坏(但仍然可读),我该如何解决?

1 个答案:

答案 0 :(得分:1)

您的input.pdf包含表单字段和标记/NeedAppearances true。你的output.pdf不再包含一个字段了(显然......毕竟你把表格弄平了)但它仍然包含那个标志/NeedAppearances true

此标志告诉PDF查看器(Acrobat Reader)为某些表单域生成外观流。因此,Reader会检查所有字段,以便在必要时创建外观。之后它删除了标志。因此,文件随后被更改;即使没有字段,至少删除标志也是一种变化。

这让人想起去年2月在iText中修复的iText问题:

  

在某些情况下,Adobe Reader X会询问您是否要保存更改"关闭一个扁平的PDF表格后。这是因为/ AcroForm字典中存在一些不必要的条目(例如在使用OOo创建表单时添加)。

     

(iText Revision 5089,2012年2月29日,blowagie)

此更改已于2012年3月3日iTextSharp修订版323移植到iTextSharp,psoares33。

因此,您可能希望更新您使用的iTextSharp版本。