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

Itext使用多个具有相同字段名的字段更新PDF表单

孔经武
2023-03-14

我有一个要求,我必须使用Itext在PDF表单中填充值。

表单i具有多个具有相同字段名的字段。概念是在PDF表单字段名称通用的情况下填充相同的值。

因此,如果有两个或更多名为txtSysTime的字段,那么代码应该在所有字段中填充系统时间。

我的问题基本上是

  1. Itext是否支持这种功能?
  2. 如果可能的话,我们怎么能做同样的事情呢

我正在使用以下代码进行相同的尝试:

PdfReader pdfTemplate = new PdfReader(inputFilePath);
FileOutputStream fileOutputStream = new FileOutputStream(outputFilePath);
ByteArrayOutputStream out = new ByteArrayOutputStream();
PdfStamper stamper = new PdfStamper(pdfTemplate, fileOutputStream);
stamper.setFormFlattening(true);
stamper.getAcroFields().setField("TextBox", "value filled");

使用此代码,第一个同名字段中的值将被正确填充,但其余部分留空。

请帮忙

共有3个答案

华易安
2023-03-14

实际上,只要字段位于单独的页面上,就可以在一个纯pdf表单中包含多个同名字段。我目前正在寻找解决这个问题的方法。。。

翟高明
2023-03-14

itext正在使用widget注释,用于具有相同名称的多个字段。对于重复字段,名称将是一个,但坐标将是多个。

下面的代码将帮助您。。

 InputStream pdfFileStream = new FileInputStream(file);
        PdfReader reader = new PdfReader(pdfFileStream);
        PdfStamper stamper = null;

        try {
            stamper = new PdfStamper(reader, tempOS, '\0');

        } catch (DocumentException e1) {
            e1.printStackTrace();
        }


        AcroFields form = stamper.getAcroFields();
        Object[] keys = form.getFields().keySet().toArray();

        for (Entry<String, AcroFields.Item> entry : fields.entrySet()) {

        String docFieldName = entry.getKey();
            List<FieldPosition> fieldPosition = form.getFieldPositions(docFieldName); // for multiple filed with same name  size and co ordinate  will more then 1..
            for(int i=0;i<fieldPosition.size();i++) {
            Rectangle position = fieldPosition.get(i).position;
            float left = position.getLeft();
            float top = position.getTop();
            float width = position.getWidth();
            float height = position.getHeight();
            int currentPage = fieldPosition.get(i).page;
            ........................here you can set value to list..

            }


        }
刘意
2023-03-14

您可能想做的是使用pdf表单字段的“自动填充”功能?因此,您填写一个字段,所有其他字段都会自动使用相同的内容填写该字段名。这是完全可能的。(您可能在adobe reader/acrobat中尝试过)

但是你必须区分(技术上):这些表单域有一个“数据”表示和几个小部件(几个视觉表示)。因此,你只需要用一个特定的值填充那个字段(它的小部件有几个坐标):

boolean successful = stamper.getAcroFields().setField("TextBox", "some value");

如果随后在PDF查看器软件(如adobe reader)中打开该PDF,则所有字段都具有相同的内容。出于好奇,为什么要使用setFormFlatting(true)展平字段?然后,所有字段都将被删除并展平。

 类似资料:
  • 我使用Adobe acrobat reader编辑PDF,在我看到的地方,每个字段都有一个position属性,表示PDF字段在表单中的位置。 所以我的问题是,我能读到那个值吗? 现在我用下面的代码检索表单字段:

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

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

  • 如何生成多个页面的pdf报告,每个页面上的内容相同。以下是单页报告的代码。多个页面应位于单个pdf文件中。

  • 我使用的是,我需要展平包含同名字段的文档。 我创建的文档如下所示: 在那之后,我试图像下面这样压平文档: 我的主要方法是: 展平后,我得到的文档包含一个展平字段,但我必须得到两个展平字段。 如何解决此问题?

  • 我有从2个表中检索2个对象(由JooQ生成的POJO)的一条记录的代码。 表ISSUE和表CLIENT都有PK字段“ID”。 问题是当映射到(POJO.class)时,具有相同名称的表字段没有正确映射到POJO。在上面的示例中,jIssue获取jClient的id。 当使用TableRecords而不是POJO的所有映射都正确完成时,但您不能在生成的DAO中使用TableRecords,它需要生成