PDF Rendererとは

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付属のPDFビューワ

PDF RendererはオープンソースのJavaデスクトップテクノロジーを開発している「SwingLabsプロジェクト」の成果物のひとつであり、ライセンスはLGPLv2で公開されている。java.netにある公式サイトか、またはSwingLabsのダウンロードページよりバイナリ、ソースコードおよびJavaDocsなどのファイルをダウンロードすることができる。バイナリはjar形式のファイルであり、pure Java実装なのでプラットフォームを選ばずに利用できる。

PDF RendererはJavaプログラムに組み込んで利用することを想定して開発されたライブラリであるが、簡易的なPDFビューワとしても動作するようになっている。PDFビューワは次のコマンドで実行できる(「samplefile.pdf」は任意のPDFファイルのファイル名)。

プロンプト1

> 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ビューワはデモ用の簡易的なものなので必要最低限の機能しか備えていないが、日本語を含んだファイルでも問題なく読み込めていることが分かる。

図1 PDF Renderer付属のPDFビューワでPDFファイルを開いた様子

JavaプログラムでPDFファイルを読み込む

JavaプログラムでPDF Rendererを利用するには、このjarファイルをクラスパスに含めてコンパイル/実行すればよい。PDF RendererにはPDFファイルを表すcom.sun.pdfview.PDFFileというクラスが用意されている。このクラスのインスタンスを生成するには、java.io.RandomAccessFileオブジェクトの内容をjava.nio.ByteBuffer経由でコンストラクタに渡す必要がある。たとえば、「samplefile.pdf」の内容をPDFFileオブジェクトとして読み込むコードは次のようになる。

リスト1

// 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からページ数、印刷の可否、保存の可否、バージョン番号の情報を取得して表示する例である。

リスト2

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へのパス)。

プロンプト2

> java -cp [PATH_TO_JARFILES] PdfRendererSample
ページ数: 5
印刷の可否: true
保存の可否: true
バージョン: 1.3

PDFファイルの内容を取得するには、PDFFileクラスのgetPage()メソッドを使用する。このメソッドに任意のページ番号を渡すことで、そのページの内容をcom.sun.pdfview.PDFPageオブジェクトとして取得することができる。たとえば1ページ目の内容を取得するコードは次のようになる。なお、このメソッドに0を渡すと最初のページの内容が返される。

リスト3

PDFPage pdfPage = pdfFile.getPage(1);

PDFPageオブジェクトからは、ページの内容をImageオブジェクトで取り出すなどすることによってデスクトップアプリケーションに読み込ませることができるようになる。次回はその方法を解説する。