纯 Go 的 CAD 开源库 go-cad:直接解析 DWG/DXF,现在也能导出 PDF

GitHub 项目地址见文末

go-cad 可以直接把 DWG/DXF 导出成 PDF 了! 整图单页,或者自动拆成多页,再用图名生成书签。一份铺着多个楼层的施工图,可以变成一份按页翻阅、按图名跳转的文件。

这是一个纯 Go 的 CAD 开源库:零 cgo,无需安装 AutoCAD,已有图纸解析、PNG/SVG 渲染、拆图、文本提取和 DWG 写出能力。新增 PDF 后,预览、下载归档、AI 整理资料,可以围绕同一份图纸串起来。

对做工程资料系统的朋友,这个变化很实用:网页里看预览,需要发给同事时下载 PDF,需要查设计说明时提取原图文字。下面就从导出的结果和命令开始。

先看结果:一份可以按图名翻阅的 PDF

下面的页面和书签,来自 go-cad 已导出的真实弱电施工图 PDF。我们把其中一页与几条书签排在一起,方便在手机上看清输出内容。

实际导出内容的排版展示,非软件界面截图;图中为第 2 页"十三层弱电平面图",下方为同一 PDF 的书签节选。

多页文件包含整图全览和识别出的分幅页面。"十三层弱电平面图""UPS系统图""弱电设计说明(一)"这些名字会成为书签,查资料时可以直接跳转。

这正是 PDF 导出带来的便利:交给同事的是一个文件,图纸有页序,也有导航。用于工程资料分享、审阅和归档,比一组需要另外整理命名的截图更顺手。

PDF 中的线条和字形以矢量路径输出。 下图是从其中的设计说明页重新渲染的文字局部,展示中文在实际 PDF 里的效果。

正文插图是 PNG;原始 PDF 中的字形是矢量路径。

生成 PDF 时需要可用的中文字体,可以在 Go 接口中用 FontPath 指定。阅读端不需要安装同款字体;但字形转成路径后,PDF 里的文字不能直接选中复制。要检索文字或交给 AI,继续使用原始 CAD 的文本提取结果。

有标准幅面需求,也可以通过 RenderOptions.PageStdA 开启 A0~A4 匹配。它默认关闭,按 CAD 世界单位为毫米换算,并要求图幅尺寸、比例符合条件;打印前仍要核对实际比例。

两条命令,把自己的图纸导出来

PDF 目前在 feat/pdf-export 分支,尚未合入 main。 使用 Go 1.25 或以上,安装下面这个已核验提交,才能体验本文的 PDF 功能:

复制代码
go install github.com/unitedrhino/go-cad/cmd/dwg2png@d32c4e587bbf

安装后确保 Go 的 bin 目录在 PATH 中。工具虽然叫 dwg2png,现在也支持 PDF:输出文件的扩展名决定格式。

整张图纸,输出为一个单页 PDF:

复制代码
dwg2png drawing.dwg -o drawing.pdf

按图框拆分,输出为一个带书签的多页 PDF:

复制代码
dwg2png drawing.dwg -sheets -o sheets.pdf

输入文件换成 drawing.dxf 也可以。这两种模式分别适合"保留整图关系"和"按图幅阅读";识别不到图框时,多页模式会回退为整图单页。

自动识别仍需要检查。复杂排布可能把相邻内容合在一页,部分稀疏内容会被过滤;全览也可能受离群实体影响。正式交付前,对照源图核对图幅范围、图名和页面完整性。

把它接进项目,可以少做哪些重复工作?

PDF 是新增出口,go-cad 的价值还在于:同一个解析结果,可以供预览、资料整理和文件输出复用。

项目里的需求 go-cad 能提供什么
上传后在线预览 读取 DWG/DXF,渲染 PNG、SVG
下载、分享、归档 新增单页 / 多页矢量 PDF、图名书签
按楼层或图幅浏览 图框识别、图号图名提取、分幅出图
搜设计说明、材料名称 文本、坐标、图层及所属图幅
转换与程序集成 DXF 读写、JSON 导入、DWG 写出、Go 模块接口

例如做一个图纸资料库,列表页用 PNG 缩略图,详情页显示分幅内容,下载按钮返回 PDF。检索结果里保留图名与坐标,用户就能回到原图核对。上传、权限和业务页面由你的系统负责,图纸处理交给库来完成。

