4

代码:

using (FileStream pdf = new FileStream("C:/test.pdf", FileMode.Open))
using (FileStream xml = new FileStream("C:/test.xml", FileMode.Open))
using (FileStream filledPdf = new FileStream("C:/test_f.pdf", FileMode.Create))
{
   PdfReader.unethicalreading = true;
   PdfReader pdfReader = new PdfReader(pdf);
   PdfStamper stamper = new PdfStamper(pdfReader, filledPdf);

   stamper.AcroFields.Xfa.FillXfaForm(xml);
   stamper.Close();
   pdfReader.Close();
}

这段代码没有抛出异常,一切似乎都很好,但如果我打开填充的 pdf,Adobe Reader 会这样说:

本文档启用了扩展功能。此文档自创建以来已更改,并且无法再使用扩展功能。

某些字段已正确填写,但我无法对其进行编辑。有些字段是空的。如果我通过单击 Adob​​e Reader 中的“导入数据”手动选择 xml,则表格已正确填写,所以我猜 xml 中没有错误。

4

1 回答 1

5

您没有PdfStamper正确创建对象。利用:

PdfStamper stamper = new PdfStamper(pdfReader, filledPdf, '\0', true)

在您的代码中,您没有使用PdfStamper附加模式。这意味着 iText 将重新组织 PDF 中的不同对象。通常这不是问题。

但是:您的 PDF 启用了阅读器,这意味着您的 PDF 使用 Adob​​e 拥有的私钥进行了数字签名。通过重新组织 PDF 中的对象,该签名被破坏。您已经提到的消息清楚地表明了这一点:

本文档启用了扩展功能。此文档自创建以来已更改,并且无法再使用扩展功能。

您以一种不允许的方式更改了文档(请参阅我的“保留启用阅读器的表单的使用权限”的第 8.7 节)。

为避免破坏签名,您需要PdfStamper在附加模式下使用。iText 现在不会重新组织原始内容,而是保持原始文件完整,并在原始文件结束后追加新内容。

于 2014-10-29T11:49:57.340 回答