2012年11月26日月曜日

PDFBox を試してみる

PDFBox とは

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

PDFBox
http://www.pdfbox.org/
PDFBox の実行環境構築

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();
}
}

}
}

0 件のコメント:

コメントを投稿