我有一个应用程序,我正在使用 iTextSharp 填充 pdf 表单。
/// <summary>
/// Imports XFA Data into a new PDF file.
/// </summary>
/// <param name="pdfTemplate">A PDF File with an unpopulated form.</param>
/// <param name="xmlFormData">XFA form data in XML format.</param>
/// <returns>a memorystream containing the new PDF file.</returns>
public static void XFAImport(System.IO.Stream pdfTemplate, System.IO.Stream xmlFormData, System.IO.Stream outputStream)
{
using (iTextSharp.text.pdf.PdfReader reader = new iTextSharp.text.pdf.PdfReader(pdfTemplate))
{
using (iTextSharp.text.pdf.PdfStamper stamper = new iTextSharp.text.pdf.PdfStamper(reader, outputStream))
{
stamper.Writer.CloseStream = false;
stamper.AcroFields.Xfa.FillXfaForm(xmlFormData);
}
}
}
上述代码采用未填写的 pdf 表单和 xml 数据写入 outputStream,然后将其保存到文件中。
当您在 Adobe 中打开文件时,您会看到正确填写的表单数据。但是,如果您随后从 Acrobat XI 保存该文件,然后重新打开它,则您导入的数据将不再可见。
我不认为问题出在我正在导入的 XML 上,因为如果我不使用 iTextShart,而是使用 Acrobat XI 的“工具/表单/更多表单选项/导入数据”。生成的文件能够正确保存和重新打开。
我的问题是:
我在上面正确使用了 PdfStamper 吗?
我可以采取任何步骤来正确保存生成的文件吗?
PS。我注意到,在使用 Acrobat XI 重新保存输出 pdf 文件后,生成的文件与原始文件基本相同,但在末尾插入了额外的 11k 数据。
输出pdf文件的结尾:
trailer
<</Size 51/Root 14 0 R/Info 3 0 R/ID [<56549fdaf0c5ab4e9321d77f406e6455><5b60738018e0cdac94c6d1b924fc8bed>]>>
%iText-5.4.4
startxref
529008
%%EOF
在 Acrobat XI 中保存后,会添加更多数据:
trailer
<</Size 51/Root 14 0 R/Info 3 0 R/ID [<56549fdaf0c5ab4e9321d77f406e6455> <5b60738018e0cdac94c6d1b924fc8bed>]>>
%iText-5.4.4
startxref
529008
%%EOF
3 0 obj
<</CreationDate(D:20100120124725-05'00')/Creator(Adobe LiveCycle Designer ES 8.2)/ModDate(D:20140221145558-06'00')/Producer(Adobe LiveCycle Designer ES 8.2; modified using iTextSharp’ 5.4.4 ©2000-2013 1T3XT BVBA \(AGPL-version\))>>
endobj
4 0 obj
<</Length 3261/Subtype/XML/Type/Metadata>>stream
<?xpacket begin="" id="W5M0MpCehiHzreSzNTczkc9d"?>
/*more data excluded*/