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

时间:2017-09-13 14:49:20

标签: itext pdf-generation

我想在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), '\0', 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();

1 个答案:

答案 0 :(得分:0)

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

这解释了观察结果:

  • 一方面

    PdfStamper pdfStamper = new PdfStamper(pdfReader, new System.IO.FileStream(newFile, System.IO.FileMode.Create), '\0', 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
    

    您无法在附加模式下工作,因此使用权限签名无效并且读取器启用被破坏,这是Adobe Reader具有更少功能的情况,因为没有使用权限签名/读取器启用。因此,Reader只显示AcroForm并且不允许编辑。但是当iText正确更新AcroForm表单时,会检查该框。

在这种情况下,使用iText(夏普)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");
}