** 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

およびhttps://search.maven.org/classic/#search%7Cga%7C1%7Ca %3A%22pdfbox%22[PdfBox]

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

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

最新版のライブラリーはここにあります。


3概要

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


4 ITextでPdfを作成する


4.1. Pdf

にテキストを挿入

「Hello World」というテキストを含む新しいファイルが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があります)。

ドキュメントに追加して使用できる最小の要素は

Chunk

と呼ばれ、基本的にはフォントが適用された文字列です。

さらに、

Chunk

‘sを

Paragraphs



Section

などの他の要素と組み合わせることで、見栄えのよい文書にすることができます。


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 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ベースのプロジェクトhttps://github.com/eugenp/tutorials/tree/master/pdf[over on GitHub]にあります。