1. 序章

このクイックチュートリアルでは、iTextライブラリとPdfBoxライブラリに基づいてPDFドキュメントを最初から作成することに焦点を当てます。

2. Mavenの依存関係

まず、プロジェクトに次のMaven依存関係を含める必要があります。

<dependency>
    <groupId>com.itextpdf</groupId>
    <artifactId>itextpdf</artifactId>
    <version>5.5.10</version>
</dependency>
<dependency>
    <groupId>org.apache.pdfbox</groupId>
    <artifactId>pdfbox</artifactId>
    <version>2.0.4</version>
</dependency>

ライブラリの最新バージョンは、iTextおよびPdfBoxにあります。

iTextは、商用ライセンスだけでなく、オープンソースのAGPLライセンスの下でも利用できることを知っておくことが重要です。 商用ライセンスを購入すると、ソースコードを自分で保持できるため、IPを保持できます。 AGPLバージョンを使用する場合は、ソースコードを無料でリリースする必要があります。 このリンクをたどって、ソフトウェアがAGPLに準拠していることを確認する方法を確認できます。

また、ファイルを暗号化する必要がある場合に備えて、依存関係を1つ追加する必要があります。 Bouncy Castle Providerパッケージには暗号化アルゴリズムの実装が含まれており、両方のライブラリで必要です。

<dependency>
    <groupId>org.bouncycastle</groupId>
    <artifactId>bcprov-jdk15on</artifactId>
    <version>1.56</version>
</dependency>

ライブラリの最新バージョンは、バウンシーキャッスルプロバイダーにあります。

3. 概要

iTextとPdfBoxはどちらもJavaライブラリであり、PDFファイルの作成と操作に使用します。 ライブラリの最終的な出力は同じですが、動作が異なります。 それぞれを詳しく見ていきましょう。

4. ITextでPDFを作成する

4.1. PDFにテキストを挿入

「HelloWorld」テキストを含む新しいファイルをPDFファイルに挿入する方法を見てみましょう。

Document document = new Document();
PdfWriter.getInstance(document, new FileOutputStream("iTextHelloWorld.pdf"));

document.open();
Font font = FontFactory.getFont(FontFactory.COURIER, 16, BaseColor.BLACK);
Chunk chunk = new Chunk("Hello World", font);

document.add(chunk);
document.close();

iTextライブラリを使用したPDFの作成は、ドキュメントのElementsインターフェイスを実装するオブジェクトの操作に基づいています(バージョン5.5.10では、これらの実装は45個あります)。

ドキュメントに追加して使用できる最小の要素はChunkで、これは基本的にフォントが適用された文字列です。

さらに、チャンク段落セクション、などの他の要素と組み合わせて、見栄えの良いドキュメントを作成できます。

4.2. 画像を挿入する

iTextライブラリは、ドキュメントに画像を追加する簡単な方法を提供します。 Image インスタンスを作成し、それを Document:に追加するだけです。

Path path = Paths.get(ClassLoader.getSystemResource("Java_logo.png").toURI());

Document document = new Document();
PdfWriter.getInstance(document, new FileOutputStream("iTextImageExample.pdf"));
document.open();
Image img = Image.getInstance(path.toAbsolutePath().toString());
document.add(img);

document.close();

4.3. テーブルの挿入

PDFにテーブルを追加したい場合、問題が発生する可能性があります。 幸いなことに、 iTextは、この機能をすぐに使用できます。 

まず、 PdfTable オブジェクトを作成し、コンストラクターでテーブルにいくつかの列を指定する必要があります。

次に、新しく作成されたテーブルオブジェクトで addCell メソッドを呼び出すことにより、新しいセルを追加するだけです。 必要なすべてのセルが定義されている限り、iTextはテーブル行を作成します。 つまり、3つの列を持つテーブルを作成し、それに8つのセルを追加すると、それぞれに3つのセルがある2つの行のみが表示されます。

例を見てみましょう:

Document document = new Document();
PdfWriter.getInstance(document, new FileOutputStream("iTextTable.pdf"));

document.open();

PdfPTable table = new PdfPTable(3);
addTableHeader(table);
addRows(table);
addCustomRows(table);

document.add(table);
document.close();

次に3列3行の新しいテーブルを作成します。最初の行を、背景色と境界線の幅が変更されたテーブルヘッダーとして扱います。

private void addTableHeader(PdfPTable table) {
    Stream.of("column header 1", "column header 2", "column header 3")
      .forEach(columnTitle -> {
        PdfPCell header = new PdfPCell();
        header.setBackgroundColor(BaseColor.LIGHT_GRAY);
        header.setBorderWidth(2);
        header.setPhrase(new Phrase(columnTitle));
        table.addCell(header);
    });
}

2行目は、テキストのみで追加の書式設定がない3つのセルで構成されます。

private void addRows(PdfPTable table) {
    table.addCell("row 1, col 1");
    table.addCell("row 1, col 2");
    table.addCell("row 1, col 3");
}

セルに画像を含めることもできます。 さらに、各セルを個別にフォーマットできます。

この例では、水平方向と垂直方向の配置調整を適用しています。

