處理PDF轉存失敗的解決方案,pdftoppm 安裝與使用,PDF 強制轉存 JPG、PNG、批次轉檔與 Poppler 延伸功能

如果你平常需要處理大量 PDF,應該多少遇過這幾種情況:Adobe Acrobat 可以正常開啟 PDF,轉存 JPG 或 PNG 時卻突然報錯;線上 PDF 轉檔工具有檔案大小限制;又或者你只是想一次把幾十份 PDF 自動轉成圖片,不想每份都手動點選。

這時候,pdftoppm 就是一個相當實用的工具。

它不需要圖形介面,只要一行指令就能把整份 PDF 轉成 PNG、JPG 等圖片,也很適合搭配 PowerShell、Python、OCR 或 AI 文件分析流程。pdftoppm 本身屬於 Poppler 工具組,會利用 PDF 渲染引擎重新繪製頁面,而不是單純把 PDF 裡的檔案解包出來。

本文就從一般使用者實際會遇到的需求出發,介紹 Windows、macOS、Linux 如何安裝 pdftoppm,以及 PDF 轉 PNG、JPG、指定頁面、DPI、批次轉檔與其他 Poppler 延伸功能。

一、pdftoppm 是什麼?

pdftoppm 是 Poppler 提供的命令列工具,名稱來自 PDF to Portable Pixmap

它最大的用途,就是把 PDF 的每一頁重新渲染成圖片。

例如原本有一份:

document.pdf

裡面有 18 頁,透過 pdftoppm 就可以一次產生:

page-1.png
page-2.png
page-3.png
...
page-18.png

目前常見的輸出格式包括:

  • PNG
  • JPEG / JPG
  • TIFF
  • PPM

由於它是透過 Poppler 渲染 PDF,因此 PDF 裡面的文字、向量圖形、圖片等內容都會重新 Rasterize 成點陣圖片。它特別適合用在批次轉檔、OCR、AI Vision、RAG 文件處理與後端自動化。

有一點需要先釐清:

pdftoppm 並不是 PDF 修復工具。

它不會真正把 PDF 裡面損壞的 Object、XRef 或頁面結構修好,而是使用另一套 Renderer 嘗試把頁面重新畫出來。

這也是為什麼有些 PDF 使用 Adobe Acrobat 轉圖片會失敗,但 pdftoppm 卻可能正常輸出。

二、Poppler 與 pdftoppm 有什麼關係?

安裝 pdftoppm 時,實際上通常安裝的是整套 Poppler

Poppler 是一套開源 PDF Rendering Library,從 Xpdf 專案演化而來。在 Linux 與許多開源 PDF 軟體中都有廣泛應用。

安裝後通常不只有 pdftoppm,而是會得到一整套 PDF 工具:

Poppler
├── pdftoppm
├── pdftocairo
├── pdftotext
├── pdfimages
├── pdfinfo
├── pdffonts
└── pdftohtml

它們各自有不同用途:

  • pdftoppm:把完整 PDF 頁面轉成圖片
  • pdftocairo:PDF 轉 PNG、SVG、PDF、EPS 等格式
  • pdftotext:擷取 PDF 中的文字
  • pdfimages:擷取 PDF 裡原始內嵌圖片
  • pdfinfo:查看頁數、尺寸、PDF 版本、加密狀態等
  • pdffonts:檢查 PDF 使用哪些字型
  • pdftohtml:將 PDF 內容轉換成 HTML

如果只是「我要把 PDF 每頁轉成 JPG 或 PNG」,先學會 pdftoppm 就已經可以處理大部分需求。

三、Windows、macOS、Linux 如何安裝 pdftoppm?

Windows 安裝

Windows 使用者比較容易卡在這一步,因為不像 Linux 可以直接透過系統套件管理器安裝。

其中一種方式,是下載編譯好的 Windows Poppler

例如解壓縮到:

C:\Tools\poppler\

通常可以在:

