0

here で説明されているように、いくつかの子供たちと同様のテキストフィールドを追加しました。それは PDF の自動入力機能を使用するためでしたか...私の質問は、親要素からページ参照を削除するにはどうすればよいですか? どのページにも関連していないため、データ フィールドには親参照を含めないでください。ウィジェットにはそれらが含まれている必要があります(そこに追加しましたが、親 /P ページ参照を削除できません)

私は試した

PdfFormField parent = PdfFormField.createTextField(stamper.getWriter(), false, false, 0);
parent.setFieldName(fieldName);

for (int page = 1; page <= pages; page++) {
    TextField textField = new TextField(stamper.getWriter(), new Rectangle(560, 600, 590, 800), null);

    PdfFormField pff = textField.getTextField();
    parent.addKid(pff);
    // add widget to each page
    pff.setPlaceInPage(page);
    //iText workarounds
    field.put(PdfName.P, stamper.getWriter().getPageReference(page));
    field.remove(PdfName.FF);
    field.remove(PdfName.FT);
}
//in addAnnotation() the page reference is written
stamper.addAnnotation(parent, 1);
//does not work
parent.remove(PdfName.P);

しかし、ページ参照が既に書かれていると思うので、うまくいきませんでした。後で削除する方法はありますか?

4

1 に答える 1

1

事実 1:

ほとんどの場合、フィールド ディクショナリを注釈ディクショナリとマージできるため、クラスPdfFormFieldはクラスを拡張します。PdfAnnotation

あなたの場合、PdfFormField階層要素として使用される があり、その要素は のインスタンスでもありますがPdfAnnotation、そうではありません。isAnnotation()メソッドを使用して確認できます。戻りfalseます。

事実 2:

既存の PDF に注釈を追加するときは、注釈オブジェクトだけでなくページ番号も受け入れるPdfStamperのメソッドを使用する必要があります。addAnnotation()ページ番号を追加しPdfStamperないと、どこに注釈を追加すればよいかわかりません。

実際の注釈を追加すると、注釈が視覚化されているページを参照PdfStamperするキーが追加されます。/P

事実 3:

addAnnotation()で作業する場合は、注釈とページ番号を使用する以外に方法はありませんPdfStamperPdfFormField実際の注釈ではないオブジェクトを追加すると、別の方法で処理されないため、/Pエントリが追加されますが、それは実際には意味がありません(質問で正しく指摘しているように)。

事実 4:

入力は/Pオプションです。ウィジェットの注釈が正しく表示されるためには、それらが/Annotsページの に表示されていれば十分です。

結論:

実際の注釈ではない/Pを追加する場合、iText はエントリを追加すべきではありません。PdfFormFieldしたがって、次の変更をコミットしました:リビジョン 6756

     void addAnnotation(PdfAnnotation annot, int page) {
-     annot.setPage(page);
+        if (annot.isAnnotation())
+            annot.setPage(page);
         addAnnotation(annot, reader.getPageN(page));
     }

AddFieldAndKidsの例でこれをテストしたところ、うまくいくようです:/Pエントリはもう追加されていません。

これにより、より堅牢な方法で問題が解決されます。そもそも追加すべきでないものを削除しようとするべきではありません。

于 2015-02-10T12:11:40.347 に答える