从 PDF 分类到 PDF 转 Markdown:pdf-inspector 两条命令的实操管线
从 PDF 分类到 PDF 转 Markdownpdf-inspector 两条命令的实操管线【免费下载链接】pdf-inspectorFast Rust library for PDF inspection, classification, and text extraction. Intelligently detects scanned vs text-based PDFs to enable smart routing decisions.项目地址: https://gitcode.com/GitHub_Trending/pdf/pdf-inspectorpdf-inspector 是一个用 Rust 编写的 PDF 分类与文本提取库附带 detect-pdf 和 pdf2md 两个命令行工具前者几十毫秒内判断 PDF 是文本型还是扫描型后者把内容转成带位置信息的结构化 Markdown。下面按安装、分诊、提取、批量路由、调试的顺序把这条管线走一遍命令均可直接照抄。处理 PDF 之前先搞清楚它是什么 PDF批量处理 PDF 时最容易踩的坑是文本型与扫描型必须走完全不同的路径。前者直接抽文本即可后者得进 OCR单份耗时从毫秒级跳到秒级。把扫描件塞进文本提取管线产出是一堆空结果反过来把每份文件都丢进 OCR又为大量本可毫秒级读出的文件付了几秒的开销。人工逐份判断更不现实文件一多就失去耐心。pdf-inspector 的“先检测、再提取”路由就是为此设计的。库本身用 Rust 编写文档只解析一次检测结果和提取结果共享同一次解析不重复 I/O并附带两个 CLIdetect-pdf类型检测10-50ms 内出结果pdf2md文本提取并转 Markdown文本型 PDF 平均约 150ms管线里的典型编排是文件先过 detect-pdf高置信度的 TextBased 直接走 pdf2md其余交 OCR 服务。这一道分诊省掉了大头成本。如何安装 pdf-inspector 的两个命令最快方式是一行装好cargo install pdf-inspector想看源码或参与开发从源码构建git clone https://gitcode.com/GitHub_Trending/pdf/pdf-inspector cd pdf-inspector cargo build --release产物在 target/release 里源码目录下也可以直接cargo run --bin pdf2md -- file.pdf跑起来。用 detect-pdf 判断 PDF 类型与置信度默认输出面向人类型、置信度、需要 OCR 的页面、耗时。脚本消费加--jsondetect-pdf document.pdf --json四种类型对应的处理方式不同类型含义建议动作TextBased检出文本操作符Tj/TJ有可提取文字交给 pdf2mdScanned整份是扫描无文本层转 OCRImageBased以图像为主、文字极少转 OCRMixed文本页与图像页混杂按 pages_needing_ocr 逐页处理confidence 是 0-1 的数值表示分类器对该判定的把握。实际使用里可以拿它当阈值高于阈值直接放行低于阈值抽查或进 OCR避免一刀切。用 --analyze 获取布局分析想知道的不只是“什么类型”还有“版式有多复杂”时加 --analyzedetect-pdf document.pdf --analyze --json返回的 JSON 里有页面数、布局复杂度评估、列检测结果以及需要 OCR 的具体页码和原因可以在不打开文件的情况下决定这份文档值不值得走重流程。用 pdf2md 转换 Markdown四种输出形态选一种默认输出就是转换后的 Markdown 文本本身另有四个开关对应不同下游需求--raw只给 Markdown不带头部信息归档最干净--pages在页面边界插入!-- Page N --注释下游可回查页码--json结构化信封含 Markdown 内容、PDF 类型、页面统计与处理时间适合程序解析--items-json逐项输出文本项的内容、页码、X/Y 坐标、宽高、字体名与字号、粗体/斜体/下划线、条目类型文本、图像、链接等适合坐标级分析常见调用pdf2md document.pdf --pages output.md pdf2md document.pdf --json用 --select-pages 只提取指定页面页面选择器支持单页、多页、区间和混合逗号分隔pdf2md document.pdf --select-pages 1,3,5-10单页写5多页写1,3,5区间写1-10上面一行就是三者混排。处理大文件控制内存时这也是第一道手段。批量 PDF 类型路由与内容盘点单文件跑熟之后下一步通常是跑一个目录。我常用的编排是先把整目录的分诊结果落成 CSV只对放行的文件转换判定依据留在文件里而不是散在终端里for f in *.pdf; do detect-pdf $f --json | jq -r [.pdf_type,(.confidence|tostring),.page_count]|csv done triage.csv之后按 triage.csv 筛出 TextBased 批量转换、其余交 OCR整条批量流变成“先盘点、再分流”不需要在循环里对每份文件做 if/else 分支。另一个常见需求是归档前盘点内容字数、链接数量、每页文本分布。两条命令就能拿到前两项pdf2md doc.pdf --raw | wc -w pdf2md doc.pdf --items-json | jq [.items[]|select(.item_typelink)]|length页坐标、字号分布等也能从同一份--items-json里按 page、font 分组聚合出来做表格化的内容统计。从 Python 里调用 CLI要把路由嵌进 Python 管线subprocess 就够了不必包一层库import subprocess, json r subprocess.run([detect-pdf, doc.pdf, --json], capture_outputTrue, textTrue) info json.loads(r.stdout)info[pdf_type]是text_based就再调一次pdf2md ... --json否则按pages_needing_ocr派发 OCR。想量化耗时命令前缀加 time 即可time pdf2md large.pdf --json /dev/null用 RUST_LOG 排查乱码与表格问题输出不符合预期时别猜用RUST_LOG把日志开到具体模块级别项目支持按模块定位RUST_LOGpdf_inspector::extractor::content_streamtrace pdf2md doc.pdf RUST_LOGpdf_inspector::tablesdebug pdf2md doc.pdf常用的模块级别content_stream内容流原始操作符trace 级、fonts字体与编码、layout列检测与阅读顺序、tables表格检测、tounicodeCMap 解码乱码首选查这里。RUST_LOGpdf_inspectordebug全量打开各模块对应的完整清单见 docs/debugging.md。几类高频问题的第一反应大文件内存吃紧先用--select-pages切页分批处理文字乱码开 tounicode 模块日志多数指向字体编码或 CMap 问题表格识别不准开 tables 模块日志看矩形与启发式两条检测路径各自命中情况报错本身文件不存在报No such file or directory (os error 2)损坏的 PDF 报InvalidFileHeader类解析失败权限问题报Permission denied (os error 13)先核对路径和文件权限再怀疑工具pdf-inspector 的基准表现与已知边界在 opendataloader-bench 的 200 份 PDF 语料上总体得分 0.780-1 分制其中阅读顺序 0.87 是明显强项表格 0.59、标题 0.57 相对偏弱——后两项在纯文本提取引擎里仍属短板表格密集的文档值得抽查输出。速度构成上检测 10-50ms文本提取平均约 150ms文档全程只解析一次。提取管线源码在 src/extractor/报问题前先读对应模块的日志能快速缩小范围。实际使用里值得保留三个习惯大文件先分诊再提取别盲跑程序消费用--json或--items-json归档用--raw输出异常先用 RUST_LOG 定位到模块再动管线。库与测试全部开放examples/basic_usage.py 是 Python API 的现成入口。【免费下载链接】pdf-inspectorFast Rust library for PDF inspection, classification, and text extraction. Intelligently detects scanned vs text-based PDFs to enable smart routing decisions.项目地址: https://gitcode.com/GitHub_Trending/pdf/pdf-inspector创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