C:\Tools\poppler\Library\bin\

看到:

pdftoppm.exe

完整路徑可能是:

C:\Tools\poppler\Library\bin\pdftoppm.exe

可以先直接在 PowerShell 測試:

& "C:\Tools\poppler\Library\bin\pdftoppm.exe" -v

如果有顯示版本資訊,就代表可以正常執行。

接著再把:

C:\Tools\poppler\Library\bin

加入 Windows 的 PATH 環境變數,以後就可以直接執行:

pdftoppm -v

Windows 也可以透過 Conda 安裝:

conda install -c conda-forge poppler

不過繁體中文 Windows 環境有時可能遇到:

UnicodeDecodeError: cp950
Rolling back transaction

如果安裝最後看到 Rolling back transaction,代表套件其實已經被回滾,這時直接改用 Windows Standalone binary 通常比較省時間。

macOS

macOS 使用 Homebrew 最簡單:

brew install poppler

安裝完成:

pdftoppm -v

Ubuntu / Debian

Linux 可以直接:

sudo apt update
sudo apt install poppler-utils

安裝完成後同樣測試:

pdftoppm -v

macOS 與 Ubuntu / Debian 的安裝方式也都包含在原始資料中。

四、pdftoppm 基本用法:PDF 轉 PNG、JPG

pdftoppm 基本用法 圖片

基本語法其實非常簡單:

pdftoppm [參數] input.pdf output

最後面的 output 並不是輸出的單一檔案名稱,而是「檔名前綴」。

例如:

pdftoppm -png input.pdf page

就會產生:

page-1.png
page-2.png
page-3.png
...

PDF 轉 PNG

pdftoppm -png input.pdf page

如果 PDF 主要是:

  • 文字
  • 表格
  • UI
  • 網頁截圖
  • 線稿

通常比較適合 PNG。

PDF 轉 JPG

pdftoppm -jpeg input.pdf page

如果主要是:

  • 掃描文件
  • 照片
  • 圖片型 PDF
  • 想降低檔案容量

就可以使用 JPG。

如果還要控制 JPEG 品質:

pdftoppm -jpeg -jpegopt quality=95 input.pdf page

這些也是 pdftoppm 最核心的格式轉換操作。

五、如何設定 DPI 與輸出圖片尺寸?

PDF 轉成圖片時,最常遇到的問題就是:

到底要用多少 DPI?

最常見的寫法:

pdftoppm -png -r 300 input.pdf page

其中:

-r 300

就是以 300 DPI 渲染。

常見可以這樣選:

DPI適合用途
72~96 DPI縮圖、快速預覽
150 DPI一般網頁圖片
300 DPIOCR、文件保存、印刷
600 DPI小字、印章、高精細文件

300 DPI 通常是畫質、OCR 準確率與處理速度之間比較實用的平衡點。

但 DPI 不是越高越好。

DPI 提高之後:

畫質 ↑
圖片尺寸 ↑
檔案容量 ↑
RAM 使用量 ↑
處理時間 ↑

如果圖片最後是要放網站、交給 AI Vision 或傳 API,也可以直接限制最大尺寸:

pdftoppm -png -scale-to 1920 input.pdf page

這樣可以避免輸出一張動輒 4000~6000px 的圖片。

六、如何只轉 PDF 指定頁面?

不一定每次都要把整份 PDF 轉完。

例如只想轉第 5 頁:

pdftoppm -png -f 5 -l 5 input.pdf page

其中:

-f = First Page
-l = Last Page

如果想轉第 3~10 頁:

pdftoppm -png -f 3 -l 10 input.pdf page

除了頁數之外,還可以使用:

-x
-y
-W
-H

指定頁面的某個區域。

例如:

pdftoppm -png -f 1 -l 1 -x 0 -y 0 -W 800 -H 600 input.pdf crop_page

