PDFBoxでpdfファイルに文字列を出力する例。
|
package com.example.pdf; import java.io.IOException; import org.apache.pdfbox.pdmodel.PDDocument; import org.apache.pdfbox.pdmodel.PDPage; import org.apache.pdfbox.pdmodel.PDPageContentStream; import org.apache.pdfbox.pdmodel.common.PDRectangle; import org.apache.pdfbox.pdmodel.font.PDFont; import org.apache.pdfbox.pdmodel.font.PDType1Font;
public class PdfboxExample2 { public static void main(String... args) throws IOException { try (PDDocument document = new PDDocument()) { // ページの生成 PDPage page = new PDPage(PDRectangle.A4); document.addPage(page); // フォントの生成 PDFont font = PDType1Font.HELVETICA_BOLD; try (PDPageContentStream cs = new PDPageContentStream(document, page)) { // 文字列の出力 cs.beginText(); cs.setFont(font, 12); cs.newLineAtOffset(200, 500); cs.showText("Hello World"); cs.endText(); } // ファイルへの保存 document.save("D:/temp/pdfbox/example2.pdf"); } } }
文字列を出力するときはフォントを指定する必要がある。
いくつかのフォントは定数になっているのでデフォルトで使えるが、日本語を扱うにはフォントを読み込む必要がある。→フォント
文字列の出力にはPDPageContentStreamを使用する。
このクラスはCloseableインターフェースを実装しているので、最後にクローズする必要がある。
newLineAtOffsetメソッドで座標を指定し、showTextメソッドで文字列を出力する。→座標体系
showTextメソッドを複数回呼び出すと、連続して出力される。(1行の文字列になる)
cs.showText("Hello World"); cs.showText(" zzz");
showTextの引数の中に改行コードが入っているとエラーになる(例外が発生する)ので、改行したい場合は改行用のメソッドを呼び出す。
cs.setLeading(12); // 改行時の高さ(基本的にはフォントサイズと同じにしておけば良さそう) 〜 cs.showText("Hello World"); cs.newLine(); // 改行 cs.showText("zzz");
文字列を出力する際にはフォントを指定する。
いくつかのフォントはデフォルトで定義されている。
import org.apache.pdfbox.pdmodel.font.PDFont; import org.apache.pdfbox.pdmodel.font.PDType1Font;
PDFont font = PDType1Font.HELVETICA_BOLD;
が、これらのフォントでは日本語は使えないので、日本語を表示する為には日本語が入っているフォントをロードする必要がある。
ttfファイル(TrueTypeFont)のフォントを使うには以下のようにする。
(Windowsの場合、フォントファイルはC:/Windows/Fonts
の下にある)
import java.io.File; import org.apache.pdfbox.pdmodel.font.PDType0Font;
PDFont font = PDType0Font.load(document, new File("C:/Windows/Fonts/HGRSMP.TTF"));
ttcファイル(TrueTypeCollection)のフォントを使うには以下のようにする。
参考: ota-meshiさんのApache PDFBoxでのテキスト装飾(ななめ・斜体・アンダーライン・文字間隔・白抜き文字・TTCフォントファイルの読み込み・ハイパーリンク)
import java.io.File; import org.apache.fontbox.ttf.TrueTypeCollection; import org.apache.fontbox.ttf.TrueTypeFont; import org.apache.pdfbox.pdmodel.font.PDType0Font;
try (TrueTypeCollection ttc = new TrueTypeCollection(new File("C:/Windows/Fonts/msgothic.ttc"))) { // ttc.processAllFonts(ttf -> System.out.println(ttf)); TrueTypeFont ttf = ttc.getFontByName("MS-Gothic"); PDFont font = PDType0Font.load(document, ttf, true); 〜ここでfontを使用〜 }
ただ、これだとフォントを使い終わるまでttcファイルをクローズできないので、ちょっと不便。
TrueTypeCollectionのコンストラクターで引数がInputStreamのものを使うと、内部でメモリーに保持するらしく、ファイルはクローズできる。
import java.nio.file.Files; import java.nio.file.Paths; import org.apache.fontbox.ttf.TrueTypeCollection; import org.apache.fontbox.ttf.TrueTypeFont; import org.apache.pdfbox.pdmodel.font.PDType0Font;
PDFont font; try (TrueTypeCollection ttc = new TrueTypeCollection(Files.newInputStream(Paths.get("C:/Windows/Fonts/msgothic.ttc")))) { // ttc.processAllFonts(ttf -> System.out.println(ttf)); TrueTypeFont ttf = ttc.getFontByName("MS-Gothic"); font = PDType0Font.load(document, ttf, true); } 〜ここでfontを使用〜
WindowsでもUNIXでも使える日本語フォントがあるかどうか知らないが、無償のフォントを使わせてもらうのが一番簡単そう。