2012-11-19 29 views
7

我有一個PDF文件,其中包含一些需要從Java代碼填寫的表單字段。我使用PDFBox的庫這個,還有這個代碼:使用PDFBox填充PDF表格不起作用

PDDocument pdfDoc = PDDocument.load("C:\\Users\\igor\\Desktop\\test.pdf"); 
PDDocumentCatalog docCatalog = pdfDoc.getDocumentCatalog(); 
PDAcroForm acroForm = docCatalog.getAcroForm(); 
PDField field = acroForm.getField("applicationPrepaid[0].#pageSet[0].Pagina1[0].txtFirstName[0]"); 
if (field != null) { 
    field.setValue("Milan"); 
} else { 
    System.err.println("No field found with name:" + "applicationPrepaid[0].#pageSet[0].Pagina1[0].txtFirstName[0]"); 
} 
pdfDoc.save("C:\\Users\\igor\\Desktop\\testout.pdf"); 
pdfDoc.close(); 

不是由我創建的PDF,所以我不知道是什麼類型的表單文件使用(如果我理解正確的話,還有FDF和XFA形式)。由於PDF是不是我創造,我用這個工具http://support.persits.com/pdf/demo_formfields.asp找出表單字段的名稱,它給了我這樣的:

applicationPrepaid[0].#pageSet[0].Pagina1[0].txtFirstName[0] 

當我使用這個長字段名,我不明白任何錯誤,但生成的PDF不包含我在該字段中輸入的值。我認爲也許這個字段名稱有問題,所以我使用Pdftk tool,這個字段名稱只是txtFirstName。但是當我使用這個,我得到了No field found with name: txtFirstName錯誤。幫幫我?

+0

該字段名稱暗示它是一個XFA字段。也許你必須在PDFBox中以不同的方式處理XFA字段? (我根本不知道PDFBox API ...) – mkl

回答

14

嗯,我知道這個問題已經很老了,但我迷迷糊糊穿過它,並認爲我應該發佈我的解決方案。

您可以使用PDFBox在PDF表單中找到字段的ID。它有一個非常豐富的API,只是不幸的是需要大量的閱讀來弄清楚你必須做的事情。

要獲得表單字段的名稱,您希望使用getFullyQualifiedName,它是PDField類的一部分。

不幸的是,您不能從PDAcroform類中一次性獲取所有文件名(我可以知道),因此您可以簡單地創建一個表單名稱的數組,然後遍歷每個表單。

例如

// Load the pdfTemplate 
    pdfTemplate = PDDocument.load(file); 

    PDDocumentCatalog docCatalog = pdfTemplate.getDocumentCatalog(); 
    PDAcroForm acroForm = docCatalog.getAcroForm(); 

    // Get field names 
    List<PDField> fieldList = acroForm.getFields(); 

    // String the object array 
    String[] fieldArray = new String[fieldList.size()]; 
    int i = 0; 
    for (PDField sField : fieldList) { 
     fieldArray[i] = sField.getFullyQualifiedName(); 
     i++; 
    } 

    // Loop through each field in the array and do something 
    for (String f : fieldArray) { 
     PDField field = acroForm.getField(f); 

     System.out.println("f is: " + f); 
     if (f.contains("EXAMPLE FORM FIELD NAME")) { 
      DO SOMETHING 
          String value = "example value"; 
      field.setValue(value); 
      System.out.println("printed: " + value + " to: " + f); 
     } 
    } 

    // Save edited file 
    pdfTemplate.save(sPdfTemplate); 
    pdfTemplate.close(); 

希望這可以幫助別人。

乾杯

-4

我有同樣的問題 請使用Adobe Acrobat X PRO用於創建PDF格式和空白的docx文件開始, 這將是正常工作