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

时间:2012-08-14 11:51:51

标签: java pdf itext

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

Form i有多个具有相同字段名称的字段。 如果PDF表单字段名称很常见,则Concept将填充相同的值。

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

我的问题基本上是

  1. Itext是否支持这种功能?
  2. 如果可能,那我们该如何做呢。
  3. 我使用以下代码尝试相同的操作:

    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");
    

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

    请帮忙

4 个答案:

答案 0 :(得分:1)

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

但你必须区分(技术上):那些形式场有一个“数据”表示和几个小部件(几个可视化表示)。因此,您只需要将一个字段(其小部件的几个坐标)填入特定值:

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

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

答案 1 :(得分:0)

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

贝娄代码会帮助你..

 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..

            }


        }

答案 2 :(得分:-1)

PDF表单不支持具有相同名称的2个字段。要求无效

答案 3 :(得分:-1)

实际上,只要字段位于不同的页面上,就可以在一个唯一的pdf表单中包含多个具有相同名称的字段。 我正在寻找解决这个问题的方法......