中文工程图也有现成样本可看。下面这张机械图里,轮廓、尺寸线、箭头与技术要求一起呈现;图后给出文字局部,方便看材料、硬度和公差说明。

实际 CAD 渲染结果及文字局部;可对照"45#钢""55HRC"等技术要求。

中文不仅是能否提取出来,还包括码页、转义、字形、旋转和对齐。go-cad 对这些做了处理,但运行环境仍要准备合适字体;字体替换、特殊符号和自定义实体,建议拿自己的工程图核对。

纯 Go 也让接入更直接:后端无需围绕桌面 CAD 安排自动化任务,可以像使用其他 Go 模块一样调用解析与渲染接口,减少 C 动态库的部署工作。项目采用 Apache-2.0 许可证。

图纸里的说明,还可以交给 AI 整理

PDF 解决"把图交出去",文本提取则方便"把内容用起来"。比如按图幅汇总设计说明、列出材料型号,再把来源图名一并保留。

想先试用,可以让 WorkBuddy / CodeBuddy 调用联犀 CLI。Linux / macOS 安装入口:

复制代码
curl -fsSL https://doc.unitedrhino.com/cli/install.sh | bash

已有用户执行 ur upgrade。安装 Skills 后,重启 WorkBuddy / CodeBuddy 会话:

复制代码
ur skills install --dir ~/.codebuddy/skills
ur skills status

把图纸放到 AI 可访问的目录,可以这样提需求:

用联犀 CLI 分析"施工图.dwg"。按图幅整理图号、图名和设计说明;提取材料名称、型号、数量,逐条注明来源图幅。图纸没有写明的信息单独列出,不要推测。

这是请求示例,不是实测对话记录。

也可以先在终端查看解析结构,再导出 Markdown:

复制代码
ur doc parse 施工图.dwg --format outline
ur doc parse 施工图.dwg --format md --out 施工图.md

这里由 CLI 解析 CAD,AI 再整理解析结果。材料数量、型号和施工要求,应回到原图确认。这套既有解析流程与前面的 PDF 导出工具是不同入口。

已有知识库的团队,可以通过联犀的纯 Go 文档解析库 unitedrhino/docling 接入。它已集成 CAD 解析,能将图幅、图片、文字放入统一文档结构,与 PDF、Word 等资料一起处理。简短接入片段如下,data 为已读入的文件字节:

复制代码
doc, err := docling.ParseByExt("施工图.dwg", data)
if err != nil {
    panic(err)
}
md := doc.ToMarkdown()

保存图名与来源后,再由已有知识库完成分块、索引、检索和问答。go-cad 提供图纸处理能力,docling 提供统一文档入口,并不自带一整套知识库;当前 docling 集成也不等于已接入这次新增的 PDF 导出。

放进 Go 服务:读图、出图,也能写回 DWG

除了 DWG,库也支持 DXF 与 LibreDWG 风格 JSON 输入。DWG 读取覆盖 R9/R10/R11、R13~R2018 容器,写出覆盖 R2000~R2018 六代容器。是否适合你的文件,还要看其中的实体与具体字段。

下面是一个完整的最小示例,包含解析、文本统计、PNG 输出、单页和多页 PDF,以及 DWG 回写。在新目录中执行:

复制代码
go mod init cad-demo
go get github.com/unitedrhino/go-cad@d32c4e587bbf

将支持写出的 DWG 文件命名为 drawing.dwg,保存下面代码为 main.go,运行 go run .。输出使用新文件名,便于和原图对照。

复制代码
// 演示 DWG 解析、文本统计、PNG/PDF 输出与 DWG 写出。
package main

import (
    "bytes"
    "fmt"
    "os"

    cad "github.com/unitedrhino/go-cad"
)

// check 在操作失败时终止,避免继续使用无效结果。
func check(err error) {
    if err != nil {
        panic(err)
    }
}

