在 Python 中提取 PDF 文字(PDFtoTXT),最推薦的工具是 pdfplumber。
它能精準解析電子檔文字與表格,並解決多數中文亂碼問題。
若是處理圖片式的掃描檔,則需搭配 pytesseract 進行 OCR 光學辨識。
本文將對比 PyPDF2、pdfplumber 與 pytesseract,幫助新手快速選擇最適合的自動化方案。

Python 常用的PDF 中提取文字檔(.txt)套件
下列主要介紹三種文字轉換用的套件,分別有
- PyPDF2
- pdfplumber
- pytesseract
以及最後會介紹將 pdfplumber 和 pytesseract 串連起來一同做使用,會有更快速的文字辨識效果。
PyPDF2
主要的用途是處理簡單的 PDF 檔案,例如合併、拆分、旋轉、加密、解密,以及提取文字。
- 優點:
- 支援讀取與修改 PDF 結構,但不支援影像內的文字擷取(無光學文字識別 OCR 功能)。
- 缺點 :
- 在提取中文(或其他非 ASCII 字符)時,常會遇到亂碼或無法解析的問題。
- 提取的文字格式可能會比較亂,特別是多欄位或複雜的格式。
安裝方式 :
pip install pypdf2
範例 :
import PyPDF2
# 讀取你的 .pdf 檔案
with open("example.pdf", "rb") as file:
reader = PyPDF2.PdfReader(file)
text = ""
for page in reader.pages:
text += page.extract_text()
print(text)
# 儲存提取的文字為 .txt 文件
with open("PyPDF2_output.txt", "w") as text_file:
text_file.write(text)
pdfplumber
比 PyPDF2 更強大,特別適用於精準提取文字、表格和圖片。
- 優點:
- 支援解析 PDF 內的表格(比
PyPDF2更精確)。 - 可提取圖片,並獲取圖片的座標資訊。
- 適用於結構化 PDF 文件(如報告、發票等)。
- 支援解析 PDF 內的表格(比
- 缺點 :
- 在解析文件的時候,因為需要額外處理字體、坐標、圖片等資訊,所以速度較
PyPDF2慢 - 當處理較大量文件或多頁的 PDF 時,速度會慢的更加明顯。
- 在解析文件的時候,因為需要額外處理字體、坐標、圖片等資訊,所以速度較
安裝方式 :
pip install pdfplumber
範例 :
import pdfplumber
# 開啟你的 .pdf 檔案
with pdfplumber.open("example.pdf") as pdf:
text = ""
for page in pdf.pages:
text += page.extract_text()
print(text)
# 儲存提取的文字為 .txt 文件
with open("pdfplumber_output.txt", "w") as text_file:
text_file.write(text)
pytesseract
這是一個光學文字識別(Optical Character Recognition)的工具,專門用來從圖片或掃描的 PDF 文件中提取文字。
- 優點:
- 需要搭配
Tesseract OCR(Google 開源的 OCR 引擎)。 - 適合用於掃描的 PDF,因為
PyPDF2和pdfplumber無法從影像型 PDF 提取文字。 - 可支援多國語言,但需要安裝對應語言的 OCR 模型,安裝方式可以到參考資料瀏覽。
- 需要搭配
- 缺點 :
- 無法直接處理低解析度或模糊的圖片,容易出現辨識錯誤。
- 圖片中如果有噪點、陰影、手寫文字或扭曲變形,效果會變差。
- 若要增加辨識效果,需搭配影像處理的預處理方法。
- 若要安裝特定國家語言,需要手動下載語言包。
- 需要額外處理圖片(如二值化、降噪等)來提升辨識準確率。
安裝方式 :
pip install pytesseract
還需要安裝 Tesseract OCR:
- Windows: 下載安裝 Tesseract-OCR,並將安裝路徑加入環境變數。
範例(從圖片中提取文字):
import pytesseract
from PIL import Image
img = Image.open("scanned_page.png")
text = pytesseract.image_to_string(img, lang="eng") # 指定語言
print(text)
# 儲存提取的文字為 .txt 文件
with open("pytesseract_output.txt", "w") as text_file:
text_file.write(text)
範例(從 PDF 影像提取文字):
import pdfplumber
import pytesseract
from PIL import Image
with pdfplumber.open("scanned_document.pdf") as pdf:
for page in pdf.pages:
img = page.to_image()
text = pytesseract.image_to_string(img, lang="eng")
print(text)
# 儲存提取的文字為 .txt 文件
with open("pytesseract_output.txt", "w") as text_file:
text_file.write(text)
pdfplumber+pytesseract
將 pdfplumber 與 pytesseract 結合使用,可以同時處理電子文本 PDF和掃描版 PDF(影像型 PDF),並且比單獨使用 PyPDF2 或 pytesseract 更靈活且準確。
優點:
- 能處理「數位 PDF + 掃描 PDF」的混合文件,即使一份文件中包含數位文字與掃描頁面,也能正確解析。
- 數位 PDF:直接用
pdfplumber.extract_text()提取文字,準確且無需 OCR。 - 掃描 PDF(影像型 PDF):使用
pdfplumber轉換 PDF 頁面為影像,再用pytesseract進行 OCR 文字識別。
- 數位 PDF:直接用
- 相比單獨
pytesseract,透過pdfplumber預處理後的影像能獲得更清晰的文字輸出。pdfplumber允許獲取高品質的 PDF 頁面影像,比直接使用pytesseract讀取低解析度的 PDF 頁面效果更好。- 可使用
pdfplumber獲取影像的 DPI(解析度),確保pytesseract輸入的影像清晰度足夠高(DPI 150 以上可提高辨識率)。 - 影像處理(如灰階化、二值化、降噪)可以先透過
pdfplumber與PIL來最佳化,再送入pytesseract進行 OCR。
- 可同時處理數位表格和掃描表格,提高數據提取的準確性。
pdfplumber可以準確識別數位 PDF 裡的表格 (extract_table()),而pytesseract不擅長直接解析表格格式。- 如果表格是圖片型的(如掃描 PDF),可以:
- 用
pdfplumber轉換 PDF 頁面為影像。 - 使用 OpenCV 進行表格邊緣檢測,將表格切割為獨立儲存格。
- 再使用
pytesseractOCR 逐行辨識文字。
- 用
- 更精細的版面控制,能避免 OCR 讀取多餘內容,提高準確率。
pdfplumber提供頁面元素的座標資訊,如:- 文字區塊的位置
- 圖片的位置
- 表格結構
- 透過
pdfplumber提取影像的區域(ROI,Region of Interest),可以只對某個部分進行 OCR,而非整頁都 OCR,減少誤差。
- 更高效的處理流程,比單純 OCR 方案更快,避免不必要的 OCR 運算。
pdfplumber只對數位文本部分進行解析,不需要進行 OCR,速度快。- 只有真正需要 OCR 的頁面才會轉成圖片給
pytesseract,降低處理時間。 - 可以根據
pdfplumber解析結果來判斷是否真的需要 OCR,例如:
if not page.extract_text():
# 只有當數位提取失敗時才使用 OCR
text = pytesseract.image_to_string(image)
範例 : 先用 pdfplumber 提取數位文字,遇到圖片再用 pytesseract
import pdfplumber
import pytesseract
from PIL import Image
def extract_text_from_pdf(pdf_path):
text_result = ""
with pdfplumber.open(pdf_path) as pdf:
for page in pdf.pages:
text = page.extract_text()
if text:
text_result += text + "\\n"
else:
# 如果文字提取失敗,則使用 OCR
img = page.to_image().convert("L") # 轉灰階,提高辨識效果
text_result += pytesseract.image_to_string(img, lang="chi_sim+eng") + "\\n"
return text_result
pdf_text = extract_text_from_pdf("example.pdf")
print(pdf_text)
# 儲存提取的文字為 .txt 文件
with open("pdfplumber_and_pytesseract_output.txt", "w") as text_file:
text_file.write(text)
如何選擇合適的套件
| 需求 | 推薦套件 | 操作難度 |
|---|---|---|
| 解析純文字 PDF | PyPDF2、pdfplumber | ★☆☆ |
| 解析 PDF 表格 | pdfplumber | ★☆☆ |
| 解析含圖片的 PDF | pdfplumber | ★☆☆ |
| OCR 處理掃描 PDF 或圖片 | pytesseract | ★★★ |
討論
Q1: 為什麼 PyPDF2 讀取出來的中文是亂碼?
A: 這是因為 PDF 的字體編碼問題,PyPDF2 對於非 ASCII 字符(如繁體中文)支援度較低。建議改用 pdfplumber 或將頁面轉成圖片後使用 pytesseract 進行辨識。
Q2: 如何提取 PDF 中的表格數據?
A: 建議使用 pdfplumber。它內建的 `extract_table()` 功能可以直接偵測表格線條並轉為 Python 列表(List),準確度遠高於 PyPDF2。
Q3: 掃描的 PDF (影像型) 讀不到文字怎麼辦?
A: 這種文件不包含文字圖層,必須使用 OCR (光學文字辨識) 技術。推薦使用 `pytesseract` 搭配 Google 的 Tesseract OCR 引擎。
Q4: pdfplumber 和 PyPDF2 哪個比較快?
A: PyPDF2 處理速度較快,但功能單一;pdfplumber 因需解析坐標與字體資訊,速度較慢,但解析品質更好。
Q5: 執行 pytesseract 時顯示 “TesseractNotFoundError” 是什麼原因?
A: 這是因為電腦尚未安裝 Tesseract OCR 主程式,或未將其執行路徑加入系統的環境變數(PATH)中。
本篇文章介紹了三種不同的 python 套件,用來進行 PDF 檔案進行文字內容的提取,可以發現更為複雜的工具合併使用能夠得到最佳的表現。
相對需要的技術要求也會更高,優點則是可以同時處理更加複雜的 PDF 檔案,也能加快檔案的解析速度,希望本文的內容可以讓大家對於 PDF 檔案提取文字的細節知識有更多的了解。
為了解決讀者「不知道該選哪個」的痛點,建議加入以下步驟清單:
送給讀者的【PDF 工具選擇 3 步決策法】
若看到這裡你還不太確定自己應該使用哪種方式,下面我將提供給你一個「選擇決策樹」小工具,你只要依照他的順序來進行評估,就知道自己適合使用哪一款工具囉!
1. 文件是電子檔(可選取文字)嗎?
- 是 ➔ 優先用 pdfplumber(精準度高)。
- 否(掃描檔/照片)➔ 跳至步驟 3。
2. 只需要簡單合併、分割檔案?
- 是 ➔ 用 PyPDF2(輕量快速)。
3. PDF 內容是圖片嗎?
- 是 ➔ 必須安裝 Tesseract OCR 並使用 pytesseract 套件。
想開始自動化處理報表嗎?
立即複製文中的 pdfplumber 範例程式碼,在你的 Python 環境測試看看吧!
如果你在安裝 Tesseract OCR 時遇到困難,歡迎在下方留言,我會為你解答。
別忘了追蹤我的部落格!學習更多 Python 自動化實戰技巧!
