【コラム】
PDF Rendererを使う最大のメリットは、PDF文書の内容を手軽にjava.awt.Imageオブジェクトとして取り扱える点である。ImageオブジェクトであればAWT/SwingなどのGUIアプリケーションにも簡単に取り込むことができるし、3Dオブジェクトのテクスチャイメージとして利用することもできる。Imageオブジェクトを取得する手順としては、まずPDFファイルの内容をPDFFileオブジェクトとして読み込み、次のようにgetPage()メソッドを実行する。
PDFPage pdfPage = pdfFile.getPage(1);
getPage()メソッドは引数としてページ番号を受け取り、そのページの内容をPDFPageオブジェクトとして返す。PDFPageオブジェクトは、ページの高さや幅、縦横の向き、ページ番号などの情報を含んでいる。PDFPageからは、getImage()メソッドを実行することでそのページ全体を画像として見た場合のImageオブジェクトを生成することができる。getImage()には以下の6つの引数を渡す。
以下に示すgenerateImageFromPdfPage()メソッドは、PDFPageオブジェクトを受け取り、Imageオブジェクトを生成して返すメソッドの例である。
private Image generateImageFromPdfPage(PDFPage page) {
Rectangle2D rect = page.getBBox();
int width = (int)rect.getWidth();
int height = (int)rect.getHeight();
// Imageオブジェクトの取得
Image img = page.getImage(width, height, rect, null, true, true);
return img;
}
PDFPageクラスのgetBBox()メソッドは、ページのバウンディングボックス、すなわち描画領域をjava.awt.geom.Rectangle2Dオブジェクトとして返すメソッドである。この例では、そこから取得した領域の幅と高さをgetImage()の第1、第2引数に、Rectangle2Dオブジェクトそのものを第3引数に指定している。
このgenerateImageFromPdfPage()メソッドを利用してPDF文書を描画するSwingプログラムの例を以下に示す。このコードはMyPdfViewerクラスのコンストラクタとして作成したもの。
public MyPdfViewer() throws IOException {
// PDFファイルの読み込み
RandomAccessFile raf = new RandomAccessFile(new File("samplefile.pdf"), "r");
FileChannel channel = raf.getChannel();
ByteBuffer buf = channel.map(FileChannel.MapMode.READ_ONLY, 0, channel.size());
PDFFile pdfFile = new PDFFile(buf);
// ページ数の取得
int numpages = pdfFile.getNumPages();
// ウィンドウの描画
JFrame frame = new JFrame("MyPdfViewer");
frame.setSize(630, 750);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
JPanel panel = new JPanel(new GridLayout(0,1));
JScrollPane scrollPane = new JScrollPane(panel);
// Imageオブジェクトの生成
for (int i=1; i <= numpages; i++) {
PDFPage pdfPage = pdfFile.getPage(i);
Image img = generateImageFromPdfPage(pdfPage);
panel.add(new JLabel(new ImageIcon(img)));
}
frame.add(scrollPane);
frame.setVisible(true);
}
PDFFileクラスのgetNumPages()メソッドは、PDF文書のページ数を返すメソッドである。このプログラムでは、読み込んだPDFファイルから順番に各ページのImageオブジェクトを生成し、それぞれJLabelに貼り付けてJPanel上に配置している。
このコンストラクタを呼び出すmain()メソッドは、SwingUtilitiesクラスのinvokeLater()メソッドを利用して次のようにした。
public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() {
public void run() {
try {
MyPdfViewer viewer = new MyPdfViewer();
} catch (IOException ex) {
ex.printStackTrace();
}
}
});
}
このプログラムをコンパイルして実行すると図1のように表示される。PDFファイルの内容が、全ページ縦に並んで表示されていることがわかる。
続いてJava 3Dを使った3D画像の中にPDFファイルを取り込んでみよう。Java 3Dの利用に必要なライブラリはこのサイトより入手することができる。Java 3Dの使用法などの解説は本筋ではないため省略するが、基本的には3Dキャンバス上に3Dオブジェクトを配置し、そこにテクスチャを貼り付けることで3D画像を作ることができる。Java3Dの場合、テクスチャ画像を読み込むためにTextureLoaderというクラスが用意されており、Imageオブジェクトを指定しての画像の読み込みもサポートしている。したがって、PDF Rendererを使って生成したImageオブジェクトをTextureLoaderで読み込ませれば、3DオブジェクトのテクスチャとしてPDFの内容を貼り付けることができるというわけだ。
Java 3DとPDF Rendererを利用してPDFファイルをテクスチャ画像として読み込むコードは次のようになる。
PDFPage pdfPage = pdfFile.getPage(3);
Image img = generateImageFromPdfPage(pdfPage);
TextureLoader tLoader
= new TextureLoader(img, universe.getCanvas());
Texture texture = tLoader.getTexture();
Appearance ap = new Appearance();
ap.setTexture(texture);
図2は3Dオブジェクトの平面部分に、テクスチャを利用してPDFの内容を貼り付けた例である。
一方、図3は球状の3Dオブジェクトの表面にPDFの内容を表示した例だ。球オブジェクトの描画にはJava3Dに用意されたShpereクラスを利用している。
以上のように、PDF Rendererを利用すればGUIプログラム中に簡単にPDF文書を取り込んで表示することができるようになる。PDFファイルの中身を描画するだけの機能を持ったシンプルなライブラリではあるが、うまく活用することでアプリケーションの描画能力を向上させることができるだろう。
| ビールの"のど越し"感にはホップの香りが重要 - サッポロビールが発見 [09:00 5/18] |
| Linux Mint 15登場迫る [08:00 5/18] |
| 米Google、量子コンピュータ施設を開設 - 機械学習の研究に活用 [05:50 5/18] |
| 産総研など、夏季と冬季で太陽光を自動調節する省エネ調光シートを開発 [19:37 5/17] |
| 4連続の大規模な太陽フレア発生 [19:08 5/17] |
|
[AKB48・倉持明日香]父と始球式 「しょーもないボール!」にがっくり [22:35 5/18] ホビー |
|
池田ショコラ、バニーのコスプレ姿でお尻を振り振り [22:00 5/18] エンタメ |
|
[一色伸幸]連続ドラマW「配達されたい私たち」の脚本を担当 「リトマス試験紙のようなドラマ」 [21:56 5/18] エンタメ |
|
[東京女子流]庄司芽生が急病のためライブを緊急降板 [21:53 5/18] ホビー |
|
[AKB48]バカ7の新曲「ハステとワステ」制作秘話とPV一部公開 [21:27 5/18] エンタメ |