itextsharp - 当 PdfStamper 处于附加模式时无法设置复选框

itextsharp - Cant Set Checkbox when PdfStamper in Append Mode

我想在 pdf 中设置一些字段,但将它们打开以在填充后进行修改。我的问题是,当我在附加模式下编辑 pdf 时,未设置复选框。文本字段工作正常。

string pdfTemplate = @"c:\test\fw4.pdf";
string newFile = @"c:\test\completed_fw4.pdf";
PdfReader pdfReader = new PdfReader(pdfTemplate);
//PdfStamper pdfStamper = new PdfStamper(pdfReader, new System.IO.FileStream(newFile, System.IO.FileMode.Create), '[=10=]', true); //doesn't set field - leaves editable
PdfStamper pdfStamper = new PdfStamper(pdfReader, new System.IO.FileStream(newFile, System.IO.FileMode.Create)); //sets field - leaves locked
AcroFields pdfFormFields = pdfStamper.AcroFields;
pdfFormFields.SetField("topmostSubform[0].Page1[0].c1_01[1]", "2");
pdfStamper.Close();

有问题的 PDF 表单是一个混合 AcroForm/XFA 表单。 iText(Sharp) 5 对 XFA 表单的支持有限,看起来它无法在 XFA 表单表示中处理有问题的复选框,但它可以在 AcroForm 表示中处理它。

这解释了观察结果:

  • 一方面

    PdfStamper pdfStamper = new PdfStamper(pdfReader, new System.IO.FileStream(newFile, System.IO.FileMode.Create), '[=10=]', true);
    //doesn't set field - leaves editable
    

    您在追加模式下工作,因此使用权签名仍然有效并且 PDF 保持 Reader 启用。因此,Adobe Reader 显示 XFA 表单并允许编辑。由于 iText 未正确更新 XFA 表单,因此未选中此框。

  • 另一方面

    PdfStamper pdfStamper = new PdfStamper(pdfReader, new System.IO.FileStream(newFile, System.IO.FileMode.Create));
    //sets field - leaves locked
    

    您没有在追加模式下工作,因此使用权签名无效并且 Reader 启用被破坏,在这种情况下 Adob​​e Reader 的功能甚至比没有使用权还要少signature/Reader 启用。因此,Reader 只显示 AcroForm,不允许编辑。但是由于 iText 确实正确地更新了 AcroForm 表单,因此选中了该框。

在这种情况下,您可以使用 iText(Sharp) 5 做的最好的事情是删除 XFA 表单和使用权限签名。这为您留下了纯 AcroForm 表单,并且不受无效使用权签名的限制:

using (PdfReader reader = new PdfReader(@"fw4.pdf"))
using (FileStream stream = new FileStream(@"fw4-SetCheckBox.pdf", FileMode.Create))
using (PdfStamper stamper = new PdfStamper(reader, stream))
{
    reader.Catalog.Remove(PdfName.PERMS);
    reader.Catalog.GetAsDict(PdfName.ACROFORM).Remove(PdfName.XFA);
    AcroFields pdfFormFields = stamper.AcroFields;
    pdfFormFields.SetField("topmostSubform[0].Page1[0].c1_01[1]", "2");
}