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. 将识别结果转成统一的 CAD table block。
  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 内容纳入统一提取结果。