2015-03-31 62 views
2

我有一個pdf/a-1表格,我必須填寫Java。如何填寫Java中的PDF/A-1

問題是,它用普通的pdf完全正常,但不能用pdf/a-1。

使用普通的pdf格式,我顯示錶單字段並實現一個HashMap,從中我生成一個fdf文件。

然後,我使用pdftk.exe將我的fdf文件導入普通的pdf格式,並且工作正常。

使用pdf/a-1表單,我無法顯示字段,如果我嘗試導入一個fdf文件,它不會填寫表單。

我不知道是否有一個可以填寫pdf/a-1表單的簡單方法,或者我是否應該使用一些機制來使我的pdf/a-1可填充?

我試過pdfbox和itext,但我沒有找到任何東西。

下面是一些真正簡化的代碼實現,它與常規的pdf格式一起工作,但不包含pdf/a-1格式的字段看似平坦的代碼。

與iText的

File pdfFile = new File(PDF_FILE_PATH); 

    // Display fields 
    PdfReader reader = new PdfReader(pdfFile.getAbsolutePath()); 
    System.out.println("\n-----Champs du pdf-----"); 
    for (String field : reader.getAcroFields().getFields().keySet()) { 
     if (field instanceof String) { 
      System.out.println("String " + field); 
     } else { 
      System.out.println(field.getClass().getSimpleName() + " " + field.toString()); 
     } 
    } 
    System.out.println("----------\n"); 
    reader.close(); 

顯示領域使用PDFBox的

File pdfFile = new File(PDF_FILE_PATH); 

    // HashMap Test 
    HashMap<String, Object> map = new HashMap<String, Object>(); 
    map.put("age", "37"); 
    map.put("name", "Jack"); 
    map.put("address", "930 rue des Pommes"); 
    map.put("lastname", "Wilson"); 
    map.put("description", 
      "Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat."); 


    // Load the existing pdf file 
    PDDocument pdd = PDDocument.load(pdfFile); 
    PDAcroForm acroForm = pdd.getDocumentCatalog().getAcroForm(); 


    // For each item, sets a value to the corresponding field 
    for (String item : map.keySet()){ 
     acroForm.getField(item).setValue((String) map.get(item)); 
    } 

    // Save 
    pdd.save(pdfFile); 
    pdd.close(); 

使用PDFTK使用PDFTK

實現看起來像一個以上在很多方面,但我從哈希生成地圖FDF文件,並使用以下命令行:

pdftk.exe myForm.pdf fill_form myFdf.fdf output fulfilled_form.pdf flatten 

這裏是我的兩種形式,定期之一,而另一個則是使用PDF/A-1格式:

Regular PDF

PDF/A-1

希望你能幫上忙。

此致敬禮。

+2

我建議你也爲你的問題添加一個示例pdf,以及說明你如何處理文件的一些示例代碼。 – yms 2015-03-31 13:32:48

+1

當你嘗試iText時,你確實使用過'PdfAStamper'而不是'PdfStamper'?如果沒有,那麼當PDF/A合規性中斷時您不應該感到驚訝。正如@yms所示,您應該添加一些代碼示例來說明您嘗試過的內容。請參閱http://api.itextpdf.com/pdfa/com/itextpdf/text/pdf/PdfAStamper.html – 2015-03-31 14:35:41

+1

您知道pdftk實際上是一個使用GCJ編譯爲可執行文件的過時版本的iText,對嗎?在發生這種情況時,iText不支持PDF/A,因此您不應該期望pdftk正常工作。 – 2015-03-31 15:06:07

回答

3

我已經下載了文件formulaire-a1.pdf,因爲我想寫一個小概念證明來填寫它。但是,當我檢查這個文件時,我發現它沒有表單域。

請參見下面的屏幕截圖:

enter image description here

我沒有看到在目錄中的任何AcroForm條目;我沒有看到任何字段。

請與這一個比較上面的屏幕截圖:

enter image description here

這是您的窗體的 「非PDF/A」 版本。這裏我們有一個AcroForm和一個字段數組。這是一個可以填寫的表格; formulaire-a1.pdf不是。

+0

哦,我使用OpenOffice從完全相同的文檔製作這些表單。一個保存爲常規pdf,另一個保存爲PDF/A-1。我想我會試試其他表格,謝謝。 – 2015-03-31 15:30:47

+0

顯然,在您的案例中,OO將文件導出爲PDF/A,方法是將表單壓平,使其不再像常規格式那樣。 – mkl 2015-04-09 21:56:13