PDF Rendererを利用してSwingプログラムにPDFを取り込む

AcrobatReaderがあればPDFは表示できるのだけれど、それを使わずにJavaのSwingで表示したい。
JavaでPDFを扱うライブラリとしては、iTextapacheのFOPが有名だけれど、
レンダリングは含んでいないです。
探したら、PDF Rendererというのがあるらしい。


http://journal.mycom.co.jp/column/tool/033/index.html
http://java.net/projects/pdf-renderer


うぅ、バイナリ形式はないのか。
Subversionリポジトリからダウンロードする方法は以下のとおり。
1. まず、java.netにユーザ登録。そして、ログイン。
2. 端末から以下を入力し、Subversionでチェックアウト。(ubuntuの場合)

$ svn co https://svn.java.net/svn/pdf-renderer~svn pdf-renderer

これで、ソースが取得できました。
3. pdf-renderer/trunc/ に移動し、antを実行。
これで、trunk/dist/PDFRenderer.jar が生成されました。
また、javadocが trunk/dist/javadoc/ に生成されました。


マイコミジャーナルの記事を参考に、画像を作成するプログラムを書いてみました。

package pdf;

import java.awt.Image;
import java.awt.geom.Rectangle2D;
import java.awt.image.RenderedImage;
import java.io.File;
import java.io.IOException;
import java.io.RandomAccessFile;
import java.nio.ByteBuffer;
import java.nio.channels.FileChannel;

import javax.imageio.ImageIO;

import com.sun.pdfview.PDFFile;
import com.sun.pdfview.PDFPage;

public class Pdf2Image {
	public static void main(String[] args) throws IOException {
		System.out.println("Pdf2Image");
		// PDFファイルの読み込み
		File file = new File("ScalaBenOnline-1-public.pdf");
		RandomAccessFile raf = new RandomAccessFile(file, "r");
		FileChannel channel = raf.getChannel();
		ByteBuffer buf = channel.map(FileChannel.MapMode.READ_ONLY, 0, channel.size());
		PDFFile pdfFile = new PDFFile(buf);
		// 1ページ目
		PDFPage pdfPage = pdfFile.getPage(1);
		// 画像を作成
		Rectangle2D rect = pdfPage.getBBox();
		int width = (int) rect.getWidth();
		int height = (int) rect.getHeight();
		Image image = pdfPage.getImage(width, height, rect, null, true, true);
		// 保存
		ImageIO.write((RenderedImage) image, "png", new File("page-1.png"));
	}
}

画像さえ取得できれば、あとはビューアや効果的なプレゼンソフトを作ったり、3Dに貼り付けたり、自由にできます。