【コラム】
PDF Rendererは、PDFファイルを読み込んでJavaプログラムで描画するための機能を提供するライブラリである。iTextやApache FOPは任意のPDF文書を生成したり、PDFファイルを編集をするための機能は持っていたが、PDF RendererにはそのようなPDF編集機能は用意されていない。
PDF Rendererの利点は、PDF文書の内容をjava.awt.ImageオブジェクトやGraphics2Dオブジェクトに読み込ませて描画できる点にある。これらのオブジェクトはSwingをはじめとするグラフィックライブラリで汎用的に扱うことができる。すなわち、PDF Rendererを利用すればPDFコンテンツをさまざまなGUIアプリケーションに簡単に取り込むことができるということだ。たとえばPDFをSwingアプリケーションの中に描画したり、Java 3Dと組み合わせて3Dオブジェクトにテクスチャで貼り付けたりといったことを簡単に行うことが可能になる。
あくまでもPDFの読み込みをサポートすることが目的の非常にシンプルなライブラリだが、それだけに手軽に組み込んで利用できることがメリットである。なお、PDFの生成や編集にはiTextをはじめとする他のPDFライブラリを使うことが推奨されている。
PDF RendererはオープンソースのJavaデスクトップテクノロジーを開発している「SwingLabsプロジェクト」の成果物のひとつであり、ライセンスはLGPLv2で公開されている。java.netにある公式サイトか、またはSwingLabsのダウンロードページよりバイナリ、ソースコードおよびJavaDocsなどのファイルをダウンロードすることができる。バイナリはjar形式のファイルであり、pure Java実装なのでプラットフォームを選ばずに利用できる。
PDF RendererはJavaプログラムに組み込んで利用することを想定して開発されたライブラリであるが、簡易的なPDFビューワとしても動作するようになっている。PDFビューワは次のコマンドで実行できる(「samplefile.pdf」は任意のPDFファイルのファイル名)。
> java -jar pdf-renderer-1.0.5.jar samplefile.pdf
図1は本連載の記事をPDF化したファイルをPDF Renderer(この例ではバージョン1.0.5を利用しているのでjarファイル名はpdf-renderer-1.0.5.jar)で開いた様子である。このPDFビューワはデモ用の簡易的なものなので必要最低限の機能しか備えていないが、日本語を含んだファイルでも問題なく読み込めていることが分かる。
JavaプログラムでPDF Rendererを利用するには、このjarファイルをクラスパスに含めてコンパイル/実行すればよい。PDF RendererにはPDFファイルを表すcom.sun.pdfview.PDFFileというクラスが用意されている。このクラスのインスタンスを生成するには、java.io.RandomAccessFileオブジェクトの内容をjava.nio.ByteBuffer経由でコンストラクタに渡す必要がある。たとえば、「samplefile.pdf」の内容をPDFFileオブジェクトとして読み込むコードは次のようになる。
// 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);
PDFFileクラスには、PDFファイルの情報を取得するための各種メソッドが定義されている。たとえばページ数を取得するgetNumPages()やバージョン番号を表す文字列を取得するgetVersionString()、目次ツリーのルートノードを取得するgetOutline()などがある。以下のプログラムは、samplefile.pdfからページ数、印刷の可否、保存の可否、バージョン番号の情報を取得して表示する例である。
import com.sun.pdfview.PDFFile;
import java.io.*;
import java.nio.ByteBuffer;
import java.nio.channels.FileChannel;
public class PdfRendererSample {
public static void main(String[] args) {
try {
// 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);
// PDFファイルの情報を表示
System.out.println ("ページ数: "+pdfFile.getNumPages());
System.out.println ("印刷の可否: "+pdfFile.isPrintable());
System.out.println ("保存の可否: "+pdfFile.isSaveable());
System.out.println ("バージョン: "+pdfFile.getVersionString());
} catch (IOException ex) {
ex.printStackTrace();
}
}
}
このプログラムをコンパイルして実行すると、次のようにページ数などの情報が表示される([PATHTOJARFILES]はpdf-renderer-1.0.5.jarへのパス)。
> java -cp [PATH_TO_JARFILES] PdfRendererSample
ページ数: 5
印刷の可否: true
保存の可否: true
バージョン: 1.3
PDFファイルの内容を取得するには、PDFFileクラスのgetPage()メソッドを使用する。このメソッドに任意のページ番号を渡すことで、そのページの内容をcom.sun.pdfview.PDFPageオブジェクトとして取得することができる。たとえば1ページ目の内容を取得するコードは次のようになる。なお、このメソッドに0を渡すと最初のページの内容が返される。
PDFPage pdfPage = pdfFile.getPage(1);
PDFPageオブジェクトからは、ページの内容をImageオブジェクトで取り出すなどすることによってデスクトップアプリケーションに読み込ませることができるようになる。次回はその方法を解説する。
| 花粉の運び屋“マルハナバチ”の国勢調査 [18:11 5/24] |
| 「Arid5a」は自己免疫疾患を引き起こすカギ分子の可能性大 - 阪大 [17:39 5/24] |
| 岡山大、中枢神経の「ランビエ絞輪」形成機構の解明に1歩前進 [17:35 5/24] |
| 細胞間接着を担うタンパク質「クローディン」に関する発見 - 阪大など [17:32 5/24] |
| パナソニック、LEDに匹敵する照明用高効率白色有機EL素子を開発 [17:29 5/24] |
|
料理研究家・森崎友紀、競泳水着で水中ターン「見せることが出来てうれしい」 [11:30 5/26] エンタメ |
|
[武井壮]1日45分睡眠の謎が明らかに [11:00 5/26] エンタメ |
|
福岡県・博多には全国にユーモアをふりまく企業戦士「サラ忍マン」がいる! [11:00 5/26] 旅行 |
|
男性がキュンとした女性の香り -「シャンプー」「汗の匂い」「洗濯洗剤」 [11:00 5/26] 恋愛・結婚 |
|
貫地谷しほり、黄色いバラを観客に手渡しでプレゼント! 映画『くちづけ』 [11:00 5/26] エンタメ |