這對一些自動化應用非常有用,例如:

  • 只截發票號碼
  • 只取表格
  • 只取身分證照片
  • 擷取特定欄位
  • OCR 指定區域

相關的頁數與 Cropping 參數可參考原始內容。

七、如何一次批次轉換大量 PDF?

如果資料夾裡有:

A.pdf
B.pdf
C.pdf

一個一個輸入指令顯然很麻煩。

Windows PowerShell 可以直接:

Get-ChildItem *.pdf | ForEach-Object {
    $name = $_.BaseName

    New-Item -ItemType Directory -Force $name | Out-Null

    pdftoppm `
        -png `
        -r 300 `
        $_.FullName `
        "$name\page"
}

執行後會產生:

A\
B\
C\

例如:

A\
├── page-1.png
├── page-2.png
└── page-3.png

每份 PDF 都會自動建立自己的輸出資料夾。

macOS 或 Linux 也可以透過 Bash for 迴圈完成相同工作。

如果每天需要處理幾十甚至幾百份 PDF,這也是命令列工具相較圖形介面最大的優勢之一。

八、如何確認 PDF 有沒有完整轉出?

批次處理時不能只看程式「沒有報錯」,還要確認頁數真的一致。

首先可以使用:

pdfinfo input.pdf

查看:

Pages: 18

或者使用 QPDF:

qpdf --show-npages input.pdf

假設結果是:

18

接著在 Windows PowerShell 計算輸出的圖片:

(Get-ChildItem ".\pdf_images\page-*.png").Count

如果得到:

18

就可以理解為:

PDF Pages = 18
Images    = 18

所有頁面都有產生圖片。

如果變成:

PDF Pages = 18
Images    = 12

就表示中間可能有頁面渲染失敗或程式中斷。

將原始頁數與輸出圖片數量互相比對,是自動化 PDF 處理很值得加入的一道驗證程序。

九、pdftoppm 常見錯誤與排除方式

常見錯誤與排除方式圖片

「pdftoppm 無法辨識」

Windows 如果看到:

pdftoppm : 無法辨識 'pdftoppm'

通常不是 PDF 出問題,而是 Windows 找不到 pdftoppm.exe

可以先:

where.exe pdftoppm

如果沒有任何結果,代表:

  • 尚未安裝
  • PATH 沒設定
  • Conda 安裝失敗或已 Rollback

也可以完全不依賴 PATH:

& "C:\Tools\poppler\Library\bin\pdftoppm.exe" -v

PDF 可以開,但轉換失敗

可以先檢查:

pdfinfo input.pdf

看看:

  • 頁數
  • PDF Version
  • 是否加密

再透過:

qpdf --check input.pdf

檢查 PDF 低階結構。

如果 PDF 有密碼,也可以使用:

pdftoppm -png -upw "password" input.pdf page

這些排錯方式在原始資料的故障排除章節也有整理。

十、pdftoppm、pdftocairo、pdfimages 有什麼不同?

這三個工具很容易被搞混。

pdftoppm

它做的是:

PDF Page
   ↓
重新 Render
   ↓
PNG / JPG

如果你想要的是:

把整張 PDF 頁面的「畫面」存成圖片

通常使用 pdftoppm

pdftocairo

pdftocairo 同樣可以渲染 PDF,但輸出種類更廣,例如:

pdftocairo -svg input.pdf output.svg

除了 PNG、JPEG 外,還可以輸出 SVG、PDF、EPS、PS 等。

pdfimages

pdfimages 完全是另一種用途。

pdfimages -all input.pdf img

它不是把 PDF 頁面重新畫成圖片,而是:

PDF
 ↓
尋找內嵌圖片
 ↓
把 Image Object 抽出來

也就是說,如果 PDF 中放了一張 4000 × 3000 的照片,你只是想拿到那張原始照片,就應該優先用 pdfimages,而不是把整張 PDF 頁面截成圖片。

三者的核心差異也可以整理成:pdftoppm 偏整頁光柵化、pdftocairo 偏多格式輸出,而 pdfimages 是原始圖片抽取。

