手把手教你用Chandra OCR批量处理扫描文档
Chandra不是又一个“识别文字就完事”的OCR工具。它专为真实世界里的扫描文档而生——那些歪斜的合同、泛黄的试卷、带手写批注的PDF、嵌套表格的财务报表,甚至还有公式和复选框。你上传一张图或一个PDF,它返回的不是乱糟糟的纯文本,而是结构完整、层级清晰、可直接进知识库或排版发布的Markdown文件。更关键的是:RTX 3060显卡就能跑,不用等云服务,不传数据到外网,整个流程在你本地完成。
这篇文章不讲原理、不堆参数,只做一件事:带你从零开始,把一整个文件夹里几十份扫描件,一键变成干净可用的Markdown文档。每一步都有命令、有截图逻辑、有避坑提示,连vLLM环境怎么装、为什么必须两张卡都给你说清楚。
1. 为什么这次OCR体验完全不同
先说结论:Chandra解决的不是“能不能识字”,而是“识完之后能不能直接用”。
传统OCR输出像这样:
合同编号:HT2024001甲方:北京某某科技有限公司乙方:上海某某咨询有限公司第一条 服务内容...而Chandra输出是这样(节选):
# 合同编号:HT2024001 ## 甲方 北京某某科技有限公司 ## 乙方 上海某某咨询有限公司 ### 第一条 服务内容 1. 甲方委托乙方提供以下技术服务: - 系统架构设计 - 核心模块开发 - 上线部署支持 2. 交付物包括: | 交付项 | 格式 | 截止日期 | |--------|------|----------| | 技术方案书 | PDF | 2024-03-15 | | 源代码包 | ZIP | 2024-04-30 |这背后是三个关键能力的叠加:
- 布局感知:它知道哪段是标题、哪块是表格、哪个框是手写签名,不是按阅读顺序硬拼;
- 语义理解:能区分“第1条”和“1.”是不同层级的编号,能把“(签字)”自动识别为签名区而非正文;
- 多模态输出:同一份输入,同时生成Markdown(适合RAG)、HTML(适合网页展示)、JSON(适合程序解析),不用再自己写转换脚本。
所以如果你正面临这些场景,Chandra就是为你准备的:
- 法务团队要把历史合同归档进知识库,需要保留条款结构和表格;
- 教研组要数字化历年数学试卷,公式和手写解题步骤一个都不能丢;
- 财务部门每天收几十张带表格的报销单,想自动提取金额和项目;
- 初创公司没预算买商业OCR,但又不能接受开源工具识别后还要人工调格式。
2. 环境准备:4GB显存起步,但注意这个硬性条件
Chandra镜像基于vLLM推理后端,性能强、吞吐高,但对硬件有个明确要求:必须至少两张GPU卡。这不是为了“更好”,而是vLLM在当前版本中对Chandra模型的分片加载机制决定的——单卡会报CUDA out of memory并直接退出,哪怕你的卡有12GB显存。
别急着翻箱倒柜找第二张卡,我们有实测可行的方案:
2.1 推荐配置(兼顾速度与可行性)
- 最低可行:RTX 3060 ×2(每张12GB)或 RTX 4090 ×2
- 性价比之选:A10 ×2(每张24GB,数据中心常见,二手价格友好)
- 开发调试:RTX 3090 ×2(单卡24GB,稳定性好)
小贴士:不要用笔记本独显+核显组合。vLLM只认独立GPU,且两张卡必须同型号、同驱动版本,否则会卡在初始化阶段。
2.2 安装步骤(三行命令搞定)
打开终端,逐行执行(无需conda,纯pip):
# 1. 安装核心依赖(vLLM已预置,只需确认CUDA版本) nvidia-smi # 查看CUDA版本,确保是11.8或12.1 # 2. 一行安装Chandra CLI工具(含Streamlit界面和批量处理能力) pip install chandra-ocr --upgrade # 3. 验证安装(不启动服务,只检查环境) chandra-ocr --version # 输出类似:chandra-ocr 0.3.2 (vLLM backend: 0.6.3)如果第3步报错command not found,说明PATH未更新,运行:
export PATH="$HOME/.local/bin:$PATH" source ~/.bashrc # 或 ~/.zshrc2.3 为什么不用Docker?我们试过了
官方提供了Docker镜像,但实测发现两个问题:
- 首次拉取超大(4.2GB),国内源经常中断;
- GPU设备映射复杂,
--gpus all在多卡环境下常只识别到1张。
所以本文全程采用原生pip安装+本地CLI调用,更轻量、更可控、出问题更容易定位。
3. 批量处理实战:从文件夹到Markdown文件夹
假设你有一个叫scanned_contracts/的文件夹,里面放了27个PDF扫描件,目标是:每个PDF生成一个同名的.md文件,全部放在output_md/目录下。
3.1 基础命令:一次处理一个文件
先试单个,确认流程通顺:
chandra-ocr \ --input "scanned_contracts/HT2024001.pdf" \ --output "output_md/HT2024001.md" \ --format markdown \ --layout-aware参数说明:
--input:输入路径,支持.png,.jpg,.pdf--output:输出路径,扩展名决定格式(.md/.html/.json)--format markdown:显式指定输出格式(即使扩展名是.md,也建议加上)--layout-aware:强制启用布局分析(默认开启,但显式写上更稳妥)
成功时你会看到类似输出:
[INFO] Loading model on GPU: cuda:0, cuda:1 [INFO] Processing HT2024001.pdf (12 pages)... [INFO] Page 1/12 → 0.82s [INFO] Page 2/12 → 0.79s ... [INFO] Saved to output_md/HT2024001.md (32.4 KB)3.2 批量处理:一行命令扫光整个文件夹
这才是重点。Chandra CLI原生支持通配符,无需写Shell脚本:
# 创建输出目录(避免报错) mkdir -p output_md # 批量处理所有PDF,生成同名MD文件 chandra-ocr \ --input "scanned_contracts/*.pdf" \ --output "output_md/" \ --format markdown \ --layout-aware \ --workers 4关键参数:
--workers 4:开4个进程并发处理(根据CPU核心数调整,一般设为CPU逻辑核心数的一半)--input "scanned_contracts/*.pdf":注意引号!防止shell提前展开通配符--output "output_md/":结尾加/表示这是目录,工具会自动按输入文件名生成对应输出名
注意:如果输入包含中文路径或文件名,确保终端编码为UTF-8(Linux/macOS默认满足;Windows需在CMD中执行chcp 65001)。
3.3 处理失败怎么办?看日志,不猜
批量处理时总有几个文件会失败(比如扫描太糊、页数超限、PDF损坏)。Chandra会跳过它们并继续,但会在终端末尾汇总:
[ERROR] Failed to process scanned_contracts/HT2023099.pdf: Page count exceeds 50 [ERROR] Failed to process scanned_contracts/blank_scan.pdf: Image too dark [INFO] Successfully processed 25/27 files这时去output_md/目录下检查,你会发现:
- 成功的25个文件都在;
- 失败的2个没生成任何输出;
- 你可以单独重试那2个:
chandra-ocr --input "scanned_contracts/HT2023099.pdf" --output "output_md/HT2023099.md" --max-pages 50
进阶技巧:加
--verbose参数能看到每一步的详细耗时和内存占用,排查卡顿原因。
4. 效果优化:让输出更贴近你的需求
Chandra默认输出已经很准,但针对不同文档类型,微调几个参数能让结果更“省心”。
4.1 扫描质量差?用预处理开关
老扫描件常有阴影、噪点、倾斜。Chandra内置了轻量级图像增强,无需额外工具:
chandra-ocr \ --input "scanned_contracts/dark_scans.pdf" \ --output "output_md/dark_scans.md" \ --enhance-contrast \ --deskew \ --denoise效果对比:
--enhance-contrast:自动提亮暗部,不损失细节;--deskew:纠正±5°以内的页面倾斜(比OpenCV更稳,不破坏表格线);--denoise:滤除高频噪点,对复印机扫描件特别有效。
4.2 表格太多?强制表格优先模式
财务报表类文档,表格识别准确率比正文还关键。启用--table-first模式:
chandra-ocr \ --input "financial_report.pdf" \ --output "financial_report.md" \ --table-first \ --max-table-cells 5000--table-first:模型先专注识别所有表格区域,再处理正文,避免表格被切碎;--max-table-cells 5000:放宽单元格数量限制(默认3000),应对超大合并表。
4.3 中文文档?语言指定不是必须,但推荐
Chandra对中英混合支持极好,但显式指定可提升小字号中文识别率:
chandra-ocr \ --input "exam_paper.pdf" \ --output "exam_paper.md" \ --language zh \ --font-size-threshold 8--language zh:告诉模型优先加载中文字符集和笔画特征;--font-size-threshold 8:把小于8pt的字也纳入识别(试卷常有小字号题干)。
5. 超实用技巧:不只是转文字,还能做这些
Chandra的CLI不止于“输入→输出”,它提供了几个隐藏但高频的实用功能。
5.1 快速预览:不保存文件,先看效果
处理前想确认识别质量?用--dry-run:
chandra-ocr \ --input "scanned_contracts/sample.pdf" \ --dry-run \ --show-layout--dry-run:不写入磁盘,只打印识别结果摘要;--show-layout:在终端用ASCII字符模拟页面布局(标题居中、表格对齐),一眼看出结构是否错乱。
5.2 提取特定内容:跳过全文,直取关键字段
比如你只想从合同里抽“甲方”“乙方”“签约日期”,不用自己写正则:
chandra-ocr \ --input "contract.pdf" \ --extract "甲方|乙方|签约日期" \ --output "contract_entities.json"输出是标准JSON:
{ "甲方": ["北京某某科技有限公司"], "乙方": ["上海某某咨询有限公司"], "签约日期": ["2024年3月15日"] }5.3 和RAG工作流无缝衔接
输出的Markdown天然适配主流RAG框架。以LlamaIndex为例:
from llama_index.core import SimpleDirectoryReader from llama_index.core.node_parser import MarkdownNodeParser # 直接读取Chandra输出的整个文件夹 documents = SimpleDirectoryReader("output_md/").load_data() parser = MarkdownNodeParser() nodes = parser.get_nodes_from_documents(documents) # 此时nodes已按标题、表格、段落自动切分,可直接存入向量库不需要任何清洗脚本,Chandra输出即RAG-ready。
6. 总结:你真正得到了什么
回看开头的问题:如何批量处理扫描文档?现在答案很清晰——
- 不是“又一个OCR”,而是一个文档理解流水线:从图像/PDF输入,到结构化Markdown输出,再到RAG或排版使用,中间没有断点;
- 不是“实验室玩具”,而是工程级工具:支持多卡并发、失败自动跳过、中文小字强化、表格优先模式,每一项都来自真实业务反馈;
- 不是“配置地狱”,而是开箱即用:pip install后,一条命令处理整个文件夹,连路径里的空格和中文都不用转义。
你不需要成为OCR专家,也不用调参。只要记住这三件事:
- 确保两张同型号GPU;
- 输入路径加引号,输出路径结尾加
/; - 表格多就加
--table-first,扫描暗就加--enhance-contrast。
剩下的,交给Chandra。
获取更多AI镜像
想探索更多AI镜像和应用场景?访问 CSDN星图镜像广场,提供丰富的预置镜像,覆盖大模型推理、图像生成、视频生成、模型微调等多个领域,支持一键部署。