// main 读取 drawing.dwg,将结果写入当前目录。
func main() {
    // data 是原始文件内容,doc 是解析后的图纸文档。
    data, err := os.ReadFile("drawing.dwg")
    check(err)
    doc, err := cad.Parse(data)
    check(err)
    fmt.Println("文本条数:", len(doc.Texts()))

    // opts 设置 PNG 宽度;PDF 保持矢量输出。
    opts := cad.RenderOptions{Width: 2048}
    png, err := cad.RenderPNG(doc, opts)
    check(err)
    check(os.WriteFile("drawing.png", png, 0644))

    // pdf 为整图单页;multi 为自动拆分的多页文件。
    pdf, err := cad.RenderPDF(doc, opts)
    check(err)
    check(os.WriteFile("drawing.pdf", pdf, 0644))
    multi, err := cad.RenderSheetsPDF(
        doc, cad.RenderOptions{})
    check(err)
    check(os.WriteFile("sheets.pdf", multi, 0644))

    // buf 接收 DWG 回写内容,不覆盖原始图纸。
    var buf bytes.Buffer
    check(cad.WriteDwg(doc, &buf))
    check(os.WriteFile("roundtrip.dwg", buf.Bytes(), 0644))
}

DXF 输入改用 ParseDXF。实际服务还可以根据任务选择输出,不必每次同时生成所有格式。

选型时也可以看看仓库里的验证记录:37 张语料的严格字段对照、DXF 59/59 参考验证,以及 147 张语料的解析、渲染、写出和再解析链路。这些是已纳入样本的结果,不代表任意图纸都能无损转换。

README 另记录了 4.3MB、约 10.8 万对象样本的解析与渲染耗时;该处未完整给出硬件环境,建议作为样本记录阅读,不据此承诺线上性能,更不能当作 PDF 导出的耗时。

目前 ACIS 三维几何重建、早期版本写出等仍有边界;图案型 HATCH、专业软件代理实体也需要重点检查。文本提取针对 CAD 文本实体,图片里或画成线条的字需要另行处理。先拿一份有代表性的图纸,把关键尺寸、中文和页面完整性看一遍,最容易判断能否用起来。

开源地址:拿一份自己的图纸试试

如果你正在做图纸预览、工程资料管理,或者想把 CAD 接入 AI 文档流程,欢迎试试 go-cad。从一张 DWG 开始,先导出 PDF,再看看预览和文字提取是否能接进你的项目。

go-cad|纯 Go CAD 解析、渲染与写出

https://github.com/unitedrhino/go-cad

仓库包含源码、使用说明、测试样本与 CLI 工具。本文 PDF 能力使用 feat/pdf-export 分支,或上文固定提交。

docling|纯 Go 统一文档解析,包含 CAD 接入

https://github.com/unitedrhino/docling

也欢迎把这篇转给负责工程资料系统的同事,一起拿样本验证。遇到问题,带上脱敏图纸与预期结果反馈到仓库,让解析和出图效果继续完善。

欢迎关注我们的开源项目

联犀 things · Go 物联网开源模块

提供设备接入、物模型、设备数据与 OTA 等基础能力。本文介绍的完整 AI 平台能力,不等于该仓库的开源范围。

https://gitee.com/unitedrhino/things

欢迎点亮 Star,也欢迎关注联犀,持续分享 AI+物联网的开发进展、开源实践与应用案例!

历史阅读

相关推荐
zjxtxdy1 小时前
C++面向对象程序开发-类与对象
开发语言·c++
qq_406981033 小时前
c++拷贝构造函数
开发语言·c++
爱喝雪碧的可乐3 小时前
MATLAB
开发语言·算法·matlab
FungLeo4 小时前
成为全栈·Go 后端篇·三轮代码审阅之后:把可读性和证据做成工程规则
golang·go·ast·静态检查·成为全栈·代码审阅
H.莓飛5 小时前
【C++】【STL】vector_OJ题
linux·服务器·开发语言·数据结构·c++·visual studio
j7~6 小时前
【C++ 八股文】(篇四)C++11 新特性
开发语言·c++·面试·c++11·八股文
eggwyw7 小时前
C++中大括号的用法合集
开发语言·c++
xiaoye-duck7 小时前
《C++ 项目:手写大模型接入 SDK》本地 Ollama 部署与适配
开发语言·网络·c++·语言模型
联犀7 小时前
联犀 Go SIMD 实战:视频转码从 16.5ms 到 5.46ms
开发语言·golang·音视频