CAD 内嵌图片/Excel 的识别
在 CAD 图纸中,设计说明、材料表、桩表等内容有时不是普通 CAD 文字或线条,而是通过 OLE、截图、Excel 粘贴等方式嵌入的对象。普通 CAD 解析只能看到一个区域,例如OLE2FRAME,无法直接得到里面的文字和表格。因此识别这类内容通常要分两步:先定位嵌入区域,再对区域内容做专门识别。
整体流程
- 将 DWG 转为 DXF。
- 扫描 DXF 中的
OLE2FRAME或图片对象。 - 读取该对象在 CAD 中的坐标范围
bbox。 - 如果是 OLE Excel,尝试从 OLE 数据中提取 Office 包。
- 如果能提取 Excel,则直接读取单元格内容。
- 如果是普通图片,则裁剪该区域图片,调用 OCR 识别。
- 将识别结果转成统一的 CAD
tableblock。 - 提取时按 CAD 坐标把该 block 放回原图纸位置。
示例代码
from pathlib import Path from src.tools.cad.embedded_image_ocr_tool import ( convert_dwg_to_dxf, recognize_embedded_objects_from_dxf, embedded_ocr_results_to_cad_blocks, ) dwg_path = Path("cases/测试CAD/CAD粘贴图片的识别测试.dwg") dxf_path = Path("tmp/CAD粘贴图片的识别测试.dxf") # 1. DWG 转 DXF dxf_bytes = convert_dwg_to_dxf( dwg_path=dwg_path, dxf_path=dxf_path, server_url="https://your-dwg-to-dxf-server", ) # 2. 识别 CAD 中的内嵌对象 results = recognize_embedded_objects_from_dxf(dxf_bytes) # 3. 转成 CAD 提取 block blocks = embedded_ocr_results_to_cad_blocks(results, cad_file_id=1) for block in blocks: print(block["type"]) # table print(block["source"]) # cad_embedded_object_ocr print(block["bbox"]) # CAD 中原始位置 print(block["content"]["header"]) print(block["content"]["records"][:3])block 示例
{ "type": "table", "source": "cad_embedded_object_ocr", "bbox": { "min_x": 2780003.0, "min_y": 78951.6, "max_x": 2801390.9, "max_y": 90836.5 }, "content": { "header": ["单体名称", "建筑面积"], "records": [ { "values": { "单体名称": "地下室", "建筑面积": "1000" } } ] } }关键点
预览时可以把识别出的内容画回 CAD 原位置,方便用户确认。提取时不要简单把结果追加到最后,而应按bbox参与阅读顺序。如果嵌入区域在说明文字中间,那么最终结果也应表现为:
上方 CAD 原生内容 内嵌 Excel/图片识别表格 下方 CAD 原生内容这样既保留 CAD 空间位置,又能把 OLE、图片、Excel 等非原生 CAD 内容纳入统一提取结果。
