Chandra OCR实战案例:房地产楼盘PDF→结构化JSON含户型图坐标+文字描述
Chandra OCR实战案例房地产楼盘PDF→结构化JSON含户型图坐标文字描述你是不是也遇到过这样的烦恼手里有一堆房地产楼盘的PDF宣传册里面有精美的户型图、详细的参数表格和密密麻麻的文字介绍。你想把这些信息整理成结构化的数据比如JSON格式方便后续做数据分析、上架到网站或者导入到数据库里。但一看到那些复杂的排版、嵌入的图片和表格手动整理简直让人头大。别担心今天我就带你用一个叫Chandra的开源OCR工具轻松搞定这个难题。它能“看懂”PDF的布局把里面的文字、表格、图片坐标都精准地提取出来直接生成结构化的Markdown、HTML或者JSON。最棒的是它只需要4GB显存就能跑效果还比一些知名的商业模型更好。这篇文章我就用一个真实的房地产楼盘PDF案例手把手教你如何用Chandra把它变成一份包含户型图坐标和文字描述的、规规矩矩的JSON文件。1. 为什么选Chandra来处理房地产PDF在开始动手之前我们先简单了解一下Chandra看看它为什么适合处理房地产资料这种复杂的文档。1.1 Chandra是什么Chandra是Datalab.to在2025年10月开源的一个“布局感知”OCR模型。简单说它不光是识别文字还能理解文档的排版结构。比如它能知道哪段文字是标题哪个区域是表格图片放在什么位置甚至能处理数学公式和手写体。它的几个核心优势正好切中了我们处理房地产PDF的需求高精度在权威的olmOCR基准测试中综合得分83.1在一些项目上超过了GPT-4o和Gemini Flash 2。这意味着它识别文字和表格的准确率很高。保留布局这是最关键的一点。它输出的JSON里会包含每个文本块、表格单元格、图片的坐标信息Bounding Box。对于户型图我们就能知道图在PDF的哪个位置以及对应的文字描述是什么。多格式输出一次处理同时生成Markdown、HTML和JSON。JSON格式特别适合我们做程序化的数据处理和入库。本地部署数据隐私很重要尤其是商业资料。Chandra可以完全在本地服务器上运行数据不出门。成本友好模型权重开源有宽松的商业许可。对于大多数创业公司和小团队来说基本可以免费商用。1.2 房地产PDF的解析难点房地产楼盘的宣传PDF通常是个“大杂烩”混合内容既有纯文本楼盘介绍、开发商信息也有结构化表格户型参数表、价格表还有大量图片户型图、效果图、区位图。复杂排版为了美观文字常常环绕图片分栏排版这对传统OCR来说是噩梦。信息关联一张户型图旁边会配有“三室两厅两卫”、“建筑面积约89㎡”等文字描述。我们需要在输出里保持这种图文关联。传统OCR工具比如Tesseract或者简单的PDF转文本工具处理这类文档会丢失所有布局信息图片和文字混在一起表格变成乱码结果完全不可用。而Chandra的“布局感知”能力正是为解决这些问题而生。2. 环境准备与Chandra快速部署好了理论说完我们开始动手。这里我推荐使用基于vLLM的后端来部署Chandra因为vLLM是一个高性能的推理框架能有效利用GPU速度更快。2.1 基础环境检查首先确保你的机器满足以下条件操作系统Linux (Ubuntu 20.04/22.04推荐) 或 macOS。Windows可以通过WSL2运行。Python版本 3.8 到 3.11。GPU至少4GB显存例如NVIDIA RTX 3060。如果没有GPU也可以用CPU但速度会慢很多。Docker可选如果你熟悉Docker用官方镜像部署会更简单。打开你的终端我们一步步来。2.2 安装vLLMvLLM是Chandra推荐的推理后端之一。我们先安装它。# 使用pip安装vLLM。推荐使用虚拟环境如venv或conda pip install vllm # 验证安装是否成功 python -c import vllm; print(vllm.__version__)如果安装顺利会打印出版本号。2.3 安装Chandra OCR安装Chandra的核心库非常简单一条命令搞定。pip install chandra-ocr这个命令会安装Chandra的核心库以及一个命令行工具(CLI)和一个基于Streamlit的Web交互界面。2.4 启动Chandra服务vLLM后端安装完成后我们需要启动Chandra的推理服务。这里我们指定使用vLLM作为后端。# 启动服务指定使用vLLM后端模型会自动从HuggingFace下载 chandra serve --backend vllm第一次运行会下载模型文件大约几个GB需要一些时间。下载完成后你会看到类似下面的输出说明服务已经在本地http://127.0.0.1:8000启动成功了。INFO: Started server process [12345] INFO: Waiting for application startup. INFO: Application startup complete. INFO: Uvicorn running on http://127.0.0.1:8000 (Press CTRLC to quit)重要提示服务启动后请保持这个终端窗口运行不要关闭。2.5 一键体验Web界面可选如果你不想写代码想先直观感受一下Chandra提供了一个非常友好的Web界面。打开另一个终端窗口运行chandra web然后在浏览器中打开http://localhost:8501你就可以直接上传PDF或图片文件点点鼠标就能看到转换结果了。这对于快速测试和预览非常方便。上图展示了Chandra Web界面的上传和结果区域3. 实战解析房地产楼盘PDF并生成JSON现在我们的Chandra服务已经跑起来了。假设我们有一个名为luxury_apartment.pdf的楼盘宣传册。接下来我们用Python写一个简单的脚本调用Chandra的API完成从PDF到结构化JSON的转换。3.1 准备Python脚本创建一个新的Python文件比如叫做pdf_to_json.py。import requests import json import sys import time def pdf_to_structured_json(pdf_path, output_json_path): 将PDF文件发送给Chandra OCR服务获取结构化的JSON结果并保存。 参数: pdf_path (str): 本地PDF文件的路径。 output_json_path (str): 要保存的JSON文件路径。 # Chandra服务地址根据你启动服务的地址修改 CHANDRA_SERVER_URL http://127.0.0.1:8000 # 1. 准备上传文件 with open(pdf_path, rb) as f: files {file: (pdf_path, f, application/pdf)} # 2. 设置请求参数我们主要需要JSON输出也可以同时要Markdown # format参数可以同时请求多种格式用逗号分隔如 json,markdown data {output_format: json} print(f正在上传并解析文件: {pdf_path}...) # 3. 发送POST请求到 /ocr 接口 response requests.post(f{CHANDRA_SERVER_URL}/ocr, filesfiles, datadata) # 4. 检查响应 if response.status_code 200: result response.json() # 结果中包含请求的所有格式我们取json部分 json_output result.get(json) if json_output: # 将JSON结果保存到文件 with open(output_json_path, w, encodingutf-8) as jf: # 使用indent参数让JSON文件更易读 json.dump(json_output, jf, ensure_asciiFalse, indent2) print(f✅ 成功结构化JSON已保存至: {output_json_path}) # 简单打印一些关键信息 print(f 文档共解析出 {len(json_output.get(pages, []))} 页。) # 可以进一步分析第一页的内容类型 first_page json_output.get(pages, [{}])[0] blocks first_page.get(blocks, []) text_blocks [b for b in blocks if b.get(type) text] table_blocks [b for b in blocks if b.get(type) table] image_blocks [b for b in blocks if b.get(type) image] print(f - 文本块: {len(text_blocks)} 个) print(f - 表格块: {len(table_blocks)} 个) print(f - 图片块: {len(image_blocks)} 个 (包含户型图)) else: print(❌ 响应中未找到JSON数据。) print(完整响应:, result.keys()) else: print(f❌ 请求失败状态码: {response.status_code}) print(f错误信息: {response.text}) if __name__ __main__: if len(sys.argv) ! 3: print(用法: python pdf_to_json.py 输入PDF路径 输出JSON路径) print(示例: python pdf_to_json.py ./luxury_apartment.pdf ./output.json) sys.exit(1) input_pdf sys.argv[1] output_json sys.argv[2] # 确保Chandra服务已启动 print(请确保已通过 chandra serve --backend vllm 启动了Chandra服务。) time.sleep(2) # 给用户一点阅读提示的时间 pdf_to_structured_json(input_pdf, output_json)3.2 运行脚本并解析PDF在终端里运行我们刚写好的脚本。记得先把luxury_apartment.pdf放在和脚本相同的目录下或者指定正确的路径。python pdf_to_json.py ./luxury_apartment.pdf ./apartment_data.json如果一切顺利你会看到终端打印出上传、解析和保存成功的提示并告诉你文档里找到了多少文本、表格和图片。3.3 解读生成的JSON结构打开生成的apartment_data.json文件你会看到一个结构非常清晰的数据。我们重点关注与户型图相关的部分。一个简化版的JSON结构可能长这样{ metadata: { format: json, model: chandra-ocr, pages: 1 }, pages: [ { page_number: 1, size: {width: 595.0, height: 842.0}, blocks: [ { type: text, bbox: [50, 100, 300, 150], text: 【奢华尊享】天际云邸, font_size: 24, is_title: true }, { type: text, bbox: [50, 180, 500, 250], text: 项目坐落于城市核心CBD坐拥360度环幕视野..., font_size: 12 }, { type: image, bbox: [80, 300, 350, 550], score: 0.98, caption: A户型 | 三室两厅两卫 | 建筑面积约89㎡ }, { type: table, bbox: [400, 300, 550, 500], data: [ [户型, 建筑面积, 朝向, 价格], [A户型, 89㎡, 南, 450万], [B户型, 120㎡, 南北通透, 620万] ] } ] } ] }关键字段解释pages: 数组对应PDF的每一页。blocks: 一页中的所有内容块。type: 块类型对我们最重要的是image图片和text文本。bbox:边界框坐标格式通常是[x0, y0, x1, y1]代表块在页面上的位置左上角和右下角坐标。这是定位户型图的核心text: 对于文本块这里是识别的文字内容。caption: 对于图片块Chandra会尝试识别图片附近的说明文字作为标题caption这很可能就是户型图的描述通过这个结构我们可以轻松地过滤出所有type为image的块这些就是户型图、效果图等。读取每个图片块的bbox坐标知道它在PDF上的精确位置。获取图片块的caption字段直接得到对应的户型描述。结合type为table的块提取结构化的户型参数表。4. 从JSON到业务数据一个简单示例拿到结构化的JSON后我们就可以编程提取出想要的业务数据了。下面是一个简单的示例提取所有户型图信息及其描述。import json def extract_floor_plan_info(json_file_path): 从Chandra生成的JSON中提取户型图信息和描述。 with open(json_file_path, r, encodingutf-8) as f: data json.load(f) floor_plans [] for page in data.get(pages, []): page_num page.get(page_number, 0) blocks page.get(blocks, []) for block in blocks: # 寻找图片块并且caption里可能包含“户型”关键词 if block.get(type) image: caption block.get(caption, ) # 简单判断是否为户型图可根据实际需求调整逻辑 if 户型 in caption or floor plan in caption.lower(): floor_plan_info { page: page_num, bbox: block.get(bbox), # 图片坐标 caption: caption, # 文字描述 image_score: block.get(score, 0) # 识别置信度 } floor_plans.append(floor_plan_info) return floor_plans # 使用函数 if __name__ __main__: apartment_data extract_floor_plan_info(./apartment_data.json) print(f共提取到 {len(apartment_data)} 个户型图信息) for i, plan in enumerate(apartment_data, 1): print(f\n{i}. 第{plan[page]}页) print(f 坐标位置: {plan[bbox]}) print(f 描述: {plan[caption]}) print(f 识别置信度: {plan[image_score]:.2f})这个脚本会输出所有疑似户型图的图片位置和描述。你可以根据bbox坐标在原PDF中进行高亮或裁剪也可以将caption描述和表格中的详细参数关联起来形成完整的户型档案。5. 总结与进阶建议通过这个实战案例你应该已经掌握了使用Chandra OCR将复杂房地产PDF转换为结构化JSON的基本流程。我们来回顾一下关键步骤和优势核心流程三步走部署用pip install chandra-ocr安装并通过chandra serve启动本地服务。解析通过HTTP API上传PDF指定需要JSON格式输出。利用从返回的JSON中精准提取图片坐标(bbox)、文字描述(caption/text)和表格数据(table)。Chandra在此场景下的核心价值信息无损结构化不再是杂乱无章的文本而是保留了位置、类型、层级关系的结构化数据。图文关联精准自动将图片与其相邻的文字说明关联省去人工匹配的麻烦。表格数据化将PDF中的表格直接转为二维数组便于导入Excel或数据库。私有化部署保障商业数据安全处理过程完全可控。给你的进阶建议批量处理修改脚本使其能遍历一个文件夹下的所有PDF文件进行批量转换极大提升效率。与RAG结合将提取出的结构化JSON特别是文本描述存入向量数据库即可搭建一个关于楼盘资料的智能问答系统。精度调优如果遇到某些特定排版识别不准可以查阅Chandra文档看是否有针对性的预处理或后处理参数可以调整。探索Web界面对于不熟悉编程的同事可以教他们使用chandra web启动的Web界面进行可视化的文件上传和结果预览同样支持JSON导出。房地产资料数字化只是Chandra的一个应用缩影。任何需要从复杂版式文档如合同、报表、研究论文、宣传册中精准提取结构化信息的场景它都能大显身手。希望这个实战案例能帮你打开思路高效解决实际工作中的文档处理难题。获取更多AI镜像想探索更多AI镜像和应用场景访问 CSDN星图镜像广场提供丰富的预置镜像覆盖大模型推理、图像生成、视频生成、模型微调等多个领域支持一键部署。