本機腳本

Python PDF轉Markdown

更新於 · pdftomd.tools 團隊

Python PDF轉Markdown 只要在自己的電腦上跑一支腳本。這篇教學提供兩個開源函式庫的實測程式碼片段,還有一個瀏覽器工具,留給不想安裝任何東西的時候。

文件經過程式碼編輯器,變成 Markdown 檔

手邊沒有 Python?下方的瀏覽器工具不用安裝就能做同樣的轉換。放入有文字層的檔案,再複製結果就好。

在瀏覽器中執行 · 不上傳

來源 PDF

把 PDF 拖曳到這裡,或點一下選擇檔案

只支援有文字層的 PDF。掃描檔需要 OCR,這個工具不做 OCR。

Markdown 預覽

Markdown 會顯示在這裡。
準備

四個步驟設定好環境

一條本機處理流程,從安裝到輸出檔案。

  1. 把檔案拖到上傳區
    01

    建立環境

    用 python -m venv .venv 建立虛擬環境並啟用,函式庫就不會裝進系統環境。

    查看程式碼片段
  2. 文字片段被整理成有秩序的行
    02

    安裝函式庫

    一般的 Markdown 輸出執行 pip install pymupdf4llm;主要在意表格就執行 pip install pdfplumber。

    選擇函式庫
  3. 有標題和清單的 Markdown 預覽
    03

    執行腳本

    把這頁的程式碼片段複製到 .py 檔,指向你的文件。每次執行都會寫出一個可以開啟的 .md 檔。

    複製程式碼
  4. 以箭頭相連的 Markdown 與文件圖示
    04

    檢查輸出

    把 .md 檔跟原始檔對照,交給後續處理前先刪掉殘留的頁首頁尾。

    在瀏覽器裡比較
選項

該用哪個 Python 函式庫?

做 Python PDF轉Markdown,沒有唯一最好的函式庫;每一個在速度、授權和表格處理上各有取捨。pymupdf4llm 以 PyMuPDF 為基礎,讀取版面後直接寫出 Markdown,包含標題和有框線的表格,很適合當作筆記和檢索的預設選擇。pdfplumber 能更細緻地存取字元、線條和儲存格,適合以表格資料為主的腳本。

兩者都是第三方開源專案,不是本站的產品。只有幾份文件時,這頁的瀏覽器工具不用安裝就能做類似的處理;要定期處理成百上千個檔案,本機 Python 腳本比較合適。

  • pymupdf4llm:呼叫一次就輸出 Markdown
  • pdfplumber:精準存取有框線表格的儲存格
  • 瀏覽器工具:免安裝、不上傳

每種做法都有的限制

這些做法都沒辦法自己讀掃描檔:瀏覽器工具沒有 OCR,上面的函式庫遇到只有圖片的頁面也要另外加 OCR 步驟。合併儲存格、旋轉的表格和雙欄版面,對任何 Python 函式庫和我們的工具來說都不好處理,請自己檢查表格。在瀏覽器工具裡,沒有框線的表格至少要三列,第一列一律會成為標題列。

瀏覽器還是腳本比較
有鎖頭的上傳區和有齒輪的終端機並排
左邊是不用設定的瀏覽器工具;右邊是用於自動化工作的 Python 腳本。
程式碼片段

Python 程式碼片段

已用 pymupdf4llm 1.28 和 pdfplumber 0.11 測試。複製一段在本機執行。

用 pymupdf4llm 轉一個檔案

第三方 · AGPL

速度快、看得懂版面:輸出保留標題和有框線的表格。PyMuPDF 採用 AGPL,放進封閉原始碼產品前請先確認條款。

# pip install pymupdf4llm
import pathlib
import pymupdf4llm

md = pymupdf4llm.to_markdown("report.pdf")
pathlib.Path("report.md").write_text(md, encoding="utf-8")

用 pdfplumber 擷取表格

第三方 · MIT

