别再手动清洗 PDF 了:Docling 3 步跑通 PDF 转 Markdown 与 RAG 文档解析
【免费下载链接】doclingGet your documents ready for gen AI项目地址: https://gitcode.com/GitHub_Trending/do/docling
月底要上线的 RAG 应用卡在最后一环:200 份格式各异的 PDF 报告——扫描版、双栏论文、表格密集的财报——手动复制到向量库前,光是清洗就够喝一壶。Docling 就是为这类场景生的:一个 Python 库加一条 CLI,把 PDF、DOCX、扫描件批量转成带结构的 DoclingDocument,再一键导出 Markdown 喂给下游。
它到底能干什么——一张能力地图
先用一张图把输入输出链路讲清楚:
相比 pdfplumber 只能拿到裸文本行、正则只能硬匹配模板,Docling 多做了两件事:版面检测(自动区分标题/正文/表格/公式)和结构重建(表格还原成行列关系,标题还原成层级)。所以你拿到的不是"一堆文本 + 若干 bbox",而是一份可以直接喂给 LLM 的结构化文档。
5 分钟跑通第一个转换
装包一条命令,模型权重首次运行自动拉取:
pip install docling下面这段就是官方最小示例,本地文件路径或 URL 都行:
from docling.document_converter import DocumentConverter source = "tests/data/pdf/sources/2206.01062.pdf" # 换成你的路径 converter = DocumentConverter() result = converter.convert(source) print(result.document.export_to_markdown()[:500])跑完你会看到三样东西:日志里布局模型与表格模型的加载进度、CLI 路径下当前目录生成的 .md 文件,以及打印出的 Markdown——标题带#,表格是标准 GFM 语法,公式是 LaTeX。
三个真实场景,把核心能力拆开看
场景一:批量论文转 Markdown
一次转换 200 篇 arXiv 论文,用convert_all加raises_on_error=False,单个失败不拖垮整批:
from docling.document_converter import DocumentConverter, PdfFormatOption from docling.datamodel.base_models import ConversionStatus, InputFormat from docling.datamodel.pipeline_options import PdfPipelineOptions opts = PdfPipelineOptions() opts.generate_page_images = False # 纯出 Markdown,不需要页图 converter = DocumentConverter( format_options={InputFormat.PDF: PdfFormatOption(pipeline_options=opts)} ) for res in converter.convert_all(pdf_paths, raises_on_error=False): if res.status == ConversionStatus.SUCCESS: (out_dir / f"{res.input.file.stem}.md").write_text( res.document.export_to_markdown(), encoding="utf-8" ) # ... 省略失败/部分成功分支约 8 行 ...批量任务里别把
generate_page_images留着开,它会让内存占用和耗时都上一个台阶,而纯 Markdown 输出根本用不到页图。
场景二:扫描件全页 OCR
扫描版 PDF 的文本层要么缺失要么是错的,把 OCR 模式切到FULL_PAGE,强制整页重扫:
from docling.datamodel.base_models import InputFormat from docling.datamodel.pipeline_options import ( PdfPipelineOptions, TesseractOcrOptions, OcrMode, ) from docling.document_converter import DocumentConverter, PdfFormatOption opts = PdfPipelineOptions() opts.do_ocr = True opts.do_table_structure = True opts.ocr_options = TesseractOcrOptions(mode=OcrMode.FULL_PAGE) converter = DocumentConverter( format_options={InputFormat.PDF: PdfFormatOption(pipeline_options=opts)} ) doc = converter.convert("scan.pdf").document
FULL_PAGE比默认检测模式慢不少,只对"文本层完全不可信"的扫描件开;普通电子版 PDF 用默认模式即可。
场景三:表格密集型财报
财报、招股书这类文档 80% 信息在表格里。do_table_structure默认开着,但导出格式选 DocTags 或 JSON 能保留完整的行列与合并关系:
doc.save_as_markdown("out.md") # GFM 表格,人读 doc.save_as_json("out.json") # 无损,喂 RAG 索引 doc.save_as_doctags("out.doctags") # 给 LLM 微调表格跨页时 Docling 会拆开,需要跨页合并就在下游拼接,或者换
granite_vision_table引擎再试。
调性能之前,先看懂它的处理管道
三条主线的分叉逻辑:
真正影响 90% 场景的三个开关:
do_ocr(默认 True)——电子版 PDF 关掉能省 30% 时间;扫描件必须开,且切OcrMode.FULL_PAGE。do_table_structure(默认 True)——输出里没有表格、或表格被当纯文本时别关;纯叙述性文档关掉能加速。generate_page_images(默认 False)——只在导出 HTML 且要嵌图时开,否则白跑一遍渲染。
踩过的坑,替你排好了
- 首次运行卡在模型下载 → 检查网络,或提前
pip install huggingface_hub手动拉权重。 tesserocr报libtesseract.so找不到 → 系统级装 tesseract,apt install tesseract-ocr或brew install tesseract。- 内存爆掉 →
PdfPipelineOptions.generate_page_images关 False,同时把 batch 拆小。 - macOS Intel 上 torch 装不上 → 用
uv add torch==2.2.2 docling或pip install "docling[mac_intel]"。 - 转出来的 Markdown 表格是错的 → CLI 加
--table-structure-engine docling_tableformer_v2或granite_vision_table再试。
做到这一步,200 份报告的清洗就从"手动复制粘贴"降级成了"一条convert_all循环加一个失败重试队列",剩下的精力可以放回 RAG 的检索调优上。
【免费下载链接】doclingGet your documents ready for gen AI项目地址: https://gitcode.com/GitHub_Trending/do/docling
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考