本地PDF转Markdown,文件不用上传

作者 pdftomd.tools 团队 · 更新于 · 阅读约 6 分钟

想在本地把 PDF 转成 Markdown:打开一个在浏览器里运行的转换器,比如我们的 PDF转MD 工具,然后断开网络再转换。如果照样能转,就说明文件没有离开过你的设备。要写脚本或者批量处理,Python 库和命令行工具也能在你自己的电脑上完成同样的工作。

插图:笔记本电脑屏幕上 PDF 变成了 Markdown 文件,上传到云端的箭头被划掉

“本地”是什么意思,怎么验证

所谓本地转换,是指由你自己设备上的软件读取文件、转成 Markdown,而且文件的任何副本都不会发到服务器。这就排除了大多数“免费在线转换器”:它们会上传 PDF,在远端处理,再把结果传回来。也排除了那些虽然在你电脑上运行、却在难处理的部分偷偷调用云服务的工具。

你不必相信任何人的说法,包括我们。不管用哪种方式做本地PDF转Markdown,下面两个检查对任何工具都管用:

  1. 断网。先加载工具,再关掉 Wi-Fi(或者在浏览器开发者工具里切到离线),然后转换。需要服务器的工具会直接失败。
  2. 看流量。在浏览器里,放入文件前先打开“网络”面板,转换过程中留意有没有 POST 请求或其他带数据的请求。桌面软件的话,防火墙提示或网络监控工具也能告诉你同样的事。
插图:网线已拔掉,PDF 进入浏览器窗口,由浏览器自己完成处理,输出 Markdown 文件
本地转换:引擎在浏览器标签页里运行,所以网线可以一直拔着。

方法一:在浏览器里本地把 PDF 转成 Markdown

手上只有一个文件、又没有 Python 环境时,浏览器工具最快。我们的转换器在标签页里用开源引擎 PDF.js 读取 PDF:根据字号识别标题,重建列表和竖线表格,还能去掉重复的页眉和页码。整个过程没有上传这一步,所以不管是合同还是菜谱,转换都一样私密。

我们在 2026年10月19日 用脚本做了断网测试:在 Chrome 155.0.8059.84 中打开页面,把浏览器切到离线,再转换一份带重复页眉、页码和一张表格的 4 页报告。测试中,离线转换用了 87 毫秒,输出 546 个字符的 Markdown。离线期间页面只发出了 1 个请求,是加载页面下方一张装饰图片的 GET,没有任何请求携带数据。页面加载时也没有任何 POST 请求。

截图:用我们的浏览器转换器在本地把 PDF 转成 Markdown,断网状态下完成了一份 4 页报告的转换
离线测试截图:报告在没有网络的情况下转换完成,重复页眉和页码都已去掉。

局限和所有读取文字层的转换器一样。扫描页没有可读的文字,而我们的工具不做 OCR,所以它会提示文件看起来是扫描件,而不是瞎猜。多栏版式和复杂表格转完后要检查一下;要看哪些地方,见 格式保留指南。

方法二:在自己电脑上用 Python 库

经常要做的任务,更适合用 Python 库:可以遍历文件夹、把代码放进版本管理、在你自己掌控的服务器上运行。代码细节见我们的 Python 指南;这里只从“是否本地”的角度看四个常用的包。

  • PyMuPDF4LLM 一行就能把 PDF 转成 Markdown:pymupdf4llm.to_markdown("report.pdf"),完全离线运行。先看许可证:它和 PyMuPDF 都是 AGPL-3.0,商业许可另外出售。
  • MarkItDown 来自微软(MIT),能转换很多种文件。用 pip install 'markitdown[pdf]' 装上 PDF 扩展,再运行 markitdown report.pdf -o report.md。默认的 PDF 处理是本地的;但有些可选扩展会把文件发给 Azure Document Intelligence 或 Content Understanding,处理机密文件时别用。
  • Docling(MIT)使用版面和表格模型,并把本地运行、保护敏感数据列为功能之一。模型第一次使用时下载;文档里给了 docling-tools models download,可以提前为断网机器准备好。
  • Marker(代码 Apache-2.0;模型权重另有许可,带商业限制)同样基于模型。它的可选参数 --use_llm 会把内容发给 LLM 服务,默认是 Gemini;只有指向你自己部署的模型时才算本地。
python -m venv .venv && . .venv/bin/activate
pip install pymupdf4llm 'markitdown[pdf]'

# then work with the network off
python -c "import pymupdf4llm; open('report.md','w').write(pymupdf4llm.to_markdown('report.pdf'))"
markitdown report.pdf -o report-markitdown.md
联网装一次,之后断网也能在本地把 PDF 转成 Markdown。同样的命令在 macOS、Linux 和 Windows 上都能用。

在 Mac 上把 PDF 转成 Markdown 也一样:两个包在 macOS 上都能用 pip 安装,Homebrew 的 poppler 包则提供下一种方法要用的 pdftotext。

