序文
前の章では、PDFファイルを作成し、それにコンテンツを追加しました。我々は、(例えば高レベルAPIを使用しているかどうかParagraph
)、または低レベルのAPI(例えばlineTO()
、MoveTo
、stroke()
)、これらiTextのAPIは、文法PDFコンテンツストリーム(コンテンツストリーム)に書き込まれるPDF文法に変換されるであろう。この章では、コンテンツ注釈のさまざまな機能を紹介します(上記の図1を参照)。注釈はコンテンツストリームの一部ではなく、通常、既存のコンテンツの上に配置されます。注釈には多くの種類があり、ほとんどの注釈はユーザーの操作を可能にします。
コメントを追加
図1に示すように、簡単な例から始めましょう。最初Paragraph
にテキストの種類を追加し、次にテキストの前に緑色のコメントを追加します。
この例のコードのほとんどは、コメントの作成と追加を除いて、第1章のHelloWorldの例とまったく同じです。
PdfAnnotation ann = new PdfTextAnnotation(new Rectangle(20, 800, 0, 0))
.setColor(Color.GREEN)
.setTitle(new PdfString("iText"))
.setContents("With iText, "
+ "you can truly take your documentation needs to the next level.")
.setOpen(true);
pdf.getFirstPage().addAnnotation(ann);
Rectangle
メソッドを 定義してテキストメモの位置を定義し、次に色、メモのタイトル(PdfString
オブジェクト)、コンテンツ(String
オブジェクト)、コメントを開くオプションを設定し、最後にPdfDocument
オブジェクトから最初のページオブジェクトを取得してメモを追加します。
この例の後、図2に示すように、次の例を見てみましょう。視覚的な注釈を作成しました。近くでマウスをホバーすると、元のWebサイトが表示されます。テキストをクリックしてリンクを開くことができます。これはリンクコメントです。
コメントの位置は文の一部であるため、文中のここの位置を計算する必要がある場合は非常に不便です。幸い、リンクコメントをLink
オブジェクトでラップすると、iTextが自動的にコメントを計算しRectangle
ます。コードは次のとおりです。
PdfLinkAnnotation annotation = new PdfLinkAnnotation(new Rectangle(0, 0))
.setAction(PdfAction.createURI("http://itextpdf.com/"));
Link link = new Link("here", annotation);
Paragraph p = new Paragraph("The example of link annotation. Click ")
.add(link.setUnderline())
.add(" to learn more...");
document.add(p);
2行目では、iTextの公式ウェブサイトを開くことができるURIを作成します。このアクションをリンク注釈のパラメーターとして実行し、link
オブジェクトを作成しました。これは、リンク注釈オブジェクトをパラメーターとして受け入れる基本的な描画オブジェクトです。コメントはコンテンツストリームに属していないため、このリンクコメントはコンテンツストリームに追加されません。逆に、リンクノートは特定のページの特定の場所に配置されます。テキストをクリック可能にしても、コンテンツストリーム内のテキストの外観は変わりません。ここで下線を引いて、リンクをクリックする場所をお知らせします。
以下の図3に示すように、さまざまなタイプの注釈が独自に定義されたパラメーターを受け入れます。
次のコードは、になる方法を示しています。
PdfDocument pdf = new PdfDocument(new PdfWriter(dest));
PdfPage page = pdf.addNewPage();
PdfArray lineEndings = new PdfArray();
lineEndings.add(new PdfName("Diamond"));
lineEndings.add(new PdfName("Diamond"));
PdfAnnotation annotation = new PdfLineAnnotation(
new Rectangle(0, 0),
new float[]{20, 790, page.getPageSize().getWidth() - 20, 790})
.setLineEndingStyles((lineEndings))
.setContentsAsCaption(true)
.setTitle(new PdfString("iText"))
.setContents("The example of line annotation")
.setColor(Color.BLUE);
page.addAnnotation(annotation);
pdf.close();
この例では、新しく作成したページにコメントを追加しましたが、ここではDocument
オブジェクトを作成しませんでした。
ISO-32000-2は28の異なる注釈を定義しており、そのうち2つはPDF2.0で非推奨です。スペースの制限により、残りの26の注釈を使用できます。残りの異なる注釈は、1つずつ与えられません。それでは、待って、インタラクティブな注釈に注目しましょう。まず、以下の図4を見てください。
このTextMarkupAnnotationの例では、コードは次のとおりです。コードについて話すために特別な章が必要になる場合があります(外国人はピットを埋める優れた能力を持っています)
PdfAnnotation ann = PdfTextMarkupAnnotation.createHighLight(
new Rectangle(105, 790, 64, 10),
new float[]{169, 790, 105, 790, 169, 800, 105, 800})
.setColor(Color.YELLOW)
.setTitle(new PdfString("Hello!"))
.setContents(new PdfString("I'm a popup."))
.setTitle(new PdfString("iText"))
.setOpen(true)
.setRectangle(new PdfArray(new float[]{100, 600, 200, 100}));
pdf.getFirstPage().addAnnotation(ann);
次のセクションでは、さまざまなフォームフィールドを使用してインタラクティブフォームを作成します。このフォームの各フォームフィールドはウィジェットの注釈に対応しますが、これらの注釈は暗黙的に作成されます。
インタラクティブフォームを作成する
次の例では、AcroFormテクノロジーを使用してインタラクティブフォームを作成します。AcroFormは、PDF1.2(1992)で最初に言及されたテクノロジです。このテクノロジは、テキストフィールド、選択ボックス(コンボボックスまたはリストなど)、ボタン(ボタンを押す)など、PDFドキュメントのさまざまなフォームフィールドに入力できます。 、チェックボックス、ラジオボタンなど)および署名フィールド
PDFフォームをHTMLのフォームと比較するのは魅力的ですが、それは間違っています。テキストの長さがHTMLフォームの使用可能なテキスト領域を超える場合、このテキスト領域のサイズを変更できます。リストフィールドの内容は、サーバーへのクエリに基づいて即座に更新できます。つまり、HTMLフォームは非常に動的になる可能性があります。
ただし、AcroFormテクノロジーを使用したインタラクティブフォームの場合、これは不可能です。この形式のフォームは、紙のフォームと比較して最もよく、各フィールドには固定位置と固定サイズがあります。PDFフォームを使用してWebブラウザーでユーザーデータを収集するというアイデアは、長年にわたって放棄されてきました。HTMLフォームは、オンラインデータ収集にとってよりユーザーフレンドリーです。
ただし、これはAcroFormテクノロジーが役に立たないことを意味するものではありません。AcroFormテクノロジーは、次の2つのアプリケーションシナリオで使用されます。
- フォームがデジタル用紙と同等の場合:場合によっては、フォームに厳しいフォーム要件があります。デジタルドキュメントが対応するフォームの正確なコピーであることが重要です。入力するすべてのフォームは、同じ正式な要件を満たす必要があります。この場合、HTML形式よりもPDF形式を使用することをお勧めします。
- フォームがデータ収集に使用されていないが、テンプレートとして使用されている場合:例:イベントのクーポンまたは入場券を表すフォームがあります。このフォームには、チケットを購入した人、イベントの日時、座席番号など、さまざまなフィールドがあります。人々がチケットを購入するとき、完全なバウチャーを再生成する必要はありません。フォームを使用して、適切なデータを入力するだけです。
これらの2つのアプリケーションシナリオでは、Abodeソフトウェア、LibreOffice、およびその他の攻撃のグラフィカルインターフェイスを介して手動でフォームを作成できます。
このようなフォームをプログラムで作成することもできますが、GUIを備えたツールを使用する代わりに、ソフトウェアライブラリを使用してフォームまたはテンプレートを作成できる便利なケースはほとんどありません。ただし、試してみる必要があります。最初に図5を見てください。
上の画像では、テキストフィールド、ラジオボタン、チェックボックス、ドロップダウンリストボックス、複数行のテキストフィールド、およびプッシュボタンが表示されています。これらのフィールドはウィジェットのコメントで表されているため、表示されます。フィールドを作成すると、このウィジェットコメントは暗黙的に作成されます。次のコードでは、最初に別のPdfAcroForm
オブジェクトを作成します。最初のパラメーターはPdfDocument
、Document
オブジェクトから取得されるタイプパラメーターです。2番目のパラメーターは、既知のフォームがない場合に、この新しいフォームが作成されるかどうかを示すブール値です。 。作成Document
したオブジェクトにはフォームが含まれていないため、Trueに設定します。コードは次のように表示されます。
PdfAcroForm form = PdfAcroForm.getAcroForm(doc.getPdfDocument(), true);
これでフィールドを追加できるようになりましたRectangle
。ウィジェット注釈の位置とサイズを使用します。
テキストフィールド
フルネームに使用されるテキストフィールドから始めます。次のコード:
PdfTextFormField nameField = PdfTextFormField.createText(
doc.getPdfDocument(), new Rectangle(99, 753, 425, 15), "name", "");
form.addField(nameField);
createText()
このメソッドには、PdfDocument
インスタンス、Rectangle
ドメイン名、およびデフォルト値が必要です(この例では、デフォルト値は空ですString
)。テキストフィールドのラベルとウィジェットのコメントが異なることに注意してください。1つを使用Paragraph
して「フルネーム」を追加します。これParagraph
はコンテンツストリームの一部です。テキストフィールドはコンテンツストリームの一部ではなく、小さなウィジェットコメントで表すことができます。
シングルボタン
言語を選択するためのラジオボタンを作成します。名前の付いたlanguage
ラジオグループがあり、名前のないボタンが5つあり、そのうちの1つだけが選択されることに注意してください。
PdfButtonFormField group = PdfFormField.createRadioGroup(
doc.getPdfDocument(), "language", "");
PdfFormField.createRadioButton(doc.getPdfDocument(),
new Rectangle(130, 728, 15, 15), group, "English");
PdfFormField.createRadioButton(doc.getPdfDocument(),
new Rectangle(200, 728, 15, 15), group, "French");
PdfFormField.createRadioButton(doc.getPdfDocument(),
new Rectangle(260, 728, 15, 15), group, "German");
PdfFormField.createRadioButton(doc.getPdfDocument(),
new Rectangle(330, 728, 15, 15), group, "Russian");
PdfFormField.createRadioButton(doc.getPdfDocument(),
new Rectangle(400, 728, 15, 15), group, "Spanish");
form.addField(group);
チェックボックス
次のコードスニペットでは、という名前の3つのチェックボタンを、ご紹介しますexperience0
、experience1
とexperience2
。
for (int i = 0; i < 3; i++) {
PdfButtonFormField checkField = PdfFormField.createCheckBox(
doc.getPdfDocument(), new Rectangle(119 + i * 69, 701, 15, 15),
"experience".concat(String.valueOf(i+1)), "Off",
PdfFormField.TYPE_CHECK);
form.addField(checkField);
}
ご覧のとおり、createCheckBox()
メソッドを使用し、関数のパラメーターは、PdfDocument
オブジェクトRectangle
、、チェックボックスの名前、現在の値、およびチェックマークの外観です。
チェックボックスの値には2つの可能な値があります:選択されていない状態の値は「オフ」である必要があります;選択された値は通常「はい」です(これはiTextで使用されるデフォルト値です)が、他の値はあなた自身に応じてここで使用できます選択の。
リストボックスまたはドロップダウンリストボックスから1つ以上のオプションを選択できます。PDFの用語では、これを選択フィールド(選択フィールド)と呼びます。
選択フィールド
ここでは、ドロップダウンリストボックスを作成し、フィールドの名前をとして選択し、"shift"
3つのAny
オプションを提供します。このオプションは、デフォルトで選択されています。
String[] options = {"Any", "6.30 am - 2.30 pm", "1.30 pm - 9.30 pm"};
PdfChoiceFormField choiceField = PdfFormField.createComboBox(
doc.getPdfDocument(), new Rectangle(163, 676, 115, 15),
"shift", "Any", options);
form.addField(choiceField);
複数行のテキストボックス
複数行のテキストボックスは、通常のテキストボックスと比較してXianganです。
追加されたコンテンツが、1行に表示できるコンテンツを超える場合、このフィールドのテキストはその一部のみを表示し、残りは折り返されます。
PdfTextFormField infoField = PdfTextFormField.createMultilineText(
doc.getPdfDocument(), new Rectangle(158, 625, 366, 40), "info", "");
form.addField(infoField);
ボタンを押す
実際の例では、送信ボタンを使用して、フォームに入力したデータをサーバーに送信できるようにします。HTMLがHTML5および関連テクノロジーに進化し、フォームに入力するためのよりユーザーフレンドリーな機能が導入されたため、この種のPDFフォームはまれになりました。リセットボタンを追加して例を終了します。リセットボタンは、ボタンがクリックされたときに選択したフィールドを初期値にリセットします。
PdfButtonFormField button = PdfFormField.createPushButton(doc.getPdfDocument(),
new Rectangle(479, 594, 45, 15), "reset", "RESET");
button.setAction(PdfAction.createResetForm(
new String[] {"name", "language", "experience1", "experience2",
"experience3", "shift", "info"}, 0));
form.addField(button);
iTextを使用してPDFフォームを作成する場合は、その完成をよく理解できます。多くの場合、手動でフォームを作成するには、グラフィカルユーザーインターフェイスを備えたツールを使用することをお勧めします。次に、iTextを使用して、たとえばデータベースのデータを使用して、このフォームに自動的に入力します。
インタラクティブフォームに記入する
フォームの作成が完了したら、図6に示すように、デフォルト値を設定できます。
フォームを作成したら、これらのフィールドの値を設定できます。コードは次のとおりです。
Map<String, PdfFormField> fields = form.getFormFields();
fields.get("name").setValue("James Bond");
fields.get("language").setValue("English");
fields.get("experience1").setValue("Off");
fields.get("experience2").setValue("Yes");
fields.get("experience3").setValue("Yes");
fields.get("shift").setValue("Any");
fields.get("info").setValue("I was 38 years old when I became an MI6 agent.");
以前は、PdfAcroForm
オブジェクト(フォーム変数)にさまざまなフィールドを追加したいと思っていました。このオブジェクトを使用して各フィールドを取得するMap
と、値を1つずつ設定できます。もちろん、他にも効果的な方法があります。この手法は通常、既存のフォームに事前入力するために適用されます。
既存のフォームに事前入力します
この例では、フォームに存在するpdfからフォームを取得しPdfAcroForm
、前のコードのように動作します。
PdfDocument pdf = new PdfDocument(
new PdfReader(src), new PdfWriter(dest));
PdfAcroForm form = PdfAcroForm.getAcroForm(pdf, true);
Map<String, PdfFormField> fields = form.getFormFields();
fields.get("name").setValue("James Bond");
fields.get("language").setValue("English");
fields.get("experience1").setValue("Off");
fields.get("experience2").setValue("Yes");
fields.get("experience3").setValue("Yes");
fields.get("shift").setValue("Any");
fields.get("info").setValue("I was 38 years old when I became an MI6 agent.");
pdf.close();
2行目では、PdfReader
iTextがsrc
pdf内のさまざまなタイプのオブジェクトを読み取ることができます。これは、既存のpdfファイルのパスを指します。
iTextでは、I / Oは2つのクラスによって処理されます。1。
PdfReader
入力を担当します。2。PdfWriter
出力を担当します。
1行目と2行目PdfDocument
は、以前に作成した方法とは異なります。ここでは、パラメータとしてオブジェクトを同時に受け取りreader
、writer
オブジェクトをgetAcroForm()
取得するために使用します。PdfAcroForm
残りの操作は上記と同じです。
ここでは、フォームは引き続きインタラクティブです。人々は、必要に応じて対応する値を変更します。iTextは、フォームを事前に入力するために多くのアプリケーションで使用されています。例:ユーザーがオンラインサーバーにログインすると、サーバーはすでに多くの情報(名前、住所、電話番号など)を知っています。オンラインでフォームに記入する必要がある場合、空白のドキュメントを提供することはあまり意味がなく、名前、住所、電話番号をもう一度入力する必要があります。これらの値がフォームにすでに存在する場合は、時間を大幅に節約できます。これは、フォームにiTextを事前に入力することで実現できます。情報が正しいかどうかを確認でき、正しくない場合(電話番号が変更されたなど)でも、サイトのコンテンツを変更できます。
エンドユーザーにPDFの内容を変更させたくない場合があります。フォームが特定の日付と時刻のバウチャーである場合、エンドユーザーに日付と時刻を変更させたくありません。この場合、フォームはロックされます
ロックフォーム
前のコードにステートメントを追加すると、前の「このファイルには入力可能なフォームフィールドが含まれています」が消え、図7に示すように、[フルネーム]をクリックした後に値を手動で変更することはできません。
コードは次のとおりです。12行目に追加するとform.flattenFields()
、すべてのフィールドがロックされ、対応するウィジェットのコメントがコンテンツに置き換えられます。
総括する
この章では、さまざまなコメントを紹介しました
- テキスト注釈
- 線の注釈
- マークアップアナウンス
- ウィジェットの注釈(ウィジェットの注釈)
フォームへの入力とロックの例では、PdfReader
このクラスを紹介しました。次の章では、このクラスについて引き続き説明します。
先週は当分の間更新されていませんが、今日は補います。今後も私の一連の記事に注目していただければ幸いです〜ご支援ありがとうございます。