ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

MarkItDown 文档转换实战:用 Python 把 PDF/Word 批量转成 Markdown 的配置指南

MarkItDown 文档转换实战:用 Python 把 PDF/Word 批量转成 Markdown 的配置指南 1. 为什么我要把一堆 PDF 和 Word 批量转成 Markdown如果你手头有一批 PDF 报告、Word 需求文档、Excel 数据表想把它们喂给大模型做问答或者做知识库第一步几乎都是「统一成 Markdown」。原因很直接Markdown 接近纯文本标题、列表、表格这些结构还在token 消耗比 HTML 低模型读起来也顺。MarkItDown 就是干这件事的 Python 工具微软开源专门把 PDF、Word、Excel、PPT、图片、音频、HTML、CSV 等格式转成 Markdown适合需要批量处理文档的开发者。这篇不讲空泛概念直接给你一套能跑的配置骨架装环境、写批量脚本、跑一次转换、校验结果最后把常见的坑列出来。适合谁手上有一堆异构文档、想快速落地转换流程、又不想自己写解析器的人。我试过用几十份 PDF 加 Word 混着转脚本跑完直接进向量库中间省掉了大量手工整理。核心检索词先摆出来MarkItDown 是什么、能做什么、适合谁。它是一个 Python 库加命令行工具能把多种文档格式转成 Markdown适合做 LLM 输入预处理、文档索引、批量资料整理不适合追求高保真排版的场景它优先保证机器可读。2. 前置准备Python 环境与 TaoToken 接入配置2.1 环境要求与虚拟环境MarkItDown 要求 Python 3.10 或更高。我建议用虚拟环境隔离依赖避免和系统里的包打架。标准 venv 就够python -m venv .venv # Linux/macOS source .venv/bin/activate # Windows .venv\Scripts\activate如果你用 uv创建更快uv venv --python3.12 .venv source .venv/bin/activate注意用 uv 建的环境装包要用uv pip install别混用pip install否则可能装到全局去。2.2 安装 MarkItDown核心功能pip install markitdown要支持全部格式PDF、Office、OCR、音频等装完整依赖pip install markitdown[all]从 0.0.1 到 0.1.0 版本依赖被拆成了可选功能组。markitdown[all]保证向后兼容如果你只要 PDF 和 Office可以只装子集比如markitdown[pdf]或markitdown[office]能少装不少东西。验证安装python -m markitdown --version返回版本号比如 0.1.3就说明装好了。2.3 为什么这里要提 TaoToken批量转换出来的 Markdown下一步通常是喂给大模型做摘要、问答或者结构化抽取。这时候你需要一个稳定的模型调用入口。TaoToken 提供统一的 API 接入兼容常见模型调用方式适合把「文档转换 模型处理」串成一条流水线。它的接入文档和 API Key 管理都在控制台里配置一次就能在脚本里复用。具体入口我放在后面 CTA 部分这里你先知道转换是本地做的模型调用是另一段两者解耦互不影响。3. 可复制的批量转换配置骨架3.1 命令行单文件转换先跑通最简单的markitdown convert input.pdf output.md如果 input.pdf 里有标题和表格输出大概长这样# 文档标题 ## 章节标题 | 列1 | 列2 | |-----|-----| | 数据1 | 数据2 |3.2 Python 批量脚本命令行适合单文件批量还是写脚本。下面这个骨架可以直接改路径用import os from pathlib import Path from markitdown import MarkItDown # 支持的扩展名 SUPPORTED {.pdf, .docx, .xlsx, .pptx, .html, .csv, .json, .xml} def batch_convert(src_dir: str, dst_dir: str): src Path(src_dir) dst Path(dst_dir) dst.mkdir(parentsTrue, exist_okTrue) md MarkItDown() ok, fail 0, 0 for file in src.rglob(*): if file.suffix.lower() not in SUPPORTED: continue # 保持相对目录结构 rel file.relative_to(src) out_path dst / rel.with_suffix(.md) out_path.parent.mkdir(parentsTrue, exist_okTrue) try: result md.convert(str(file)) out_path.write_text(result.text_content, encodingutf-8) ok 1 print(f[OK] {file} - {out_path}) except Exception as e: fail 1 print(f[FAIL] {file}: {e}) print(f完成成功 {ok}失败 {fail}) if __name__ __main__: batch_convert(./docs, ./markdown_out)几个关键点rglob(*)会递归子目录适合资料按文件夹分类的情况。relative_to加with_suffix保留原目录结构输出不会全堆在一个文件夹里。convert返回对象里的text_content才是 Markdown 正文别直接打印整个对象。3.3 用流式接口处理内存中的文件如果你是从网络下载或者数据库读出来的字节流不想落临时文件用convert_streamfrom markitdown import MarkItDown import io md MarkItDown() with open(data.xlsx, rb) as f: stream io.BytesIO(f.read()) result md.convert_stream(stream, file_extension.xlsx) print(result.text_content)注意从 0.1.0 起convert_stream要求二进制流open(file, rb)或BytesIO不再支持文本流StringIO。传错了会直接报错。3.4 参数对照表场景方法/命令关键参数说明单文件markitdown convert输入、输出路径最快验证批量MarkItDown().convert()文件路径脚本里循环调用内存流convert_stream()二进制流、扩展名不落临时文件全格式pip install markitdown[all]无含 OCR、音频依赖子集markitdown[pdf]无只装需要的4. 验证请求与成功结果校验4.1 跑一次批量转换准备一个测试目录放几个 PDF 和 Wordmkdir -p docs/sub # 假设你已有 sample.pdf、sample.docx python batch_convert.py预期输出[OK] docs/sample.pdf - markdown_out/sample.md [OK] docs/sub/sample.docx - markdown_out/sub/sample.md 完成成功 2失败 04.2 校验转换质量转换完别急着用先抽查。打开生成的 md 文件重点看三处标题层级有没有丢、表格有没有变成 Markdown 表格、正文有没有乱码。可以用一段脚本快速统计from pathlib import Path for md_file in Path(./markdown_out).rglob(*.md): text md_file.read_text(encodingutf-8) lines text.splitlines() headings [l for l in lines if l.startswith(#)] tables [l for l in lines if l.startswith(|)] print(f{md_file.name}: {len(lines)} 行, {len(headings)} 个标题, {len(tables)} 行表格)如果某个文件标题数为 0、表格数为 0而原文档明明有结构那大概率是扫描件或者解析失败需要单独处理。4.3 接入模型做二次处理转换后的 Markdown 可以直接拼进 prompt。如果你用 TaoToken 的 API流程是读 md 文件 → 构造请求 → 调用模型。API 地址是https://taotoken.net/apiKey 在控制台生成。这样转换和模型调用就是两个独立环节哪一步出问题都好定位。5. 本篇常见错误排查5.1 安装依赖冲突现象pip install markitdown[all]报版本冲突。解决确认在虚拟环境里先升级 pip再重装。如果还不行退而装子集比如只装markitdown[pdf]把 OCR、音频那些重依赖去掉。5.2 扫描 PDF 转换后无内容现象输出 md 是空的或者只有几行。原因扫描件本质是图片需要 OCR。MarkItDown 依赖外部 OCR 能力没配好就提取不出文字。解决确认装了 OCR 相关依赖并且系统里有对应的 OCR 引擎。如果文档量大建议先把扫描件单独筛出来走 OCR 流程别和文本型 PDF 混在一起。5.3 convert_stream 报类型错误现象TypeError或提示需要二进制流。原因传了StringIO或者文本模式打开的文件。解决改成open(file, rb)或io.BytesIO(...)并显式传file_extension。5.4 批量脚本输出目录混乱现象所有 md 堆在一个文件夹重名文件互相覆盖。原因没保留相对路径。解决用relative_to加with_suffix像 3.2 的脚本那样保持目录结构。重名问题自然解决。5.5 中文乱码现象生成的 md 打开是乱码。原因写入时没指定编码。解决write_text(..., encodingutf-8)读取时也用 utf-8。Windows 默认编码可能不是 utf-8显式指定最稳。6. 把转换和模型调用串起来文档转换只是第一步真正产生价值的是后面接模型做摘要、抽取、问答。我的做法是MarkItDown 负责本地批量转 MarkdownTaoToken 负责模型调用两者通过文件系统解耦。转换脚本跑完md 文件就是中间产物模型处理脚本读这些文件即可。如果你在接入模型时遇到 Key 配置、请求格式的问题可以直接看接入文档和 API Keys 管理页想先验证模型效果用模型对话页面快速试如果是长期做编码或 Agent 类任务Coding Plan 更合适。入口如下模型对话https://taotoken.net/models?utm_sourcetaotoken_aicg_blog_endutm_contentmodel_chatutm_campaignrewriteCoding Planhttps://taotoken.net/coding-plan?utm_sourcetaotoken_aicg_blog_endutm_contentcoding_planutm_campaignrewrite控制台https://taotoken.net/console?utm_sourcetaotoken_aicg_blog_endutm_contentconsoleutm_campaignrewriteAPI Keyshttps://taotoken.net/api-keys?utm_sourcetaotoken_aicg_blog_endutm_contentapi_keysutm_campaignrewrite接入文档https://taotoken.net/doc?utm_sourcetaotoken_aicg_blog_endutm_contentdocutm_campaignrewriteClaudeCodeAnthropichttps://taotoken.net/claude-code-anthropic?utm_sourcetaotoken_aicg_blog_endutm_contentclaudecodeutm_campaignrewrite最后给一个实用技巧批量转换时先跑小样本确认标题和表格解析正常再全量跑。我踩过的坑是直接对几百个文件开跑结果发现某类 PDF 全是扫描件白等半天。先抽样再全量省时间。
返回列表