PDFBoxでpdfファイルに線を出力(描画)する例。
|
package com.example.pdf; import java.awt.Color; 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;
public class PdfboxExample3 { public static void main(String... args) throws IOException { try (PDDocument document = new PDDocument()) { // ページの生成 PDPage page = new PDPage(PDRectangle.A4); document.addPage(page); try (PDPageContentStream cs = new PDPageContentStream(document, page)) { // 1本目 cs.setLineWidth(1); cs.setStrokingColor(Color.BLACK); // cs.setStrokingColor(r, g, b); cs.moveTo(100, 500); cs.lineTo(600, 500); cs.stroke(); // 2本目 cs.setLineWidth(2); cs.setStrokingColor(Color.RED); cs.moveTo(600, 600); cs.lineTo(800, 600); cs.lineTo(900, 700); cs.stroke(); } document.save("D:/temp/pdfbox/example3.pdf"); } } }
線の出力にはPDPageContentStreamを使用する。
このクラスはCloseableインターフェースを実装しているので、最後にクローズする必要がある。
moveToメソッドで始点、lineToメソッドで終点を指定する。→座標体系
連続してlintToメソッドを呼び出すことで、複数の線を引く事が出来る。
strokeメソッドを呼び出すと描画が終了する。
setStrokingColorで線の色を指定する。
AWTのColorクラスを使って指定することが出来るが、内部ではr,g,bを0〜1のfloatで保持している。
intのr,g,bを渡すメソッドもある。この場合は各要素を0〜255で指定する。(内部では255fで割って保持している)
四角形を描画するにはaddRectメソッドを使う。
try (PDPageContentStream cs = new PDPageContentStream(document, page)) { cs.setStrokingColor(Color.BLUE); cs.addRect(100, 100, 300, 200); cs.stroke(); }
四角形の内部を塗りつぶすにはfillメソッドを使う。
try (PDPageContentStream cs = new PDPageContentStream(document, page)) { cs.setNonStrokingColor(Color.CYAN); cs.addRect(500, 100, 300, 200); cs.fill(); cs.stroke(); }
塗りつぶし用の色はsetNonStrokingColorメソッドで指定する。
PDFBoxには円を描画するメソッドは無いが、ベジェ曲線を描くメソッドはあるので、それで近似するらしい。[2017-09-12]
private static final float CIRCLE_Q = (float) (4 * (Math.sqrt(2) - 1) / 3); /** * 円を描画する * @param cs PDPageContentStream * @param x 中心のX座標 * @param y 中心のY座標 * @param r 半径 * @throws IOException */ static void circle(PDPageContentStream cs, int x, int y, int r) throws IOException { float p = CIRCLE_Q * r; // 右 cs.moveTo(x + r, y); // 右上(右から上) cs.curveTo(x + r, y + p, x + p, y + r, x, y + r); // 左上(上から左) cs.curveTo(x - p, y + r, x - r, y + p, x - r, y); // 左下(左から下) cs.curveTo(x - r, y - p, x - p, y - r, x, y - r); // 右下(下から右) cs.curveTo(x + p, y - r, x + r, y - p, x + r, y); }