无法使用iText Java重命名PDF格式的表单字段

时间:2016-09-27 10:21:21

标签: java pdf itext

我正在尝试使用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();

}

此代码段的输出是 FieldType : 4 FieldType : 0

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

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

任何人都知道使用iText重命名PDF格式的替代方法。

请建议!!

2 个答案:

答案 0 :(得分:1)

关闭压模和读卡器后阅读。以下是工作代码示例

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

答案 1 :(得分:1)

您尝试重命名&#34;签名者[0] .firstName&#34;到&#34;名字&#34;。使用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)

因此,您可以重命名&#34;签名者[0] .firstName&#34; to&#34;签名者[0] .reallyFirstName&#34;但一切都要到最后的决定状态。&#39;需要保持不变。

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