1.はじめに
このクイック記事では、人気をもとに焦点を当てるiTextのとPdfBox PDFドキュメントライブラリを作成するために、ゼロから。
2. 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。
私たちは、ファイルを暗号化したい場合は、追加の依存関係を追加する必要があります。ザ・バウンティの城プロバイダ。パッケージは、暗号化アルゴリズムが含まれており、2つのライブラリが必要です。
<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ファイルにテキストを挿入
のは、道の「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();
PDFを作成するために使用iTextのライブラリに基づいて(バージョン5.5.10に実装の45)文書インターフェースの要素を課題を解決するために操作されます。
あなたは、基本的にはアプリケーションのフォント文字列で、チャンクと呼ばれる最小の要素を使用して文書に追加することができます。
さらに、チャンクは、それによって美しい文書を構成する他の要素(例えば、段落、章、等)と組み合わせて使用することができます。
4.2画像を挿入
iTextのライブラリには、ドキュメントに画像を追加する簡単な方法を提供します。私達はちょうど画像のインスタンスを作成し、ドキュメントに追加する必要があります。
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セルが追加される、わずか2行を含む作成した後、各列が3つ含まれていることを意味し、作成されセル。
例を見てみましょう:
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);
});
}
第二行は、テキストのみ、追加の書式設定と、三つのセルから構成されます。
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三番目のパラメータ)の代わりに、PDFを印刷できるようにしたい場合は、お届けすることができます:
PdfWriter.ALLOW_PRINTING
もちろん、私たちは、次のようなさまざまな特権、と混合することができます:
PdfWriter.ALLOW_PRINTING | PdfWriter.ALLOW_COPY
iTextのは、アクセス権限を設定し使用することを忘れないでください、私たちはまた、一時的なPDFファイルを作成し、削除する必要があり、そうでない場合は、誰もがそれへのフルアクセスを持つことができます。
5. PdfBoxでPDFを作成します。
5.1 PDFファイルにテキストを挿入
iTextのとは対照的に、PdfBoxライブラリは、APIベースのフローの動作を提供します。クラスのような同様のチャンク/段落ませんありません。PDF PDDocumentクラス表現は、ユーザが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ライブラリは、暗号化やファイルのパーミッションを調整する可能性をユーザーに提供します。我々は唯一のPDDocumentを使用しているため、iTextのと比較すると、それは、既存のファイルを使用する必要はありません。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ファイルを作成する方法を議論しました。