作成中
序論
メーリングリストでもっともよく尋ねられる質問として、既存のPDFファイルの'competitor' という単語を 'myself'
という単語に置き換えたいとか、既存のPDFファイルの'FREE'という単語に下線を引きたいというものがある。もしも、あなたのやりたいことがそのようなことなら、これ以下を読むことをやめてもかまいません。iText
ではこのようなことはできません(訳注:PdfObject の操作により不可能ではありませんが、iText と PDF
シンタックスに対する深い理解が必要です)。iText
は、PDF中のテキストをほかのRTFやWORDはもちろん、ただのテキストのような'可読'文書フォーマットに変換することはできません。iText
に、文書中のある単語がどのように表現されているかとか、ページ中の位置などを問い合わせることはできません。
それでは、iText ができること見てみましょう。何をしたいかによりますが、次の既存PDF文書の操作をするためのオブジェクトのひとつを使うことになるでしょう。
PdfWriterは、スクラッチから文書を生成するものですが、ほかのPDF文書からインポートしたページについてもサポートしています。しかし、PdfWriterを使うと、PdfImportedPage の対話機能(注釈、しおり、フィールドなど)が処理中に失われるという大きな欠点があります。
PdfStampeは、既存のひとつのPDF文書のコンテンツを操作することができます。例えば、ページ番号を加える、すかしを加える、フォームフィールドを埋めるたり平滑化したりする、既存のPDF文書を署名したり、暗号化したりする、などなど。
PdfEncryptor は、既存の文書を暗号化するより使いやすいクラスです。内部で、PdfStamper を呼び出します。
PdfCopy は、複数の既存PDF文書から(選択した)ページを結合することができます。しおりも調整できますが、フォームフィールドは失われることがあります。PdfCopy は、新しいコンテンツの追加はできません。
PdfCopyFields は、複数のPDF文書を結合し、フィールドも保持します(複数のソースファイルをフィールドを、ひとつのAcroFormに出力します)。
例を見る前に、出力ファイルは、入力ファイルと異なる名前でなければならないことを覚えておいてください! PdfReaderによってファイルを開いたら、PdfWriter/PdfStamper/PdfCopy でそのファイルに書き込むことはできません。既存のファイルを'編集'したいなら、一時ファイルを使い、操作が終わったあとで名前を変更する必要があります。
先頭に戻るそれでは、iText ができること見てみましょう。何をしたいかによりますが、次の既存PDF文書の操作をするためのオブジェクトのひとつを使うことになるでしょう。
PdfWriterは、スクラッチから文書を生成するものですが、ほかのPDF文書からインポートしたページについてもサポートしています。しかし、PdfWriterを使うと、PdfImportedPage の対話機能(注釈、しおり、フィールドなど)が処理中に失われるという大きな欠点があります。
PdfStampeは、既存のひとつのPDF文書のコンテンツを操作することができます。例えば、ページ番号を加える、すかしを加える、フォームフィールドを埋めるたり平滑化したりする、既存のPDF文書を署名したり、暗号化したりする、などなど。
PdfEncryptor は、既存の文書を暗号化するより使いやすいクラスです。内部で、PdfStamper を呼び出します。
PdfCopy は、複数の既存PDF文書から(選択した)ページを結合することができます。しおりも調整できますが、フォームフィールドは失われることがあります。PdfCopy は、新しいコンテンツの追加はできません。
PdfCopyFields は、複数のPDF文書を結合し、フィールドも保持します(複数のソースファイルをフィールドを、ひとつのAcroFormに出力します)。
例を見る前に、出力ファイルは、入力ファイルと異なる名前でなければならないことを覚えておいてください! PdfReaderによってファイルを開いたら、PdfWriter/PdfStamper/PdfCopy でそのファイルに書き込むことはできません。既存のファイルを'編集'したいなら、一時ファイルを使い、操作が終わったあとで名前を変更する必要があります。
- PdfWriter は、スクラッチから文書を生成するものですが、ほかのPDF文書からインポートしたページについてもサポートしています。しかし、PdfWriterを使うと、PdfImportedPage の対話機能(注釈、しおり、フィールドなど)が処理中に失われるという大きな欠点があります。
- PdfStamper は、既存のひとつのPDF文書のコンテンツを操作することができます。例えば、ページ番号を加える、すかしを加える、フォームフィールドを埋めるたり平滑化したりする、既存のPDF文書を署名したり、暗号化したりする、などができます。
- PdfEncryptor は、既存の文書を暗号化するより使いやすいクラスです。内部で、PdfStamper を呼び出します。
- PdfCopy は、複数の既存PDF文書から(選択した)ページを結合することができます。しおりも調整できますが、フォームフィールドは失われることがあります。PdfCopy は、新しいコンテンツの追加はできません!
- PdfCopyFields は、複数のPDF文書を結合し、フィールドも保持します(複数のソースファイルをフィールドを、ひとつのAcroFormに出力します)。
例を見る前に、出力ファイルは、入力ファイルと異なる名前でなければならないことを覚えておいてください! PdfReaderによってファイルを開いたら、PdfWriter/PdfStamper/PdfCopy でそのファイルに書き込むことはできません。既存のファイルを'編集'したいなら、一時ファイルを使い、操作が終わったあとで名前を変更する必要があります。
PdfWriter
スクラッチから文書を作成したいなら、Hello World
の章にある五つの手順を見てください。ステップ
2で、新しいコンテンツを書き込む PdfWriter を作成します。新しいコンテンツは、Document
オブジェクトに加える高機能オブジェクトであったり、PdfContentByte
オブジェクトに加えるダイレクトコンテンツであったりします。PdfImportedPage
は、ダイレクトコンテンツとして加えることができるオブジェクトです。PdfImportedPage
は、PdfReader から次のように得ます。
先頭に戻るPdfReader reader = new PdfReader("existing.pdf");
PdfImportedPage page1 = writer.getImportedPage(reader, 1);
directcontent.addTemplate(page1, 1, 0, 0, 1, 0, 0);
PdfImportedPage
オブジェクトのコンテンツを変更できないことは注意してください。ページの上あるいは下にコンテンツを追加したならば、PdfContentByte
オブジェクトを PdfWriter に問い合わせなければなりません。これは、addTemplate
メソッドのパラメータとして、チュートリアルのダイレクトコンテンツで説明されています。下の例では、インポートされたページが縮小されて、縦長の2ページが横長の1ページに収まっています。
Example: java
com.lowagie.examples.general.copystamp.TwoOnOne
Combines 2 pages on 1: see 2on1.pdf
External resources for this example: ChapterSection.pdf
Combines 2 pages on 1: see 2on1.pdf
External resources for this example: ChapterSection.pdf
PdfStamper
一つの既存のPDFファイルのコンテンツを変更したい、すかし、ページ番号、ヘッダ、などのコンテンツを追加したいような時には、PdfStamper
を使うことができます。
先頭に戻るPdfReader reader = new PdfReader("existing.pdf");
PdfStamper stamp = new PdfStamper(reader,
new FileOutputStream("stamped.pdf"));
PdfContentByte under = stamp.getUnderContent(1);
// change the content beneath page 1
PdfContentByte over = stamp.getOverContent(1);
// change the content on top of page 1
stamp.close()
繰り返しになりますが、テキストやイメージなどを加える方法は、ダイレクトコンテンツの章を読んでください。下の例では、テキストの背面にすかしを、最上部に'DUPLICATE'という文字を加えます。さらに、タイトルページも追加しています。
Example: java
com.lowagie.examples.general.copystamp.AddWatermarkPageNumbers
Adds pagenumbers and a watermark to an existing document: see watermark_pagenumbers.pdf
External resources for this example: ChapterSection.pdf SimpleAnnotations1.pdf watermark.jpg
PdfStamper は、AcroForms
を埋める必要があるときにも使うことができるクラスです。次に、簡単なフォームを埋める例を示します。ひとつは平滑化せず、ひとつは平滑化しています。フォームを埋めるの章に、より多くの例があります。Adds pagenumbers and a watermark to an existing document: see watermark_pagenumbers.pdf
External resources for this example: ChapterSection.pdf SimpleAnnotations1.pdf watermark.jpg
Example: java
com.lowagie.examples.general.copystamp.Register
Fills in a form: see registered.pdf registered_flat.pdf
External resources for this example: SimpleRegistrationForm.pdf
既存文書を暗号化するために、PdfStamper を使うこともできますが、よりわかりやすいメソッドを提供している
PdfEncryptor というヘルパークラスがあります。Fills in a form: see registered.pdf registered_flat.pdf
External resources for this example: SimpleRegistrationForm.pdf
PdfEncryptor.encrypt(reader,
new FileOutputStream("encrypted.pdf"),
"Hello".getBytes(),
"World".getBytes(),
PdfWriter.AllowPrinting | PdfWriter.AllowCopy,
false)
例では、'Hello' をユーザパスワードに設定しているので、Acrobat Reader
で文書を開くときにそれが必要です。'World' は、オーナーパスワードです。(PdfReader
のような)アプリケーションでそれを読むときに必要です。四つのパラメータは、許可するものを定義します。これは、次の定数を OR
でつないで指定します。- PdfWriter.AllowPrinting
- PdfWriter.AllowModifyContents
- PdfWriter.AllowCopy
- PdfWriter.AllowModifyAnnotations
- PdfWriter.AllowFillIn (128 bit only)
- PdfWriter.AllowScreenReaders (128 bit only)
- PdfWriter.AllowAssembly (128 bit only)
- PdfWriter.AllowDegradedPrinting (128 bit only)
Example: java
com.lowagie.examples.general.copystamp.EncryptorExample
Encrypts an existing PDF file: see encrypted.pdf
External resources for this example: ChapterSection.pdf
Encrypts an existing PDF file: see encrypted.pdf
External resources for this example: ChapterSection.pdf
PdfCopy
PdfStamper
がある文書にできることは、新しいページを追加することだけなので、ひとつあるいはそれ以上のPDFファイルから(ある選ばれた)ページをコピーして、一つのPDFを得たいような場合には、PdfCopy
を使うのが良いでしょう。ひとつあるいはそれ以上のPDFファイルのコンテンツを変更する必要はない(たぶんしおりだけでしょう)なら、PdfCopyのシンタックスは、PdfWriterのシンタックスと非常によく似ています。
先頭に戻る
PdfReader reader = new PdfReader("existing.pdf");
Document document = new Document(reader.getPageSizeWithRotation(1));
PdfCopy copy = new PdfCopy(document, new FileOutputStream(outFile));
document.open();
PdfImportedPage page = copy.getImportedPage(reader, i);
copy.addPage(page);
document.close();
次の例は、既存PDFファイルを結合するコマンドラインツールとしても利用できます。
Example: java
com.lowagie.examples.general.copystamp.Concatenate ChapterSection.pdf
Destinations.pdf SimpleAnnotations1.pdf concatenated.pdf
Concatenates existing PDF files: see concatenated.pdf
External resources for this example: ChapterSection.pdf Destinations.pdf SimpleAnnotations1.pdf
PdfCopy には、AcroForms を含んだファイルでは、うまく働かないという大きな問題があります。さまざまなAcroFormを含んだ既存の複数のPDFファイルを結合したいときには、PdfCopyFields
クラスを使わなければなりません。PdfCopy
と違って、すべての文書がメモリ上に保持されます。フォームフィールドの結合に関する規則性は、Acrobat
と同じです。同じ名前のフィールドがあるときには、そのままマージされてしまいますが、そのようなときには名前を変更したほうが良いでしょう。Concatenates existing PDF files: see concatenated.pdf
External resources for this example: ChapterSection.pdf Destinations.pdf SimpleAnnotations1.pdf
Example: java
com.lowagie.examples.general.copystamp.ConcatenateForms
Concatenates existing PDF files with forms: see concatenatedforms.pdf
External resources for this example: SimpleRegistrationForm.pdf TextFields.pdf ChapterSection.pdf
Concatenates existing PDF files with forms: see concatenatedforms.pdf
External resources for this example: SimpleRegistrationForm.pdf TextFields.pdf ChapterSection.pdf