本地脚本

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 脚本会上传我的文件吗?

不会。本地脚本在你的电脑上运行,本页的浏览器工具也不上传文件。