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

Java Itext使用多个具有相同字段名的字段更新PDF表单,java,pdf,itext,Java,Pdf,Itext,我有一个要求,我必须使用Itext在PDF表单中填充值 我的表单中有多个字段具有相同的字段名。 其概念是在PDF表单字段名为公共名称的情况下填充相同的值 因此,如果有两个或更多名为txtSysTime的字段,那么代码应该在所有字段中填充系统时间 我的问题基本上是 Itext是否支持这种功能 如果可能的话,我们怎么能做同样的事情呢 我正在使用以下代码进行相同的尝试: PdfReader pdfTemplate = new PdfReader(inputFilePath); FileOutputSt

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

我的表单中有多个字段具有相同的字段名。 其概念是在PDF表单字段名为公共名称的情况下填充相同的值

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

我的问题基本上是

  • Itext是否支持这种功能
  • 如果可能的话,我们怎么能做同样的事情呢
  • 我正在使用以下代码进行相同的尝试:

    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");
    
    使用此代码,第一个字段中具有相同名称的值将正确填充,但其余字段保留为空


    请帮助

    PDF表单不支持两个同名字段。要求无效

    实际上,只要字段位于单独的页面上,您可以在一个pdf表单中使用多个同名字段。
    我目前正在寻找解决此问题的方法…

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

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

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

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

    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..
    
                }
    
    
            }
    
    InputStream PdfielStream=新文件InputStream(文件);
    PDF读卡器=新PDF读卡器(PDF流);
    PdfStamper压模=null;
    试一试{
    压模=新PdfStamper(读卡器,节拍,'\0');
    }捕获(文档异常e1){
    e1.printStackTrace();
    }
    AcroFields form=stamp.getAcroFields();
    Object[]keys=form.getFields().keySet().toArray();
    for(条目:fields.entrySet()){
    字符串docFieldName=entry.getKey();
    List fieldPosition=form.getFieldPositions(docFieldName);//对于具有相同名称大小和坐标的多个字段,将大于1。。
    
    对于(int i=0;ii)来说,这些字段必须位于不同的页面上是毫无意义的。这当然是错误的。参见第12.7.3.2节字段名称:不同的字段字典可能具有相同的完全限定字段名称……并且这里提到的情况并不是唯一的情况。