Pdf-rendererを使用。
日本語フォントはPDFに埋め込まれていないとエラーになります。
package org.codelibs.pdf2image; import java.awt.Image; import java.awt.Rectangle; import java.awt.image.BufferedImage; import java.io.File; import java.io.IOException; import java.io.RandomAccessFile; import java.nio.ByteBuffer; import java.nio.channels.FileChannel; import javax.imageio.ImageIO; import com.sun.pdfview.PDFFile; import com.sun.pdfview.PDFPage; public class Pdf2Image { /** * PDF1ページ分をImageオブジェクトに変換します * @param page * @return */ public static Image pdf2image(PDFPage page) { int w = (int) page.getBBox().getWidth(); int h = (int) page.getBBox().getHeight(); // get the width and height for the doc at the default zoom Rectangle rect = new Rectangle(0, 0, w, h); // generate the image return page.getImage(rect.width, rect.height, // width & height rect, // clip rect null, // null for the ImageObserver true, // fill background with white true // block until drawing is done ); } /** * PDFファイルの任意のページを抽出します。 * @param pdf * @param page * @return */ public static PDFPage getPDFPage(File pdf, int page) { RandomAccessFile raf = null; try { raf = new RandomAccessFile(pdf, "r"); FileChannel channel = raf.getChannel(); ByteBuffer buf = channel.map(FileChannel.MapMode.READ_ONLY, 0, channel.size()); PDFFile pdfFile = new PDFFile(buf); return pdfFile.getPage(page); } catch (Exception e) { e.printStackTrace(); } finally { if (raf != null) { try { raf.close(); } catch (IOException e) { // do nothing } } } return null; } /** * PDFファイルをPNGファイルに変換します。 * @param pdfPath 読み込むPDFファイルのパス * @param outPath 出力する画像ファイルのパス * @return */ public static int printImage(String pdfPath,String outPath,int page) { File f = new File(pdfPath); PDFPage pdfPage = getPDFPage(f, page); int w = (int) pdfPage.getBBox().getWidth(); int h = (int) pdfPage.getBBox().getHeight(); Image img = pdf2image(pdfPage); BufferedImage buffered = new BufferedImage(w, h, Image.SCALE_SMOOTH); buffered.getGraphics().drawImage(img, 0, 0, null); try { save(buffered, new File(outPath)); } catch (IOException e) { e.printStackTrace(); } return 0; } public static void save(BufferedImage img, File f) throws IOException { if (!ImageIO.write(img, "PNG", f)) { throw new IOException("フォーマットが対象外"); } } }
呼び出し側
private static final String SAMPLE_PDF = "./data/sample.pdf"; private static final String SAMPLE_PNG = "./data/sampleImage.png"; public void testPrintSize(){ Pdf2Image.printImage(SAMPLE_PDF, SAMPLE_PNG,1); }