7

Javaコードから入力する必要のあるいくつかのフォームフィールドを含むPDFファイルがあります。私はこれにPDFBoxライブラリを使用し、このコードは次のとおりです。

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ツールtxtFirstNameを使いました。しかし、それだけを使用すると、No field found with name: txtFirstNameエラーが発生します。ヘルプ?

4

1 に答える 1

17

さて、この質問は今では非常に古いことに気づきましたが、私はそれに遭遇し、解決策を投稿する必要があると思いました。

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

これが誰かを助けることを願っています。

乾杯

于 2014-02-04T22:24:11.237 に答える