PDF Rendererを利用してSwingプログラムにPDFを取り込む
AcrobatReaderがあればPDFは表示できるのだけれど、それを使わずにJavaのSwingで表示したい。
JavaでPDFを扱うライブラリとしては、iTextやapacheの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に貼り付けたり、自由にできます。