十一、pdftoppm 延伸應用:OCR、Python 與 AI

pdftoppm 真正有價值的地方,並不只是「PDF 轉 PNG」。

例如掃描 PDF 本身可能完全沒有文字層:

PDF
 ↓
pdftoppm
 ↓
300 DPI PNG
 ↓
OCR
 ↓
文字

後面可以接:

  • Tesseract
  • PaddleOCR
  • Google Vision
  • Azure OCR
  • AI Vision Model

如果本身使用 Python,也可以使用 pdf2image

例如:

from pdf2image import convert_from_path

pages = convert_from_path(
    "document.pdf",
    dpi=300
)

for i, page in enumerate(pages):
    page.save(f"page-{i + 1}.png")

pdf2image 可以透過 Poppler 完成 PDF 頁面轉換,因此很適合整合進程式。

再進一步就可以做:

PDF Upload
     ↓
pdftoppm
     ↓
PNG
     ↓
OCR
     ↓
結構化資料
     ↓
Database / RAG / AI

例如:

  • FastAPI PDF 轉圖片 API
  • 自動 OCR
  • 合約分析
  • 發票辨識
  • PDF 自動分類
  • RAG 文件匯入
  • AI 多模態分析

這時 pdftoppm 就不只是轉檔工具,而會變成整個文件自動化 Pipeline 的其中一環。

十二、實戰:Acrobat 無法轉存 PDF 時,pdftoppm 能做什麼?

最後來看一個很典型的實際狀況。

假設手上有一份:

18 頁 PDF

Adobe Acrobat 可以開啟,但使用:

轉存 PDF → 影像 → PNG / JPG

卻跳出:

預期字典物件

按下「忽略」之後,甚至可能只有部分頁面成功輸出。

這時先用:

qpdf --check input.pdf

結果可能出現:

No syntax or stream encoding errors found

再使用:

qpdf --show-npages input.pdf

又確認:

18

這表示從 QPDF 能檢查到的低階語法來看,PDF 頁面數仍然存在。

接著就可以換一套 Renderer:

pdftoppm -png -r 300 input.pdf page

如果最後順利得到:

page-1.png
page-2.png
...
page-18.png

就代表至少 Poppler 能夠把這 18 個頁面渲染出來。原始資料中的實戰案例同樣是以 Acrobat 出現「預期字典物件」、QPDF 檢查無明顯語法錯誤,再改用 pdftoppm 輸出的方式處理。

所以遇到 Acrobat 轉存失敗時,不要立刻認為「PDF 18 頁已經壞掉」。

比較準確的理解是:

Acrobat 無法處理某個 PDF 結構,不代表其他 PDF Renderer 一定也無法解析。

這也是 pdftoppm 很值得放進工具箱的原因。

最後整理幾個最常用的指令:

# 查看版本
pdftoppm -v

# PDF → PNG
pdftoppm -png input.pdf page

# PDF → JPG
pdftoppm -jpeg input.pdf page

# 300 DPI PNG
pdftoppm -png -r 300 input.pdf page

# 第 3~10 頁
pdftoppm -png -f 3 -l 10 input.pdf page

# JPG 品質 95
pdftoppm -jpeg -jpegopt quality=95 input.pdf page

# 最大長邊 1920px
pdftoppm -png -scale-to 1920 input.pdf page

# 密碼 PDF
pdftoppm -png -upw "password" input.pdf page

對一般使用者而言,pdftoppm 可以取代許多手動 PDF 轉圖工作;對開發者而言,它更可以與 PowerShell、Python、OCR、AI Vision 與後端 API 結合。

特別是遇到 Acrobat 無法轉存、需要一次處理大量 PDF,或準備建立 OCR / AI 文件處理系統時,Poppler 與 pdftoppm 都是非常值得熟悉的一組工具。

贊助商連結

發佈留言