JavaでのPDFファイルの作成
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にテーブルを追加したい場合、問題が発生する可能性があります。 幸いなことに、
まず、 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 と比較すると、
続いて、 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ベースのプロジェクトにあります。