最適合有框線的表格。預設只會找有畫線的表格;沒有框線的格線需要另外設定。輔助函式會把每個表格寫成直線表格。

# pip install pdfplumber
import pdfplumber

def table_to_md(rows):
    rows = [[(c or "").replace("|", "\\|").strip() for c in r] for r in rows]
    head, body = rows[0], rows[1:]
    lines = ["| " + " | ".join(head) + " |", "|" + " --- |" * len(head)]
    lines += ["| " + " | ".join(r) + " |" for r in body]
    return "\n".join(lines)

with pdfplumber.open("invoice.pdf") as pdf:
    for page in pdf.pages:
        for table in page.extract_tables():
            print(table_to_md(table), end="\n\n")

用 pymupdf4llm 轉整個資料夾

第三方 · AGPL

一個迴圈:讀取 pdfs 資料夾裡的每個檔案,每個輸入寫出一個 .md 檔。

# pip install pymupdf4llm
import pathlib
import pymupdf4llm

out = pathlib.Path("markdown")
out.mkdir(exist_ok=True)
for pdf in sorted(pathlib.Path("pdfs").glob("*.pdf")):
    md = pymupdf4llm.to_markdown(str(pdf))
    (out / f"{pdf.stem}.md").write_text(md, encoding="utf-8")
    print("wrote", out / f"{pdf.stem}.md")
應用情境

適合用 Python 腳本的地方

三種值得寫腳本的工作。

本機優先
在瀏覽器裡本機處理

不管是腳本還是瀏覽器,檔案都留在本機

本機腳本不會把檔案傳到任何地方,我們的瀏覽器工具也一樣:轉換由 pdf.js 在頁面裡完成,檔案從來不會到達我們的伺服器。

腳本在你的電腦上執行瀏覽器工具不上傳開源選項
反方向
Markdown 圖示與文件圖示之間的雙向箭頭

把 Markdown 再變回頁面

跑完 Python 之後,你可能需要一份可以列印的版本。另一邊的工具會在瀏覽器裡把 Markdown 排成 A4 頁面。

工具

相關工具

更多關於 PDF 和 Markdown 的頁面。

不想設定環境?直接在這裡轉換

放入文件、複製乾淨的文字;或在你的電腦上執行上面的程式碼片段。免費、私密。

轉換檔案

資料來源

  1. pymupdf4llm to_markdown() reference — PDF4LLM docs
  2. PyMuPDF (AGPL-3.0) — GitHub
  3. pdfplumber (MIT) — GitHub
  4. pdf.js — Mozilla
問答

常見問題

關於 Python 選項、授權和限制。

Python PDF轉Markdown 最簡單的方法是什麼?

pymupdf4llm:用 pip 安裝,對檔案呼叫 to_markdown,就能拿到有標題、清單和框線表格的 Markdown。

需要帳號或金鑰嗎?

不需要。函式庫用 pip 安裝後可以離線執行,瀏覽器工具也不用帳號。寫腳本請用本機的 Python 函式庫。

pymupdf4llm 和 pdfplumber 是你們做的嗎?

不是。兩者都是第三方開源專案。pymupdf4llm 和 PyMuPDF 採用 AGPL,pdfplumber 採用 MIT。

Python 腳本讀得懂掃描檔嗎?

單靠它不行。只有圖片的頁面要先做 OCR。我們的瀏覽器工具也沒有 OCR,檔案看起來像掃描檔時會提醒你。

轉換時怎麼保留表格?

pymupdf4llm 會把有框線的表格寫成直線表格;pdfplumber 負責找出表格,再交給輔助函式轉換。沒有框線的表格兩者都需要微調。

瀏覽器工具跟這些函式庫一樣嗎?

不一樣。它使用 pdf.js 和自己的版面規則,輸出可能不同。它不用安裝,適合少量檔案。

Python 腳本會上傳我的檔案嗎?

不會。本機腳本在你的電腦上執行,這頁的瀏覽器工具也不會上傳檔案。