2012-11-19 17 views
7

Ho un file PDF con alcuni campi modulo che ho bisogno di compilare dal codice Java. Io uso biblioteca PDFBox per questo, e questo codice:Riempimento modulo PDF con PDFBox non funziona

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(); 

Il PDF non è stato creato da me, quindi non so che tipo di forma degli usi di file (se ho capito bene, ci sono DFF e XFA forme). Dal momento che il PDF non è stato creato da me, ho usato questo strumento http://support.persits.com/pdf/demo_formfields.asp per scoprire i nomi dei campi del modulo, e mi ha dato questo:

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

Quando uso questo nome di campo lungo, non ho ricevuto eventuali errori, ma il PDF risultante non contiene il valore che ho inserito nel campo. Ho pensato che forse c'era qualcosa di sbagliato nel nome del campo, quindi ho usato Pdftk tool che mi ha dato solo txtFirstName per il nome del campo. Ma quando uso proprio questo, ottengo l'errore No field found with name: txtFirstName. Aiuto?

+0

Il nome del campo suggerisce che si tratta di un campo XFA. Forse devi indirizzare i campi XFA in modo diverso in PDFBox? (Non conosco affatto l'API PDFBox ...) – mkl

risposta

14

Bene Mi rendo conto che questa domanda è molto vecchio, ma mi sono imbattuto attraverso di esso e ho pensato di pubblicare la mia soluzione.

È possibile trovare gli ID dei campi nel modulo PDF utilizzando PDFBox. Ha un'API molto ricca, sfortunatamente richiede molta lettura per capire cosa devi fare.

Per ottenere il nome del campo modulo, si desidera utilizzare getFullyQualifiedName che fa parte della classe PDField.

Sfortunatamente, non è possibile ottenere tutti i nomi di file in una volta sola (che posso dire) dalla classe PDAcroform, in modo da poter semplicemente creare una matrice di nomi di moduli e quindi eseguire un ciclo di ciascuno di essi.

ad es.

// 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(); 

Spero che questo aiuti qualcuno.

Cheers

-4

Ho lo stesso problema si prega di utilizzare Adobe Acrobat X Pro per la creazione del formato pdf e iniziare con file docx vuoto, esso sarà lavoro correttamente

Problemi correlati