JavaでPDFファイルを作成する

JavaでPDFファイルを作成する

1. 前書き

この簡単な記事では、人気のあるiTextおよびPdfBoxライブラリに基づいてPDFドキュメントを最初から作成することに焦点を当てます。

2. Mavenの依存関係

プロジェクトに含める必要のあるMavenの依存関係を見てみましょう。


    com.itextpdf
    itextpdf
    5.5.10


    org.apache.pdfbox
    pdfbox
    2.0.4

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

ファイルを暗号化する必要がある場合は、追加するために1つの追加の依存関係が必要です。 バウンティキャッスルプロバイダーパッケージには、暗号化アルゴリズムの実装が含まれており、両方のライブラリで必要です。


    org.bouncycastle
    bcprov-jdk15on
    1.56

ライブラリの最新バージョンはここにあります:The Bounty Castle Provider

3. 概要

iTextとPdfBoxは両方とも、pdfファイルの作成/操作に使用されるJavaライブラリです。 ライブラリの最終出力は同じですが、動作が少し異なります。 それらを見てみましょう。

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を作成することは、DocumentElementsインターフェイスを実装するオブジェクトの操作に基づいています(バージョン5.5.10では、これらの実装は45個あります)。

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

さらに、Chunkは、ParagraphsSectionなどの他の要素と組み合わせることができます。 見栄えの良いドキュメントになります。

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へのアクセス。

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

PdfWriter.ALLOW_PRINTING

もちろん、次のようなさまざまなアクセス許可を混在させることができます。

PdfWriter.ALLOW_PRINTING | PdfWriter.ALLOW_COPY

iTextを使用してアクセス許可を設定すると、削除する必要がある一時的なpdfも作成されることに注意してください。

5. PdfBoxでPDFを作成する

5.1. PDFにテキストを挿入

iTextとは対照的に、PdfBoxライブラリはストリーム操作に基づくAPIを提供します。 Chunk /Paragraphなどのようなクラスはありません。 PDDocumentクラスは、ユーザーがPDPageContentStreamクラスを操作してデータを書き込むメモリ内のPDF表現です。

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

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と比較すると、単に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ファイルを作成する方法について説明しました。

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