如何輕鬆從 PDF 中提取文字?3 大 Python 工具深度解析 (含 PDFtoTXT 範例)

學習如何使用 Python 提取 PDF 文字!本指南深度解析 pdfplumber、PyPDF2 及 pytesseract 三大工具,教你如何處理電子檔與掃描 PDF,解決中文亂碼問題,實現自動化報表分析,是程式小白必看的 PDFtoTXT 教學。

在 Python 中提取 PDF 文字(PDFtoTXT),最推薦的工具是 pdfplumber

它能精準解析電子檔文字與表格,並解決多數中文亂碼問題。

若是處理圖片式的掃描檔,則需搭配 pytesseract 進行 OCR 光學辨識。

本文將對比 PyPDF2、pdfplumber 與 pytesseract,幫助新手快速選擇最適合的自動化方案。

Python 常用的PDF 中提取文字檔(.txt)套件

下列主要介紹三種文字轉換用的套件,分別有

  • PyPDF2
  • pdfplumber
  • pytesseract

以及最後會介紹將 pdfplumberpytesseract 串連起來一同做使用,會有更快速的文字辨識效果。

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 文件(如報告、發票等)。
  • 缺點 :
    • 在解析文件的時候,因為需要額外處理字體、坐標、圖片等資訊,所以速度較 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

pdfplumberpytesseract 結合使用,可以同時處理電子文本 PDF和掃描版 PDF(影像型 PDF),並且比單獨使用 PyPDF2pytesseract 更靈活且準確。

優點:

  • 能處理「數位 PDF + 掃描 PDF」的混合文件,即使一份文件中包含數位文字與掃描頁面,也能正確解析。
    • 數位 PDF:直接用 pdfplumber.extract_text() 提取文字,準確且無需 OCR。
    • 掃描 PDF(影像型 PDF):使用 pdfplumber 轉換 PDF 頁面為影像,再用 pytesseract 進行 OCR 文字識別。
  • 相比單獨 pytesseract,透過 pdfplumber 預處理後的影像能獲得更清晰的文字輸出。
    • pdfplumber 允許獲取高品質的 PDF 頁面影像,比直接使用 pytesseract 讀取低解析度的 PDF 頁面效果更好。
    • 可使用 pdfplumber 獲取影像的 DPI(解析度),確保 pytesseract 輸入的影像清晰度足夠高(DPI 150 以上可提高辨識率)。
    • 影像處理(如灰階化、二值化、降噪)可以先透過 pdfplumberPIL 來最佳化,再送入 pytesseract 進行 OCR。
  • 可同時處理數位表格和掃描表格,提高數據提取的準確性。
    • pdfplumber 可以準確識別數位 PDF 裡的表格 (extract_table()),而 pytesseract 不擅長直接解析表格格式。
    • 如果表格是圖片型的(如掃描 PDF),可以:
      1. pdfplumber 轉換 PDF 頁面為影像。
      2. 使用 OpenCV 進行表格邊緣檢測,將表格切割為獨立儲存格。
      3. 再使用 pytesseract OCR 逐行辨識文字。
  • 更精細的版面控制,能避免 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) 

如何選擇合適的套件

需求推薦套件操作難度
解析純文字 PDFPyPDF2、pdfplumber★☆☆
解析 PDF 表格pdfplumber★☆☆
解析含圖片的 PDFpdfplumber★☆☆
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 自動化實戰技巧!

參考資料

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *