当前位置: 首页 > 知识库问答 >
问题:

如何平整具有相同名称的字段

邵昆琦
2023-03-14

我使用的是itext 7.1.8,我需要展平包含同名字段的文档。
我创建的文档如下所示:

private static PdfDocument createPdfDocument(final String name, final int countFields) {
        PdfDocument pdf;
        try {
            final FileOutputStream os = new FileOutputStream(name + ".pdf");
            PdfWriter pdfWriter = new PdfWriter(os);
            pdf = new PdfDocument(pdfWriter);


            final PdfPage pdfPage = pdf.addNewPage();

            final float height = pdfPage.getCropBox().getHeight();

            final PdfTextFormField txt1Fld = PdfFormField.createText(pdf, new Rectangle( 100, height - 100, 200, 18), "Text_1");
            txt1Fld.setValue("Hello");

            for (int i = 0; i < countFields; i++) {
                PdfAcroForm.getAcroForm(pdf, true)
                        .addField(txt1Fld, i == 0 ? pdfPage : pdf.addNewPage());
            }

            pdf.close();
        } catch (Exception e) {
            e.printStackTrace();
            pdf = null;
        }
        return pdf;
    }

在那之后,我试图像下面这样压平文档:

private static void flattenPdf(String name, String flattenName) {
        try {
            OutputStream os = new FileOutputStream(flattenName + ".pdf");
            InputStream is = new FileInputStream(name + ".pdf");
            PdfReader reader = new PdfReader(is);
            PdfWriter writer = new PdfWriter(os);
            final PdfDocument pdfDocument = new PdfDocument(reader, writer);
            final PdfAcroForm acroForm = PdfAcroForm.getAcroForm(pdfDocument, true);
            acroForm.setNeedAppearances(true);
            acroForm.flattenFields();
            pdfDocument.close();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

我的主要方法是:

public static void main(String[] args) throws IOException {
    final String flattenName = "ItextPdfTwoFields";

    System.out.println("Create " + flattenName + ".pdf");
    createPdfDocument(flattenName, 2);
    System.out.println(flattenName + ".pdf created successfully");
    System.out.println("Trying to flat " + flattenName + "_flatten.pdf...");
    flattenPdf(flattenName, flattenName + "_flatten");
}

展平后,我得到的文档包含一个展平字段,但我必须得到两个展平字段。
如何解决此问题?

共有1个答案

翟高明
2023-03-14

首先,我绝对推荐使用最新版本7.1.12。不过,仅仅使用该版本是不够的,您需要编写一些额外的代码来创建具有多个小部件的表单字段,即跨多个字段表示共享值。扁平化的代码很好,我们只需要修改代码来创建一个文档,因为在您当前的代码中,相同的字段被添加到两个页面中,并且小部件注释和页面之间的关联不一致。而不是此代码:

final PdfTextFormField txt1Fld = PdfFormField.createText(pdf, new Rectangle( 100, height - 100, 200, 18), "Text_1");
txt1Fld.setValue("Hello");

for (int i = 0; i < countFields; i++) {
    PdfAcroForm.getAcroForm(pdf, true)
            .addField(txt1Fld, i == 0 ? pdfPage : pdf.addNewPage());
}

我们只需要创建一个字段一次,然后将小部件添加到剩余页面的字段中(第一个页面除外),并将页面与小部件关联(将小部件注释添加到相应页面)。最后,我们将该值设置为为所有小部件注释生成外观的字段,并将该字段添加到表单中。代码如下:

Rectangle rect = new Rectangle( 100, height - 100, 200, 18);
final PdfTextFormField txt1Fld = PdfFormField.createText(pdf, rect, "Text_1");

for (int i = 1; i < countFields; i++) {
    PdfWidgetAnnotation annotation = new PdfWidgetAnnotation(rect);
    annotation.makeIndirect(pdf);
    txt1Fld.addKid(annotation);
}

for (int i = 0; i < countFields; i++) {
    if (pdf.getNumberOfPages() <= i) {
        pdf.addNewPage();
    }
    pdf.getPage(i + 1).addAnnotation(txt1Fld.getWidgets().get(i));
}

txt1Fld.setValue("Hello");

PdfAcroForm.getAcroForm(pdf, true).addField(txt1Fld, pdfPage);
 类似资料:
  • 我有一个PDF文件,其中包含一个表单,其中的字段具有相同的字段名。这是为了共享文档中的数据而做的。例如,我有合同,此文档的每一页都必须有公司名称,我将公司名称写在一个表单字段中,并将其复制到当前文档的所有页面,但是当我尝试使用库阅读此文档时,我没有得到此数据,因为只创建一个字段名为的字段,而另一个字段名为clean。 如何使用库读取具有相同字段名称的字段?

  • 我正在探索GraphQL,想知道是否有任何重命名响应字段的方法,例如我有一个POJO与这些字段 GraphQL查询: 我的回答是这样的 我是否可以将名称字段重命名为类似用户名的名称,以便我的回答如下

  • 问题内容: 考虑以下代码 如果名称重叠,如何访问外部类的字段? 我尝试了以下方法: 并收到编译错误。 现实生活中会不会发生这种情况? 问题答案: 最好的解决方案是为字段赋予有意义的名称和不同的名称。但这并不总是可能的… 要获取字段或外部实例,您可以使用 或者该字段是静态的 注意:通常是缩写(取决于实际定义的位置) 同样,您需要调用外部类的实例方法。 要么 注意:在Java 8中,您有可能是基于实例

  • 问题内容: 如果您有一个包含带有重复属性的文本输入的表单,并且该表单已经过帐,那么您仍然能够从PHP数组中获取所有字段的值吗? 问题答案: 否。仅最后一个输入元素可用。 如果要使用相同名称的多个输入,请使用输入名称属性。然后将包含foo的数组,其中包含来自输​​入元素的所有值。 如果不使用则仅包含最后一个值的原因是因为PHP基本上只会爆炸并遍历要填充的原始查询字符串。当遇到已经存在的名称/值对时,

  • 问题内容: 我是Swift的新手,我已经遍历了一些教程,其中许多教程使用同一个名称多次定义了一个函数。 我已经习惯了其他编程语言,否则将无法执行此操作。 因此,我检查了官方的Swift手册,还检查了override关键字,以了解可以得到的结果,但是仍然无法理解以下代码: 从我看到的函数tableView设置在第1行和第5行,我注意到的唯一区别是第一个tableView函数返回,而第二个函数返回(U

  • 问题内容: 我正在尝试在一个项目中使用KárolyLőrentey的B树。但是,我遇到了一个问题,即我不能声明不合格,因为该名称在Foundation的(如在Swift 3中导入的)和的之间发生冲突。 要解决此冲突,通常可以使用该名称,然后使用即可。但是,该模块还包含一个名为的类。如果我写的话,Swift认为我指的是嵌套在该类型中的名为type的类型。 如果不这样做,我将根本无法使用该名称。 如何