0

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

我拥有的表单有多个具有相同字段名称的字段。概念是在 PDF 表单字段名称常见的情况下填充相同的值。

因此,如果有 2 个或多个名称为 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");

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

请帮忙

4

4 回答 4

1

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

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

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

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

于 2013-08-23T08:25:03.840 回答
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..

            }


        }
于 2017-07-04T09:50:31.757 回答
-1

实际上,只要这些字段位于不同的页面上,您就可以在一个 PDF 表单中拥有多个具有相同名称的字段。我目前正在寻找解决此问题的方法...

于 2013-06-10T13:30:04.700 回答
-2

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

于 2012-11-12T07:21:28.007 回答