在 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 内容纳入统一提取结果。