1

一部のデータ コンピューティング (Java を使用) に従って、pdf テンプレートの変更を自動化しようとしています。

私はpdfの変更の経験がなく、これを行うために使用しようとしitext7ています.

PDFにテキストを追加する方法を読んでいますが、ここでも、「キー」を使用してAcrosfieldが存在する場合にそれらをフィールドする方法を見ました

それにもかかわらず、私が使用している pdf テンプレート (変更可能) を作成していないため、手動で入力できるフィールドが Acrosfields または別の技術で作成されているかどうかはわかりません。各フィールドに 1 つあれば...

この質問を見ました。ここには、すべてのフィールドとその値を取得する方法が示されていますが、唯一の答えに表示されるコードを試すと、

main.java:[40,0] error: illegal start of type
main.java:[40,19] error: ')' expected
main.java:[40,30] error: <identifier> expected
3 errors 

この部分では:

for (String fldName : fldNames) {
    System.out.println( fldName + ": " + fields.getField( fldName ) );
}

少し試してみると、より多くの情報が見つかりましたが、可能であればこれらの「キー」を取得する方法が見つかりません...

- - - - 編集 - - - -

各フィールドに Acrosfield のキーの名前を持つ PDF テンプレートのコピーを作成するために、このコードを作成しました。

package novgenrs;


import com.itextpdf.text.DocumentException;
import com.itextpdf.text.pdf.AcroFields;
import com.itextpdf.text.pdf.PdfReader;
import com.itextpdf.text.pdf.PdfStamper;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.Set;
public class MakePDF {

public static void MakePDF(String[] args) throws IOException, DocumentException{


PdfReader reader = new PdfReader("template.pdf");

PdfStamper stamper = new PdfStamper(reader, new FileOutputStream("result.pdf"));

//AcroFields form = stamper.getAcroFields();

AcroFields fields = reader.getAcroFields();

AcroFields wrt = stamper.getAcroFields(); 

Set<String> fldNames = fields.getFields().keySet();

for (String fldName : fldNames) {
  wrt.setField(fldName, fldName) ; 
}

stamper.close();
reader.close(); 

}


}

注: これは itext5 でのみ機能します。何らかの理由でこれを itext7 でやろうとしたときにうまくいかなかったので、itext5 でやろうとしたところうまくいきました!

4

1 に答える 1

3

質問に対する完全な回答が必要な場合は、調査できるように PDF を提供する必要がありますが、これらはすでに正しい方向に導くいくつかの回答です。

プログラムでpdfファイルに記入する方法を参照するときは?(AcroForm テクノロジ)、iText 7 バージョンのHow to fill out a pdf file programmatic?を参照します。(AcroForm テクノロジ)これは同じ質問に対する答えですが、iText 5 を使用する開発者向けです。ご覧のとおり、iText 5 と iText 7 には大きな違いがあります。

ただし、iText を使用して PDF ファイルからすべてのフィールドと値を取得するにはどうすればよいですか?を参照すると、iText 5 のみで使用される回答が得られます。iText 7 を使用している場合、そのコードは iText 5 コードであるため機能しません。

必要なコードは次の場所にあります: AcroFields から特定の型を取得するには? PushButtonField、RadioCheckField などのように

PdfReader reader = new PdfReader(src);
PdfDocument pdfDoc = new PdfDocument(reader);
// Get the fields from the reader (read-only!!!)
PdfAcroForm form = PdfAcroForm.getAcroForm(pdfDoc, true);
// Loop over the fields and get info about them
Set<String> fields = form.getFormFields().keySet();
for (String key : fields) {
    writer.print(key + ": ");
    PdfName type = form.getField(key).getFormType();
    if (0 == PdfName.Btn.compareTo(type)) {
        if(((PdfButtonFormField)form.getField(key)).isPushButton()){
            writer.println("Pushbutton");
        } else {
            if(((PdfButtonFormField)form.getField(key)).isRadio()){
                writer.println("Radiobutton");                   
            }else {
                writer.println("Checkbox");
            }
        }
    } else if (0 == PdfName.Ch.compareTo(type)) {
        writer.println("Choicebox");
    } else if (0 == PdfName.Sig.compareTo(type)) {
        writer.println("Signature");
    } else if (0 == PdfName.Tx.compareTo(type)) {
        writer.println("Text");
    }else {
        writer.println("?");
    }
}

このコードは、すべてのフィールドをループし、 と、そのキーに対応するフィールドのタイプを にkey書き込みます。RUPSを使用して PDF を検査するSystem.outこともできます。

あなたは言及します:

main.java:[40,0] error: illegal start of type
main.java:[40,19] error: ')' expected
main.java:[40,30] error: <identifier> expected

これがコンパイラ エラーなのか、実行時エラーなのかはわかりません。

  • コンパイラ エラーの場合は、どこかが欠けているだけです。その場合、問題は iText とはまったく関係ありません (これは、非常に単純なプログラミング エラー)があるだけだと思います)。
  • 実行時エラーの場合は、PDF に問題があります。PDF では、文字列は括弧で区切られます。PDF のどこかに角かっこが欠けている可能性があります (ただし、別の種類のエラーが発生することはないと思います)。

要するに、優れた IDE を試してみてください。その IDE は、括弧が欠落している場所を示してくれます。その場所がすぐに見つからない場合は、インデントとスペースを追加してコードをクリーンアップします。これにより、どこで a を忘れたかが明確になるはずです)

于 2016-09-24T16:13:53.237 に答える