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つの追加の依存関係が必要です。Bounty Castle Providerパッケージには、暗号化アルゴリズムの実装が含まれており、両方のライブラリで必要です。

 org.bouncycastle bcprov-jdk15on 1.56  

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

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

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

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

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」)と、PDFへのフルアクセスを許可するマスターキーとして使用される所有者パスワード(「ownerpass」)。

ユーザーが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。画像の挿入

画像の挿入は簡単です。

First we need to load a file and create a PDImageXObject, subsequently draw it on the document (need to provide exact x,y coordinates).

That's all:

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. Inserting a Table

Unfortunately, PdfBox does not provide any out-of-box methods allowing creating tables. What we can do in such situation is to draw it manually – literally, draw each line until our drawing resembles our dreamed table.

5.4. File Encryption

PdfBox library provides a possibility to encrypt, and adjust file permission for the user. Comparing to iText, it does not require to use an already existing file, as we simply use PDDocument. Pdf file permissions are handled by AccessPermission class, where we can set if a user will be able to modify, extract content or print a file.

Subsequently, we create a StandardProtectionPolicy object which adds password-based protection to the document. We can specify two types of password. The user password, after which person will be able to open a file with applied access permissions and owner password (no limitations to the file):

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ベースのプロジェクトにあります。