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

时间:2016-02-15 16:29:31

标签: java pdf 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个副本,CopyACopyB,{{ 1}},CopyCCopyD。我发现只有这个:

CopyE当我尝试使用此代码在此字段中写入时:

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

PDF可以在https://www.irs.gov/pub/irs-prior/f1042s--2015.pdf

下载

谢谢。

1 个答案:

答案 0 :(得分:2)

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

这是有问题的,因为:

  • AcroForm功能中的表单功能与XML Forms Architecture之间存在差异。
  • 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();

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

如果您只有时间阅读上面列表中的一个Q&amp; A,请选择列表中的最后一个。