Chandra OCR代码实例:批量处理PDF目录,保留标题/表格/坐标信息

Chandra OCR代码实例:批量处理PDF目录,保留标题/表格/坐标信息 Chandra OCR代码实例批量处理PDF目录保留标题/表格/坐标信息1. 环境准备与快速部署Chandra OCR是一个开源的布局感知OCR模型能够将图片和PDF文件转换成保留完整排版信息的Markdown、HTML或JSON格式。它特别擅长处理表格、数学公式、手写文字和表单复选框等复杂元素。1.1 系统要求要运行Chandra OCR你需要操作系统Linux或Windows建议使用Linux获得更好性能显卡至少4GB显存RTX 3060或同等性能显卡即可Python3.8或更高版本CUDA11.8或更高版本如果使用GPU加速1.2 快速安装安装过程非常简单只需一行命令pip install chandra-ocr如果你想要使用Docker方式运行也可以拉取官方镜像docker pull datalab/chandra-ocr:latest2. 基础概念快速入门2.1 什么是布局感知OCR传统OCR只能识别文字内容而Chandra OCR是布局感知的这意味着它不仅能识别文字还能理解文档的结构识别标题、段落、列表等排版元素保留表格的结构和内容识别数学公式和手写文字记录每个元素在页面中的精确位置坐标2.2 支持的文件格式Chandra OCR支持多种输入格式PDF文档包括扫描版PDF图片文件PNG、JPEG、TIFF等多页文档批量处理2.3 输出格式选择模型同时生成三种输出格式Markdown适合文档编辑和知识库存储HTML适合网页展示和进一步处理JSON包含完整的结构信息和坐标数据适合程序化处理3. 批量处理PDF目录实战下面通过一个实际例子展示如何使用Chandra OCR批量处理一个包含多个PDF文件的目录。3.1 创建处理脚本首先创建一个Python脚本用于批量处理指定目录中的所有PDF文件import os from chandra_ocr import ChandraOCR from pathlib import Path def batch_process_pdfs(input_dir, output_dir): 批量处理目录中的所有PDF文件 Args: input_dir: 输入PDF文件所在目录 output_dir: 输出文件保存目录 # 初始化Chandra OCR模型 ocr ChandraOCR() # 确保输出目录存在 os.makedirs(output_dir, exist_okTrue) # 获取所有PDF文件 pdf_files list(Path(input_dir).glob(*.pdf)) print(f找到 {len(pdf_files)} 个PDF文件需要处理) # 批量处理每个文件 for pdf_path in pdf_files: print(f正在处理: {pdf_path.name}) try: # 处理PDF文件 result ocr.process_file(str(pdf_path)) # 构建输出文件名保持原文件名 base_name pdf_path.stem # 保存Markdown格式 md_output os.path.join(output_dir, f{base_name}.md) with open(md_output, w, encodingutf-8) as f: f.write(result.markdown) # 保存JSON格式包含坐标信息 json_output os.path.join(output_dir, f{base_name}.json) with open(json_output, w, encodingutf-8) as f: f.write(result.json) print(f✓ 已完成: {pdf_path.name}) except Exception as e: print(f✗ 处理失败 {pdf_path.name}: {str(e)}) if __name__ __main__: # 设置输入输出目录 input_directory ./pdf_documents # 你的PDF文件目录 output_directory ./processed_results # 处理结果目录 # 执行批量处理 batch_process_pdfs(input_directory, output_directory)3.2 处理单个PDF文件并提取表格信息如果你需要特别关注表格数据的提取可以使用以下代码from chandra_ocr import ChandraOCR import json def extract_tables_from_pdf(pdf_path, output_json_path): 从PDF中提取表格数据并保存为结构化JSON Args: pdf_path: PDF文件路径 output_json_path: 输出JSON文件路径 # 初始化OCR模型 ocr ChandraOCR() # 处理文件 result ocr.process_file(pdf_path) # 解析JSON结果获取表格数据 data json.loads(result.json) # 提取所有表格 tables [] for page in data.get(pages, []): for element in page.get(elements, []): if element.get(type) table: tables.append({ page: page[page_number], bbox: element[bbox], # 表格边界框坐标 content: extract_table_content(element) }) # 保存表格数据 with open(output_json_path, w, encodingutf-8) as f: json.dump(tables, f, ensure_asciiFalse, indent2) return tables def extract_table_content(table_element): 提取表格内容为结构化数据 rows [] for row in table_element.get(children, []): if row.get(type) table_row: cells [] for cell in row.get(children, []): if cell.get(type) table_cell: cell_text extract_text_from_element(cell) cells.append({ text: cell_text, bbox: cell[bbox], rowspan: cell.get(rowspan, 1), colspan: cell.get(colspan, 1) }) rows.append(cells) return rows def extract_text_from_element(element): 从元素中提取文本内容 if text in element: return element[text] text_parts [] for child in element.get(children, []): text_parts.append(extract_text_from_element(child)) return .join(text_parts) # 使用示例 if __name__ __main__: pdf_file example.pdf output_file extracted_tables.json tables extract_tables_from_pdf(pdf_file, output_file) print(f提取了 {len(tables)} 个表格)3.3 命令行批量处理Chandra OCR也提供了命令行工具可以直接使用命令批量处理# 处理单个文件 chandra process document.pdf --output result.md # 批量处理目录中的所有PDF文件 chandra batch-process ./input_pdfs --output-dir ./results --format markdown # 同时生成多种格式 chandra batch-process ./input_pdfs --output-dir ./results --format all # 处理图片文件 chandra process image.png --output result.json4. 处理结果分析与应用4.1 查看处理结果处理完成后你会得到三种格式的输出文件Markdown文件(.md)适合直接阅读和编辑HTML文件(.html)保持原始排版样式JSON文件(.json)包含完整的结构信息和坐标数据4.2 JSON数据结构解析JSON输出包含了丰富的文档结构信息{ pages: [ { page_number: 1, size: {width: 595, height: 842}, elements: [ { type: heading, level: 1, text: 文档标题, bbox: [50, 50, 300, 70], confidence: 0.95 }, { type: table, bbox: [50, 100, 500, 300], children: [ { type: table_row, children: [ { type: table_cell, text: 表头1, bbox: [50, 100, 150, 120], rowspan: 1, colspan: 1 } ] } ] } ] } ] }4.3 实际应用场景场景1文档数字化归档def archive_documents(pdf_directory, archive_db): 将PDF文档数字化并存入数据库 ocr ChandraOCR() for pdf_file in Path(pdf_directory).glob(*.pdf): result ocr.process_file(str(pdf_file)) data json.loads(result.json) # 提取关键信息 document_info { title: extract_document_title(data), author: extract_author(data), sections: extract_sections(data), tables: extract_tables(data), processed_date: datetime.now().isoformat() } # 存入数据库 archive_db.insert_document(document_info)场景2知识库构建def build_knowledge_base(pdf_files, vector_db): 从PDF构建向量知识库 ocr ChandraOCR() for pdf_file in pdf_files: result ocr.process_file(pdf_file) data json.loads(result.json) # 按章节分割文本 chunks chunk_by_sections(data) # 创建嵌入向量并存储 for chunk in chunks: embedding create_embedding(chunk[text]) vector_db.add_document({ text: chunk[text], embedding: embedding, metadata: chunk[metadata] })5. 常见问题与解决方案5.1 内存不足问题如果遇到内存不足的错误可以尝试以下解决方案# 使用低内存模式 ocr ChandraOCR(low_memoryTrue) # 分批处理大文件 def process_large_pdf_in_chunks(pdf_path, chunk_size10): 分批处理大型PDF文件 ocr ChandraOCR() results [] with fitz.open(pdf_path) as doc: total_pages len(doc) for start_page in range(0, total_pages, chunk_size): end_page min(start_page chunk_size, total_pages) # 提取当前分页范围 temp_pdf create_temp_pdf(doc, start_page, end_page) # 处理当前分页 result ocr.process_file(temp_pdf) results.append(result) # 清理临时文件 os.remove(temp_pdf) return merge_results(results)5.2 处理质量优化如果对某些特定类型的文档处理效果不理想可以调整处理参数# 调整处理参数 ocr ChandraOCR( detect_tablesTrue, # 启用表格检测 detect_mathTrue, # 启用数学公式检测 detect_handwritingTrue, # 启用手写文字检测 languagezhen # 设置语言支持多语言 ) # 针对特定类型文档的优化 def optimize_for_financial_docs(ocr_model): 针对财务文档进行优化配置 ocr_model.configure( table_detection_threshold0.8, line_merge_threshold0.9, languagezh # 中文财务文档 )6. 总结通过本文的实例代码你应该已经掌握了使用Chandra OCR进行PDF批量处理的基本方法。这个工具的强大之处在于保留完整排版信息不仅仅是文字内容还包括结构、表格、公式等多格式输出同时生成Markdown、HTML、JSON三种格式批量处理能力可以一次性处理整个目录的文件商业友好开源协议允许商业使用无论是构建文档管理系统、创建知识库还是进行文档数字化归档Chandra OCR都能提供高质量的文本提取和结构分析能力。记得在处理大量文档时合理安排处理顺序优先处理重要文档并定期检查处理结果的质量。如果遇到特殊类型的文档可以调整处理参数来获得更好的效果。获取更多AI镜像想探索更多AI镜像和应用场景访问 CSDN星图镜像广场提供丰富的预置镜像覆盖大模型推理、图像生成、视频生成、模型微调等多个领域支持一键部署。