Aug 16, 2005

[Library] PDFBox を試してみる

PDFBox とは

PDF の読み書きから暗号化、復号化までしてくれるスグレモノの Java 用ライブラリ。 基本機能で少し遊んでみた。

PDFBox
http://www.pdfbox.org/

PDFBox の実行環境構築

  1. PDFBox(pdfbox-0.7.2.jar) をクラスパスに追加。

サンプルコード

既存 PDF の読み込み
1 byte 文字のみで構成されている PDF を読み込んで JPEG に書き出してみた。 何とも簡単に出来た。
日本語 PDF の書き出し
1 byte 文字のみの PDF 書き出しはサンプルにあったので、2 byte 文字の書き出しにチャレンジ。 TTC 形式のフォント(TTF ファイルの集合) は読み込めないので、予め BREAKTTC というツールで TTF を作成しておいた。 結局、上手く行かないまま時間切れ。(↓のコードは文字化けした PDF を出力する)。
package jp.in_vitro.codelets.pdfbox;

import java.awt.image.BufferedImage;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.List;

import org.pdfbox.exceptions.COSVisitorException;
import org.pdfbox.pdmodel.PDDocument;
import org.pdfbox.pdmodel.PDPage;
import org.pdfbox.pdmodel.edit.PDPageContentStream;
import org.pdfbox.pdmodel.font.PDFont;
import org.pdfbox.pdmodel.font.PDTrueTypeFont;

import com.sun.image.codec.jpeg.JPEGCodec;
import com.sun.image.codec.jpeg.JPEGImageEncoder;

public class Codelet {

    public Codelet() {
        super();
    }

    public static void main(final String[] args) throws COSVisitorException,
            IOException {

        Codelet me = new Codelet();
        me.createJapanesePDF(new File("c:\\workspace\\japanese.pdf"), new File(
                "c:\\workspace\\MSGOTHIC_FONT00.ttf"));
        me.convertPDFtoJPEG(new File("c:\\workspace\\english.pdf"));
    }

    public void convertPDFtoJPEG(final File target) throws IOException {

        PDDocument document = null;
        try {
            document = PDDocument.load(target);
            List pages = document.getDocumentCatalog().getAllPages();

            int count = 0;
            for (PDPage page : pages) {
                BufferedImage image = page.convertToImage();
                FileOutputStream fos = new FileOutputStream(target
                        .getAbsolutePath()
                        + "." + count++ + ".jpg");
                JPEGImageEncoder encoder = JPEGCodec.createJPEGEncoder(fos);
                encoder.encode(image);
                fos.close();
            }
        } finally {
            if (document != null) {
                document.close();
            }
        }
    }

    public void createJapanesePDF(final File target, final File fontFile)
            throws IOException, COSVisitorException {

        String message = "日本語だよ。";

        PDDocument document = null;
        try {
            PDPage page = new PDPage();
            document = new PDDocument();
            document.addPage(page);

            PDFont font = PDTrueTypeFont.loadTTF(document, fontFile);

            PDPageContentStream contentStream = new PDPageContentStream(
                    document, page);
            contentStream.beginText();
            contentStream.setFont(font, 10);
            contentStream.moveTextPositionByAmount(50, 50);
            contentStream.drawString(message);
            contentStream.endText();
            contentStream.close();
            document.save(target.getAbsolutePath());

        } finally {
            if (document != null) {
                document.close();
            }
        }

    }
}

Posted in Library | このエントリーをはてなブックマークに追加 | この記事をクリップ! livedoor クリップ |