【问题标题】:Unable to Rename form field in PDF using iText Java无法使用 iText Java 重命名 PDF 中的表单域
【发布时间】:2016-09-27 10:21:21
【问题描述】:

我正在尝试使用 iText 库以新名称重命名现有字段。 但下面的代码没有帮助。

public static void testRenameFields() throws Exception{
    String SRC = "C:\\Citi\\esign\\pdfs\\SS_Application_fields.pdf";
    String DEST = "C:\\Citi\\esign\\pdfs\\abc.pdf";
   PdfReader reader = new PdfReader(SRC);
   PdfStamper stamper = new PdfStamper(reader, new FileOutputStream(DEST));
   AcroFields form = stamper.getAcroFields();
   System.out.println("FieldType : "+form.getFieldType("signers[0].firstName"));
   form.renameField("signers[0].firstName", "Firstname");
   System.out.println("FieldType : "+form.getFieldType("Firstname"));
   stamper.close();
   reader.close();

}

这个 sn-p 的输出是 FieldType : 4 FieldType : 0

即使我已重命名该字段,它也会为我提供现有字段的输出。并且新名称未附加到该字段。

注意:FieldType 0 - 字段不存在
FieldType 4 - 文本类型字段

任何人都知道使用 iText 重命名 PDF 中的字段的任何替代方法。

请指教!!

【问题讨论】:

  • 我刚刚找到原因,为什么它对我不起作用。我有 ”。” (点)在我的字段名中,似乎itext的renameField()方法不支持带有“。”的字段名(点)。我将点更改为“_”并且它起作用了。谢谢!!

标签: java pdf itext


【解决方案1】:

您尝试将“signers[0].firstName”重命名为“Firstname”。使用AcroFields.renameField 是不可能的,参见。它的 JavaDoc 文档:

/**
 * Renames a field. Only the last part of the name can be renamed. For example,
 * if the original field is "ab.cd.ef" only the "ef" part can be renamed.
 *
 * @param oldName the old field name
 * @param newName the new field name
 * @return <CODE>true</CODE> if the renaming was successful, <CODE>false</CODE>
 * otherwise
 */
public boolean renameField(String oldName, String newName)

因此,您可以将“signers[0].firstName”重命名为“signers[0].reallyFirstName”,但最后的名称为“.”。需要保持不变。


如果您想知道这个限制的原因:字段实际上不一定排列为平面列表,而是排列为树,并且字段的名称是树节点名称的串联,中间有句点作为分隔符.尝试在最后一个点之前的任何位置更改字段名称可能意味着必须更改树结构,但所讨论的方法仅用于简单地重命名。

【讨论】:

    【解决方案2】:

    关闭压模和阅读器后即可阅读。下面是工作代码示例

    public static void main(String[] args) 抛出 DocumentException, IOException {

        String src = "C:\\Workspace\\pdf1\\2053-C.pdf";
        String dest= "C:\\Workspace\\pdf1\\_renamed_2053-C.pdf";
    
        PdfReader reader = new PdfReader(src);
        PdfStamper stamper = new PdfStamper(reader, new FileOutputStream(dest));
        AcroFields form = stamper.getAcroFields();
        form.renameField("cpa_t1", "renamed_cpa_t1");
        stamper.close();
        reader.close();
        reader = new PdfReader(dest);
        form = reader.getAcroFields();
        Map<String, AcroFields.Item> fields = form.getFields();
    
        for (String name : fields.keySet()) {
    
            if (name.equals("renamed_cpa_t1")) {
                System.out.println("Renamed :: " + name);
            }
        }
    
       System.out.println("FieldType : " + form.getFieldType("renamed_cpa_t1"));
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-12-10
      • 1970-01-01
      • 1970-01-01
      • 2015-03-12
      相关资源
      最近更新 更多