iText7 - 构建 AcroForm 字段层次结构的正确方法
iText7 - correct way to build an AcroForm field hierarchy
iText 7.0.0
有没有办法在不直接操作字段字典的情况下在 iText7 中构建字段层次结构?虽然 PdfFormField 有 setParent / addKid 方法,但我还没有找到 AcroForm.addField 和 setParent/addKid 的正确 combination/sequence 可以产生(希望这种语法有意义):
/Fields [(
/T root 1 0 ("empty" field)
/Kids [(
/T child 2 0 ("empty" field)
/Parent 1 0
/Kids [(
/T text1 (text widget)
/FT Txt
/Type /Annot
/Subtype /Widget
/Parent 2 0
)]
)]
)]
即名为 root.child.text1
的字段
我最接近的(不适用于某些 indirectRef 场景)是
PdfFormField root = PdfFormField.createEmptyField(doc);
root.setFieldName("root");
form.addField(root, null);
PdfFormField child = PdfFormField.createEmptyField(doc);
child.setFieldName("child");
form.addField(child, null);
root.addKid(child);
PdfTextFormField text1 = PdfFormField.createText(doc, new Rectangle(100, 700, 200, 20), "text1", "");
// any rendered field needs to be added to the form BEFORE parent
// is set, otherwise an exception is thrown in processKids()
form.addField(text1);
child.addKid(text1);
// cleanup the Fields dict
PdfArray rootFields = form.getPdfObject().getAsArray(PdfName.Fields);
rootFields.remove(text1.getPdfObject());
rootFields.remove(child.getPdfObject());
尝试按以下方式接近。这段代码对我有用,至少在当前的 7.0.1-SNAPSHOT 版本中是这样,因此它将在几周后的 7.0.1 中工作。
您不必直接将每个字段添加到表单中。根据规范,只有根字段,即没有祖先的字段,必须添加到表单中。他们的后代会被自动考虑在内。
PdfFormField root = PdfFormField.createEmptyField(pdfDoc);
root.setFieldName("root");
PdfFormField child = PdfFormField.createEmptyField(pdfDoc);
child.setFieldName("child");
root.addKid(child);
PdfTextFormField text1 = PdfFormField.createText(pdfDoc, new Rectangle(100, 700, 200, 20), "text1", "test");
child.addKid(text1);
form.addField(root);
iText 7.0.0
有没有办法在不直接操作字段字典的情况下在 iText7 中构建字段层次结构?虽然 PdfFormField 有 setParent / addKid 方法,但我还没有找到 AcroForm.addField 和 setParent/addKid 的正确 combination/sequence 可以产生(希望这种语法有意义):
/Fields [(
/T root 1 0 ("empty" field)
/Kids [(
/T child 2 0 ("empty" field)
/Parent 1 0
/Kids [(
/T text1 (text widget)
/FT Txt
/Type /Annot
/Subtype /Widget
/Parent 2 0
)]
)]
)]
即名为 root.child.text1
我最接近的(不适用于某些 indirectRef 场景)是
PdfFormField root = PdfFormField.createEmptyField(doc);
root.setFieldName("root");
form.addField(root, null);
PdfFormField child = PdfFormField.createEmptyField(doc);
child.setFieldName("child");
form.addField(child, null);
root.addKid(child);
PdfTextFormField text1 = PdfFormField.createText(doc, new Rectangle(100, 700, 200, 20), "text1", "");
// any rendered field needs to be added to the form BEFORE parent
// is set, otherwise an exception is thrown in processKids()
form.addField(text1);
child.addKid(text1);
// cleanup the Fields dict
PdfArray rootFields = form.getPdfObject().getAsArray(PdfName.Fields);
rootFields.remove(text1.getPdfObject());
rootFields.remove(child.getPdfObject());
尝试按以下方式接近。这段代码对我有用,至少在当前的 7.0.1-SNAPSHOT 版本中是这样,因此它将在几周后的 7.0.1 中工作。
您不必直接将每个字段添加到表单中。根据规范,只有根字段,即没有祖先的字段,必须添加到表单中。他们的后代会被自动考虑在内。
PdfFormField root = PdfFormField.createEmptyField(pdfDoc);
root.setFieldName("root");
PdfFormField child = PdfFormField.createEmptyField(pdfDoc);
child.setFieldName("child");
root.addKid(child);
PdfTextFormField text1 = PdfFormField.createText(pdfDoc, new Rectangle(100, 700, 200, 20), "text1", "test");
child.addKid(text1);
form.addField(root);