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