方法三:命令行工具

经典的离线工具是 Poppler 里的 pdftotext。它很快,几乎到处都装着,但输出的是纯文本,不是 Markdown:没有 # 标题,也没有竖线表格。-layout 参数会用空格把各列对齐,方便人看,但解析器或模型需要结构时帮助不大。格式转换常用的 Pandoc,则根本读不了 PDF。

为了用同一个文件比较,我们在构建机(Linux x86_64, 8 vCPU)上禁用进程网络,运行了两个 Python 包和 pdftotext,然后统计输出内容。文件就是浏览器测试里的那份 4 页报告。我们转换器那一行,是同一文件在“清理 AI 残留”模式下的结果。

本地工具处理 4 页报告的结果,来自我们的测试(2026年10月19日,网络已禁用)
工具耗时标题数竖线表格页眉副本页码行被连字符断开的单词
PyMuPDF4LLM 1.28.21 秒4是44否
MarkItDown 0.1.80.32 秒0是44是
pdftotext 25.03.0 -layout0.02 秒0否44是
我们的浏览器转换器(已清理)87 毫秒4是00否
只有一个小文件,耗时只代表数量级;Python 的耗时包含解释器启动。页眉副本和页码行都是需要手动删除的残留。

哪种方法适合哪种任务

插图:四张卡片,分别是浏览器工具、Python 库、命令行工具,以及接收 Markdown 的笔记软件
本地PDF转Markdown 有三条路,终点都一样:你的编辑器或笔记软件。
  • 一个文件,马上要,不想装任何东西:用浏览器。单个文件用 PDF转MD 工具,一堆文件用 批量页面。
  • 每周一个文件夹,或者自动化流程:能接受 AGPL 就用 PyMuPDF4LLM,需要 MIT 和多种文件格式就用 MarkItDown。
  • 复杂版式、扫描件、公式:Docling 或 Marker,要下载模型,跑得也更慢。
  • 只要文字,用来搜索或快速比对:pdftotext。
  • 直接放进笔记库:在浏览器里转换,然后按 Obsidian 流程 操作。

顺便说一下用词:离线工具和私密工具不是同一个承诺。离线只代表不需要网络;私密还包括工具在硬盘上留下的东西,比如缓存、日志、崩溃报告。所以装任何软件前,都读一读它的隐私说明。

机密 PDF 检查清单

  1. 读一下工具的隐私政策,再用上面的离线测试自己验证。我们的隐私政策在 隐私页面。
  2. 联网安装软件包、下载模型,然后断网,在本地把 PDF 转成 Markdown。
  3. 云端扩展保持关闭:MarkItDown 的 Azure 选项、Marker 的 LLM 模式,以及任何会调用外部服务的“AI 清理”开关。
  4. 在你自己掌控的文件夹里转换,完成后删除中间副本。
  5. 把 Markdown 粘贴给聊天模型之前要想清楚:这一步就是上传。转换时没上传,不代表之后也安全。
  6. 法律或医疗文件,优先选能看到源代码的工具,并把所用版本和输出一起保存。

参考来源

  1. PDF.js — Mozilla
  2. PyMuPDF4LLM (README and licence) — Artifex, GitHub
  3. MarkItDown (README and licence) — Microsoft, GitHub
  4. Docling: model prefetching and offline usage — Docling project
  5. Marker (README and licence) — Datalab, GitHub
  6. Poppler (pdftotext) — freedesktop.org

常见问题

怎么在本地把 PDF 转成 Markdown?

用在标签页里处理文件的浏览器转换器,或者安装 PyMuPDF4LLM、MarkItDown 这类 Python 库,在自己电脑上运行。无论哪种,都可以断网测试一下,确认没有上传。

怎么判断在线转换器有没有上传我的文件?

打开浏览器的“网络”面板再转换,带着文件的请求会显示为 POST 或上传流量。更简单的办法是转换前先断网,会上传的工具断网后就完成不了。

你们的转换器能离线用吗?

能,前提是 PDF 有文字层。先联网加载页面,让 PDF 引擎下载好,之后就可以断网。我们测试时,一份 4 页报告离线转换完成,没有任何请求携带数据。

本地转换用哪个 Python 库最好?

在我们的小测试里,PyMuPDF4LLM 保留的结构最多,但它是 AGPL。MarkItDown 是 MIT,支持很多格式。Docling 和 Marker 适合复杂版式和扫描件,代价是要下载模型。

扫描版 PDF 能在本地转换吗?

只有在你电脑上运行 OCR 的工具才行。Docling 和 Marker 可以;我们的浏览器转换器只读文字层、不做 OCR,所以会提示文件看起来是扫描件。

用 pdftotext 代替 Markdown 够用吗?

用来搜索和快速阅读,通常够了。但它不会生成 Markdown 语法的标题和表格,依赖结构的笔记、文档和 AI 提示词,还是需要真正的 Markdown 转换器。