使用 iText 扫描 1042-S 2015 PDF 文件时出现问题

Problems scanning the 1042-S 2015 PDF file with iText

我正在构建一个可以自动写入 PDF 文件的程序。我正在使用库 iText 来做。

好吧,为了检查字段的名称,我 运行 这个小代码:

public static void main(String[] args) throws IOException {

    PdfReader reader = new PdfReader(PDF_PATH);

    AcroFields fields = reader.getAcroFields();

    Set<String> fldNames = fields.getFields().keySet(); 


    for (String fldName : fldNames) {
      System.out.println( fldName + ": " + fields.getField(fldName));
    }
}

输出类似于:

topmostSubform[0].CopyA[0].Group12-13[0].Line13d-g[0].Line13e[0]: 13e topmostSubform[0].CopyB[0].Group1-11[0].Line3[0].Line3[0]: 0 topmostSubform[0].CopyE[0].Group1-11[0].Line7[0]: 7 topmostSubform[0].CopyD[0].Group14-24[0].Line16[0].Line15i[0]: 15i

topmostSubform[0].CopyE[0].Group1-11[0].Line7[0] 是我要查找的值,: 之后的值是我放入原始 PDF 中以跟踪每个字段的变量名称的值。

到目前为止一切顺利,但我在 1 个特定字段上遇到问题。字段编号 16。我输入值 16 来跟踪,但在我的输出中只有 1 个 16 输出,但它应该有 5 个副本,CopyACopyBCopyCCopyDCopyE。我找到的只有这个:

topmostSubform[0].CopyA[0].Group14-24[0].Line16[0] 并且当我尝试使用此代码在此字段中写入时:

form.setField("topmostSubform[0].CopyA[0].Group14-24[0].Line16[0]", "BLA BLA BLA"); 不行。显然 16 字段发生了一些奇怪的事情。

PDF 下载地址:https://www.irs.gov/pub/irs-prior/f1042s--2015.pdf

谢谢。

该表单是一个 混合 XFA 表单(或者,我喜欢称这种表单为可憎)。在混合 XFA 表单 中,表单的字段被描述了两次,一次使用 PDF 语法(纯 AcroForm 技术),一次使用 XML(XML 表单架构,又名 XFA)。

这是有问题的,因为:

  • AcroForm 功能中的表单功能与 XML 表单架构之间存在差异。
  • 总是存在 PDF 语法中描述的形式与 XML 语法中的形式不对应的风险。

这就是为什么我总是抛弃 XML 语法的原因。请参阅 FillHybridForm 示例:

public void manipulatePdf(String src, String dest) throws DocumentException, IOException {
    PdfReader reader = new PdfReader(src);
    PdfStamper stamper = new PdfStamper(reader, new FileOutputStream(dest));
    AcroFields form = stamper.getAcroFields();
    form.removeXfa();
    form.setField("topmostSubform[0].CopyA[0].Group14-24[0].Line16[0]", "16");
    stamper.close();
    reader.close();
}

您的代码中可能没有这一行:

form.removeXfa();

请阅读我对以下问题的回答以获取更多信息:

如果您只有时间阅读上面列表中的一个问答,请选择列表中的最后一个。