CAD 内嵌图片/Excel 的识别

CAD 内嵌图片/Excel 的识别

在 CAD 图纸中,设计说明、材料表、桩表等内容有时不是普通 CAD 文字或线条,而是通过 OLE、截图、Excel 粘贴等方式嵌入的对象。普通 CAD 解析只能看到一个区域,例如OLE2FRAME,无法直接得到里面的文字和表格。因此识别这类内容通常要分两步:先定位嵌入区域,再对区域内容做专门识别。

整体流程

  1. 将 DWG 转为 DXF。
  2. 扫描 DXF 中的OLE2FRAME或图片对象。
  3. 读取该对象在 CAD 中的坐标范围bbox
  4. 如果是 OLE Excel,尝试从 OLE 数据中提取 Office 包。
  5. 如果能提取 Excel,则直接读取单元格内容。
  6. 如果是普通图片,则裁剪该区域图片,调用 OCR 识别。
  7. 将识别结果转成统一的 CADtableblock。
  8. 提取时按 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 内容纳入统一提取结果。