private void addCustomRows(PdfPTable table) 
  throws URISyntaxException, BadElementException, IOException {
    Path path = Paths.get(ClassLoader.getSystemResource("Java_logo.png").toURI());
    Image img = Image.getInstance(path.toAbsolutePath().toString());
    img.scalePercent(10);

    PdfPCell imageCell = new PdfPCell(img);
    table.addCell(imageCell);

    PdfPCell horizontalAlignCell = new PdfPCell(new Phrase("row 2, col 2"));
    horizontalAlignCell.setHorizontalAlignment(Element.ALIGN_CENTER);
    table.addCell(horizontalAlignCell);

    PdfPCell verticalAlignCell = new PdfPCell(new Phrase("row 2, col 3"));
    verticalAlignCell.setVerticalAlignment(Element.ALIGN_BOTTOM);
    table.addCell(verticalAlignCell);
}

4.4. ファイルの暗号化

iTextライブラリを使用して権限を適用するには、PDFドキュメントをすでに作成しておく必要があります。 この例では、以前に生成したiTextHelloWorld.pdfファイルを使用します。

PdfReader を使用してファイルをロードしたら、 PdfStamper、を作成する必要があります。これを使用して、メタデータや暗号化などの追加コンテンツをファイルに適用します。

PdfReader pdfReader = new PdfReader("HelloWorld.pdf");
PdfStamper pdfStamper 
  = new PdfStamper(pdfReader, new FileOutputStream("encryptedPdf.pdf"));

pdfStamper.setEncryption(
  "userpass".getBytes(),
  ".getBytes(),
  0,
  PdfWriter.ENCRYPTION_AES_256
);

pdfStamper.close();

この例では、ファイルを2つのパスワードで暗号化しました。ユーザーが印刷できない読み取り専用権限を持つユーザーパスワード(「userpass」)と、所有者パスワード(「ownerpass」)です。 )、これは、人がpdfに完全にアクセスできるようにするためのマスターキーとして使用されます。

ユーザーがPDFを印刷できるようにする場合は、0( setEncryption の3番目のパラメーター)の代わりに、次のパスを渡すことができます。

PdfWriter.ALLOW_PRINTING

もちろん、次のように、さまざまな権限を混在させることもできます。

PdfWriter.ALLOW_PRINTING | PdfWriter.ALLOW_COPY

iTextを使用してアクセス許可を設定する場合、一時的なpdfも作成するため、削除する必要があることに注意してください。 削除しないと、誰でも完全にアクセスできる可能性があります。

5. PdfBoxでPDFを作成する

5.1. PDFにテキストを挿入

iText とは対照的に、PdfBoxライブラリはストリーム操作に基づくAPIを提供します。チャンク/ 段落、などのクラスはありません。 。 PDDocument クラスはメモリ内のPdf表現であり、ユーザーはPDPageContentStreamクラスを操作してデータを書き込みます。

コード例を見てみましょう。

PDDocument document = new PDDocument();
PDPage page = new PDPage();
document.addPage(page);

PDPageContentStream contentStream = new PDPageContentStream(document, page);

contentStream.setFont(PDType1Font.COURIER, 12);
contentStream.beginText();
contentStream.showText("Hello World");
contentStream.endText();
contentStream.close();

document.save("pdfBoxHelloWorld.pdf");
document.close();

5.2. 画像を挿入する

画像の挿入も簡単です。

ファイルをロードしてPDImageXObjectを作成し、続いてそれをドキュメントに描画する必要があります(正確なx、y座標を提供する必要があります)。

PDDocument document = new PDDocument();
PDPage page = new PDPage();
document.addPage(page);

Path path = Paths.get(ClassLoader.getSystemResource("Java_logo.png").toURI());
PDPageContentStream contentStream = new PDPageContentStream(document, page);
PDImageXObject image 
  = PDImageXObject.createFromFile(path.toAbsolutePath().toString(), document);
contentStream.drawImage(image, 0, 0);
contentStream.close();

document.save("pdfBoxImage.pdf");
document.close();

5.3. テーブルの挿入

残念ながら、 PdfBox には、テーブルを作成するためのすぐに使用できるメソッドはありません。 この状況でできることは、手動で描画することです。文字通り、描画が目的のテーブルに似るまで各線を描画します。

5.4. ファイルの暗号化

PdfBoxライブラリは、ユーザーのファイル権限を暗号化および調整する機能を提供します。 iText と比較すると、 iText と比較して、単にPDDocument。 PDFファイルのアクセス許可は、 AccessPermission クラスによって処理されます。このクラスでは、ユーザーがファイルを変更、抽出、または印刷できるかどうかを設定できます。

続いて、 StandardProtectionPolicy オブジェクトを作成します。これにより、ドキュメントにパスワードベースの保護が追加されます。 2種類のパスワードを指定できます。 ユーザーパスワードを使用すると、ユーザーはアクセス許可が適用されたファイルを開くことができます。所有者パスワードには、ファイルに対する制限はありません。

PDDocument document = new PDDocument();
PDPage page = new PDPage();
document.addPage(page);

AccessPermission accessPermission = new AccessPermission();
accessPermission.setCanPrint(false);
accessPermission.setCanModify(false);

StandardProtectionPolicy standardProtectionPolicy 
  = new StandardProtectionPolicy("ownerpass", "userpass", accessPermission);
document.protect(standardProtectionPolicy);
document.save("pdfBoxEncryption.pdf");
document.close();

この例は、ユーザーがユーザーパスワードを提供した場合、ファイルを変更または印刷できないことを示しています。

6. 結論

この記事では、2つの人気のあるJavaライブラリでPDFファイルを作成する方法を学びました。

この記事の完全な例は、GitHub上のMavenベースのプロジェクトにあります。