S-JIS[2017-09-11/2017-09-12] 変更履歴

Apache PDFBox 線描画

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

PDFBoxへ戻る / 技術メモへ戻る
メールの送信先:ひしだま