使用 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 个副本,CopyA
,CopyB
,CopyC
、CopyD
和 CopyE
。我找到的只有这个:
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();
请阅读我对以下问题的回答以获取更多信息:
如果您只有时间阅读上面列表中的一个问答,请选择列表中的最后一个。
我正在构建一个可以自动写入 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 个副本,CopyA
,CopyB
,CopyC
、CopyD
和 CopyE
。我找到的只有这个:
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();
请阅读我对以下问题的回答以获取更多信息:
如果您只有时间阅读上面列表中的一个问答,请选择列表中的最后一个。