Apache PDFBox 是成熟的 Java PDF 處理庫,可將 PDF 每頁渲染為圖片。本文提供完整 Maven 依賴、核心程式碼、編譯執行指令,並說明背景透明與白底兩種模式差異。
<dependencies>
<dependency>
<groupId>org.apache.pdfbox</groupId>
<artifactId>pdfbox</artifactId>
<version>2.0.29</version> <!-- 建議用新版 -->
</dependency>
<dependency>
<groupId>commons-logging</groupId>
<artifactId>commons-logging</artifactId>
<version>1.2</version>
</dependency>
</dependencies>
註:fontbox 已整合進 pdfbox 2.x,無需單獨引入。
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import java.util.List;
import javax.imageio.ImageIO;
import org.apache.pdfbox.pdmodel.PDDocument;
import org.apache.pdfbox.pdmodel.PDPage;
public class PdfToImage {
public static void main(String[] args) throws IOException {
if (args.length < 2) {
System.err.println("用法: java PdfToImage <輸入PDF> <輸出檔名前綴>");
return;
}
String pdfPath = args[0];
String outPrefix = args[1];
try (PDDocument doc = PDDocument.load(new File(pdfPath))) {
List<PDPage> pages = doc.getDocumentCatalog().getPages();
for (int i = 0; i < pages.size(); i++) {
PDPage page = pages.get(i);
// 白底模式(預設)
BufferedImage image = page.convertToImage();
// 透明背景模式(需 2.0+)
// BufferedImage image = page.convertToImage(BufferedImage.TYPE_INT_ARGB, 2f);
File outFile = new File(outPrefix + (i + 1) + ".png");
ImageIO.write(image, "PNG", outFile);
System.out.println("已輸出: " + outFile.getAbsolutePath());
}
}
}
}
# 編譯
javac -cp "pdfbox-2.0.29.jar:commons-logging-1.2.jar" PdfToImage.java
# 執行
java -cp ".:pdfbox-2.0.29.jar:commons-logging-1.2.jar" PdfToImage "test.pdf" "page_"
Windows 將 : 改為 ;。
| 方法 | 背景 | 適用場景 |
|---|---|---|
| convertToImage() | 白色 | 一般文件預覽、列印 |
| convertToImage(TYPE_INT_ARGB, 解析度) | 透明 | 疊加合成、UI 顯示、需保留透明度 |
-Xmx、或使用 PDFRenderer 串流渲染(2.0+)。300f/72f(300 DPI)。import org.apache.pdfbox.rendering.PDFRenderer;
// ...
PDFRenderer renderer = new PDFRenderer(doc);
BufferedImage image = renderer.renderImageWithDPI(i, 300); // 300 DPI
支援更精細的渲染控制,建議大量轉檔專案採用。