如何用 Python 把 PDF 轉成 Markdown
把 PDF 轉成 Markdown,已經成為 RAG 管線與 LLM 工作流程的標準前處理步驟 — Markdown 保留了模型用來理解結構的標題與表格,token 用量卻只有一小部分。Python 有好幾個不錯的選項,各有實際的取捨。以下是最值得考慮的四個,並附上每一個的可用程式碼。
為什麼選 Markdown?以及為什麼這比看起來難
LLM 對 Markdown 的處理能力特別好:標題標出章節邊界、管線符號表格讓表格資料保持對齊、清單依然是清單。把 PDF 直接抽出的原始文字餵給模型,這些全都會流失 — 而把 PDF 二進位檔直接餵進去,對多數管線來說根本不可行。這就是為什麼幾乎所有認真的 RAG 架構,都會在切塊與嵌入之前先把文件轉成 Markdown。
難點在於 PDF 並不包含結構 — 它包含的是被放置在 x/y 座標上的字元。轉換器必須反推哪些行是標題(從字型大小)、哪些字組成表格(從對齊方式)、閱讀順序是什麼(從版面分析)。各函式庫在這方面的表現差異極大,這正是選擇很重要的原因。
第二個麻煩:掃描的 PDF 完全不含文字,只有頁面的影像。下面的選項中,只有部分能透過 OCR 處理這種檔案。
選項 1:PyMuPDF4LLM — 快速輕量
PyMuPDF4LLM 是建立在 PyMuPDF(fitz)之上、專為 LLM 管線打造的輕量層:pip install pymupdf4llm,然後 md = pymupdf4llm.to_markdown("doc.pdf") — 一行搞定,而且速度非常快,多數文件遠不到一秒就能處理完。
它會從字型大小偵測標題、把表格輸出成管線符號表格,還能連同中繼資料輸出頁面區塊,直接匯入 LlamaIndex 或 LangChain。對於版面單純的數位原生 PDF — 報告、技術文件、格式不花俏的論文 — 它是非常好的預設選擇。
限制:沒有 OCR,掃描頁會回傳空白。複雜的多欄版面與精細的表格可能會亂掉,因為底層的啟發式演算法重視速度勝過深度版面分析。授權提醒:PyMuPDF 採 AGPL — 內部工具沒問題,但要放進商業產品之前,請先和您的法務團隊確認。
選項 2:Marker — 品質最高,需要 GPU
Marker 使用一整條深度學習模型管線來做版面偵測、閱讀順序與表格結構,產出的 Markdown 是所有開源選項中最忠實的 — 多欄學術論文、複雜表格,甚至數學式都能處理。
代價是基礎設施:好幾 GB 的模型權重、需要 GPU 才有合理速度(CPU 也能跑但很慢 — 常常一份文件要數十秒),加上沉重的相依套件,要部署到生產或無伺服器環境得花不少功夫。
當困難文件的輸出品質是第一優先、而且您有硬體時,選 Marker — 在 GPU 機器上批次轉換學術文獻語料庫是它的最佳舞台。若是輕量服務或無伺服器函式,營運上的重量通常會讓它出局。
選項 3:MarkItDown — 微軟的全格式轉換器
MarkItDown 是微軟開源的「萬物轉 Markdown」函式庫:pip install markitdown,然後 MarkItDown().convert("doc.pdf").text_content。它的強項是廣度 — 同一套 API 能轉 PDF、DOCX、PPTX、XLSX、HTML 等多種格式,這也是它在 LLM 資料準備領域爆紅的原因。
單就 PDF 而言,它的擷取比專門的選項簡單:它依賴基本的文字擷取,所以標題偵測與表格還原度落後 PyMuPDF4LLM 和 Marker,掃描 PDF 還需要額外設定 OCR。
當您需要一個相依套件以中等品質涵蓋多種檔案格式時 — 例如必須接受「使用者上傳什麼都收」的內部匯入腳本 — 選 MarkItDown,而不是追求最佳的 PDF 輸出。
選項 4:託管 API — 完全零相依
第四個選項是不在本機執行轉換:把 PDF POST 到解析 API,直接拿回 Markdown。用 ParseJet 的話:resp = httpx.post("https://api.parsejet.com/v1/parse/auto/file", headers={"Authorization": "Bearer KEY"}, files={"file": open("doc.pdf", "rb")}) — JSON 回應中的 "text" 欄位就是 Markdown。
這條路內建掃描頁 OCR、不必安裝模型權重或原生函式庫,而且在無伺服器函式、容器或 notebook 中的行為完全一致。它也徹底避開了 AGPL 的問題。代價是一次網路往返,以及超過免費額度後的按件計費(每月免費 300 點數;一份 PDF 消耗 3 點數)。
想讓管線今天就上線、您的 PDF 裡混有掃描檔,或部署環境不適合沉重的相依套件 — Lambda、Cloud Run、Vercel — 就選 API。
該選哪一個?
數位原生 PDF、版面單純到中等、速度重要:PyMuPDF4LLM。它是純 Python 裡投入產出比最好的選擇。
困難文件(多欄論文、複雜表格)而且您有 GPU:Marker。輸出品質沒有任何開源方案能贏它。
要用同一個函式庫處理多種檔案格式、中等品質即可:MarkItDown。
混有掃描 PDF、要部署到無伺服器環境,或完全不想管理相依套件:託管 API。一次 HTTP 呼叫、內建 OCR,每份文件都是同一套輸出結構。
完整範例:整個 PDF 資料夾轉成 Markdown 檔
無論選哪條路,管線的形狀都一樣 — 走訪、轉換、寫出。以下用 API 示範(把內層呼叫換成 pymupdf4llm.to_markdown() 就能改在本機執行):
import httpx; from pathlib import Path — 接著對 Path("pdfs/").glob("*.pdf") 中的每個 pdf 執行:resp = httpx.post("https://api.parsejet.com/v1/parse/auto/file", headers={"Authorization": "Bearer KEY"}, files={"file": pdf.read_bytes()}); Path("md/", pdf.stem + ".md").write_text(resp.json()["text"], encoding="utf-8")。
要做 RAG 匯入的話,請依標題切塊,而不是依固定字元數 — 依標題切出的區塊能保持章節完整,檢索效果好非常多。這種結構保真度,正是值得認真做好轉換這一步的原因。
常見問題
Python 把 PDF 轉 Markdown 最好的函式庫是哪個?
數位原生 PDF 用 PyMuPDF4LLM,速度與品質的比例最好。困難版面且有 GPU 可用時,Marker 品質最高。掃描 PDF 或想要零相依部署,ParseJet 這類託管 API 一次 HTTP 呼叫就能處理 OCR 與結構。
如何用 Python 把掃描的 PDF 轉成 Markdown?
掃描頁不含文字,所以需要 OCR。在本機做代表要自己串接 OCR 引擎;更簡單的路是用內建 OCR 的 API — ParseJet 會自動偵測影像型頁面,並在同一個請求裡完成 OCR。
MarkItDown 適合 PDF 轉 Markdown 嗎?
MarkItDown 的強項是用同一個函式庫轉換多種格式(PDF、DOCX、PPTX、XLSX)。單就 PDF 而言,它的結構偵測比 PyMuPDF4LLM 或 Marker 簡單 — 中等品質需求沒問題,但不是忠實還原標題與表格的最佳選擇。
做 RAG 為什麼要把 PDF 轉成 Markdown,而不是純文字?
Markdown 保留了純文字會抹平的標題、清單與表格。依標題切塊的檢索效果更好,LLM 也能利用結構理解上下文 — token 成本卻和純文字差不多。
可以完全不安裝任何東西,用 Python 把 PDF 轉成 Markdown 嗎?
可以 — 用 httpx 或 requests 透過 HTTP 呼叫解析 API。把檔案 POST 到 ParseJet 的 /v1/parse/auto/file,回應中的 "text" 欄位就是 Markdown。免費 API 金鑰每月包含 300 點數。
相關工具
PDF to Markdown Converter
Convert PDF to Markdown online for free. Preserves headings, lists, tables, and code blocks. No signup required — try it instantly or automate via API.
PDF to JSON Converter
Convert PDF to JSON online for free. Get text, title, and metadata as structured JSON — ready for your app, database, or AI pipeline. API included.
Word to Markdown Converter
Convert Word documents (DOCX) to Markdown online for free. Headings, lists, and tables preserved. No signup — or automate DOCX to MD conversion via API.