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);
}