2016-09-27 38 views
1

我正嘗試使用iText庫將新域名重命名爲現有域。 但下面的代碼沒有幫助。這個片段的無法使用iText重命名PDF中的表單域Java

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

即使我已經改名領域,它給我的輸出爲現有的現場。並且新名稱不附加到該字段。

注意:0的FieldType - 場犯規存在
的FieldType 4 - 文本類型字段

任何人都知道任何替代的方式來命名利用iText在PDF領域。

請指教!!

+0

我剛剛得到了原因,爲什麼它不適合我。我有 」。」 (點)在我的字段名稱,似乎itext的renameField()方法不支持「。」字段名稱。 (點)。我將點更改爲「_」,它工作。謝謝!! – Shailesh

回答

1

只需在關閉壓模器和閱讀器後閱讀。下面是工作代碼示例

公共靜態無效的主要(字串[] 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")); 
} 
+0

謝謝維什維什 – Shailesh

1

你試圖重命名 「簽名[0] .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) 

因此,你可以重命名 「簽名[0] .firstName」 到 「簽名[0] .reallyFirstName」 但一切到最後 ''需要保持不變。


如果你想知道關於這個限制的原因:其實不一定排列爲平面列表,而是作爲一棵樹,一個字段的名稱字段是樹節點的名稱用句作爲連接分隔符之間。試圖在最終點之前的任何地方更改字段名稱可能意味着必須更改樹結構,但是所討論的方法僅實現了僅僅重命名。