ARTICLE · 1331096
CAD图纸批量转换PDF-WorkBuddy
一、难点从来不是「转」
把一张 DWG 变成 PDF,几乎所有 CAD 软件都能做到。难的是同时满足下面这几条:
◦︎ 一百多张图,每一张都要出,且结果可以无限次重跑、前后一致;
◦︎ 文字、尺寸线、材料表、焊点、线宽线型,一样都不能少;
◦︎ 放大到 400% 还得是矢量,不能糊成位图;
◦︎ 换一台电脑打开,中文字不能变成方框;
◦︎ 最后要合成一册,带目录页、带书签,能直接交给对方。
用"打开软件 → 打印 → 另存"这套动作,前三条靠运气,后两条基本靠人肉。打印驱动、字体、图层状态、页面设置,任何一台机器上的一点差异都会让结果漂移。
所以这条链路里,CAD 内核只被用了一步:把 DWG 换成 DXF。剩下的解析、渲染、排版、合并、校验,全部由脚本完成。渲染不依赖打印驱动,也不需要交互式看图环节,同一批图因此可以无限次重跑且结果一致。
清点 → DWG→DXF(仅输入 DWG 时)→ 逐份矢量出图 → 结构索引 → 六项自检 → 合并总册(目录页 + 书签)→ 逐份校验 → 逐字节复制到交付目录
二、它具体做了什么
我把功能整理成六组,全部对应技能里确实存在的脚本,没有写"计划中"的能力。
其中我最看重的是"不信任中间变量"这一条。程序自己说"我画完了"没有意义,得让另一个脚本去打开刚写出来的 PDF,重新数一遍文字、图层、页数、图幅内容,才算数。
六条硬指标分别是:
这里有个容易踩的坑:H5 必须先判"图幅数 > 0"。否则一张图都没出的时候,0 == 0 会把"全军覆没"判成通过。这条是写进判读口径的,不是事后补的。
三、一个让我改了四轮的小波浪线
转折出现在一处折断符号上。同一张图里,下方竖管两端的波浪线是好的,左上和中上两处却散成几截孤立的短弧。
前三轮我一直在线型上找原因。先怀疑虚线把弧切碎了,改成整块强制实线;改完发现波浪线是连上了,可本该是虚线的接续延长线也一起变成实线了,与 CAD 原图不符。再收窄到只覆盖曲线类实体,延长线恢复了虚线,可那两处弧还是碎的。
第四轮才找到真因:椭圆弧的短轴方向不是固定"长轴逆时针转 90°"。DXF 里 210 组码给出的拉伸方向决定它是逆时针还是顺时针镜像:
230 = +1 → 短轴 = 比例 × (−My, +Mx) 230 = −1 → 短轴 = 比例 × (+My, −Mx) ← 镜像,弧被翻到长轴另一侧
同一张图上"这批对、那批错"的分界,就是这两类块的 230 正负不同。一批图纸里共有 967 个椭圆,其中 327 个是负方向,123 张图张张都有受影响的符号。
改完只有一处代码,但验证方式我换了思路:不靠肉眼看渲染,改用纯几何判据——每段弧至少有一端要精确落在同块的接续线端点上,容差 0.02 块单位。全批 283 个符号、566 段弧,通过率 100%。这条探针现在做成了独立脚本,以后谁改解析口径,跑一遍就能证伪。
我讲这段不是想说波浪线有多重要,而是想说:"看着没问题"和"能证明没问题"之间,隔着一套判据。
四、把三个词变成三道检查点
技能原本每个判据都有,但它们散在不同脚本里,"什么时候该跑哪个"靠人记。我把它们串成三个带退出码的检查点:
需要说清楚的是:这是一组可插拔的外挂脚本,不是平台内置的自动拦截机制。平台不会自动读取配置文件,也不会自动触发它们;调用方式写在检查点脚本包里,编排层或人工按清单执行即可。我把这组脚本做成独立外挂,没有并进已安装的技能包,这样技能升级时两边不会互相覆盖。
在真实工作目录上试跑的结果:前置检查点 PASS(两条 WARN:输入含 DWG、未存基线快照);后置检查点三道判据全绿,rc=0。其中自检 738 条判定全部 OK、0 FAIL,几何探针 283 个符号 / 566 段弧全部通过。
五、三个命令跑完
工作目录里放好 DWG 或 DXF 就行,产物自动落在同一目录。
set DXF2PDF_UNIT_PER_MM=1 python run.py --root "<工作目录>" --no-index python make_book.py --root "<工作目录>" --title "图纸总册" python verify.py --root "<工作目录>" --copy-to "<交付目录>/PDF"
第一条命令完成转换、出图和自检;第二条合总册;第三条校验并交付。中间那行环境变量不是可有可无的装饰——图纸按 1 单位 = 1 mm 绘制时要显式设 1,否则脚本会去猜,自检报告里的 unit_src 一旦是 fallback,页面尺寸就不可信,不能签收。
依赖很轻:Python 3.7+,核心出图只用标准库;索引页、自检、总册与交付校验需要 PyMuPDF;只有输入是 DWG 时才需要外部转换器,纯 DXF 不用装。技能本身不分发二进制、不联网、不自动安装。
六、必须说清的两件事
第一,它不万能。图上零件序号只标了部分行、材料表文字偏挤、坐标块与焊口号重叠这类情况,要先回原图核对再判断是不是缺陷,转换器不会改动原图布局。极少数 LINE 类图案填充尚未实现;三维模型、可编辑 PDF 表单、源文件是图片或 PDF 的场景都不适用。单张图纸随手看一眼,直接开 CAD 更快。
第二,商业交付要留意转换器的授权边界。DWG→DXF 这一步常用的 ODA File Converter,官方 FAQ 原文是:
"If you are not an ODA member, you can use them for non-commercial applications only."
官方中文页写的是"非 ODA 会员仅限非商业用途使用"。工程交付属于商业用途,因此这一步不适合直接用于收费项目。干净的解法有两个:让上游直接提供 DXF(技能本来就吃 DXF,链路里可以完全去掉这一步),或者用你已有授权的 CAD 软件批量另存 DXF。这条提醒我专门写进文章,是因为工具再顺手,也不该让读者在不知情的情况下踩授权红线。
七、最后
这套东西解决的核心问题,其实不是"怎么把图纸转成 PDF",而是怎么在一百多张图纸里,把"我认为没问题"换成"我能证明没问题"。三道检查点、六条硬指标、一条几何探针,做的都是同一件事:把判断交给可复核的判据,而不是交给那天下午的耐心。矢量、判据、可复现——开篇那三个词,到这里才算有着落。
如果你的图纸也出过"看着没问题、放大就露馅"的情况,评论区说说丢的是哪一样——文字、尺寸、材料表,还是线型?我挑三个最典型的,另写一篇讲排查顺序。
需要功能清单和三道检查点脚本的,在评论区留关键词「清单」,我整理好统一发。
文中数据说明
可验证事实:本文所有功能描述来自技能包 SKILL.md v1.1.1 与 19 个脚本源码;738 条自检、283 个符号 / 566 段弧、123 张 / 127 页的数据来自本机全量重建与检查点试跑日志,只代表这一批图纸,不构成性能承诺;ODA 授权语句来自官方 FAQ 中英文页面。
个人判断:"难点不是转,而是证明"属于我做这套工具后的归纳,不是任何文档的原文;文中关于"受限的是使用行为、不是交付成果"的区分,条款原文并未涉及产物,此处不作展开。
资料来源
Open Design Alliance. "Public Examples." Open Design Alliance, https://www.opendesign.com/faq/public-examples. Accessed 7 Nov. 2026.
Open Design Alliance. "ODA Viewer 与 ODA File Converter 是什么?" Open Design Alliance, https://www.opendesign.com/cn/node/3218. Accessed 7 Nov. 2026.










































































