JavaのPDFBoxでpdfからjpgに変換する
| 前提 |
|---|
| Java 1.7 |
| PDFBox 2.0.23 |
pdfをページごとにjpgに変換したかったのでPDFBoxライブラリを使ってjpgに変換してみました。
PDFBox2系でPDPage.convertToImage、PDFImageWriterが廃止されたようです。
また、ImageIOUtilクラスはpdfbox-tools-x.x.x.jarに移動しています。
PDFRendererクラスのrenderImageWithDPIメソッドが遅い
renderImageWithDPIメソッドの呼び出しがかなり時間がかかります。
第一引数はページインデックスで、ゼロ基底です。
第二引数はDPIを指定します。300や600などです。
第三引数はImageTypeを指定します。
このメソッドはオーバーロードで2つメソッドがありますので、第三引数を省略した場合はデフォルトはImageType.RGBとなります。
サンプル
package jp.co.confrage;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import org.apache.pdfbox.io.MemoryUsageSetting;
import org.apache.pdfbox.pdmodel.PDDocument;
import org.apache.pdfbox.pdmodel.PDPage;
import org.apache.pdfbox.rendering.ImageType;
import org.apache.pdfbox.rendering.PDFRenderer;
import org.apache.pdfbox.tools.imageio.ImageIOUtil;
public class Sample {
static long startTime = System.currentTimeMillis ();
public static void main(String[] args) {
logTime("start.");
try (PDDocument doc = PDDocument.load(new File("sample.pdf"), MemoryUsageSetting.setupTempFileOnly())) {
int i = 0;
PDFRenderer pdfRenderer = new PDFRenderer(doc);
for (PDPage page : doc.getPages()) {
logTime("renderImageWithDPI start.");
BufferedImage image = pdfRenderer.renderImageWithDPI(i, 300, ImageType.RGB);
logTime("renderImageWithDPI end.");
ImageIOUtil.writeImage(image, String.format("%03d.jpg", i++), 300);
}
} catch (IOException e) {
e.printStackTrace();
}
logTime("end.");
}
public static void logTime (String msg) {
long now = System.currentTimeMillis ();
System.out.println (String.format ("%.3f ms: %s", (now - startTime) / 1000.0, msg));
startTime = now;
}
}
ghostscriptでラスタライズするのと比較するとrenderImageWithDPIメソッドは遅いようです。
jvmメモリ割り当てで速度改善できるか
jvmに結構なメモリ割り当てたら速度改善できるかと思って試してみましたが、速度改善できませんでした。
やはりImagemagickが良いようですが、ghostscriptのライセンスがGPL(AGPL)なのがネックとなるようです。
参考サイト
Apache PDFBox | PDFBox 2.0.0 Migration Guide
The Apache PDFBox™ library is an open source Java tool for working with PDF documents. This project allows creation of n...

KHI入社して退社。今はCONFRAGEで正社員です。関西で140-170/80~120万から受け付けております^^
得意技はJS(ES20xx),Java,AWSの大体のリソースです
コメントはやさしくお願いいたします^^
座右の銘は、「狭き門より入れ」「願わくは、我に七難八苦を与えたまえ」です^^


コメント