--------------------
🙋♀️ 本期工具展示
有这么多图需要打印成不同的文件的时候

写了批量打印并链接打word方案更新
--------------------
背景
市面上有批量打印插件,功能成熟,但问题在于——打印从来不是终点。实际工作流程是:改图 → 打印PDF → 把图纸插入方案文档 → 更新 → 输出新一版PDF。如果打印是孤立的,后续步骤还得手动做。
所以这套工具的核心不是“批量打印”这个功能,而是把CAD打印变成可编程的API,让它可以融入更大的自动化流程。
--------------------
🚀 批量打印的实现细节
2.1 连接CAD
CAD通过COM接口对外暴露编程能力。Python用win32com.client来调用。
import pythoncomimport win32com.clientdef connect_cad(): """连接ZWCAD""" pythoncom.CoInitialize() cad = win32com.client.Dispatch("ZWCAD.Application") cad.Visible = True return cad
关键点:CoInitialize()必须在每个使用COM的子线程中调用,否则报错“尚未调用CoInitialize”。2.2 选择图框和文件名
用户的操作流程:先框选图框,再点选文件名文字。一组一组选,右键结束。
def collect_groups(doc): """收集用户选择的分组""" groups = [] while True: # 1. 选择图框(INSERT类型) sel_frames = doc.SelectionSets.Add("Frames") sel_frames.SelectOnScreen([0], ["INSERT"]) if sel_frames.Count == 0: break # 右键结束 # 2. 选择文件名(TEXT或MTEXT) sel_text = doc.SelectionSets.Add("Text") sel_text.SelectOnScreen([0, 0], ["TEXT", "MTEXT"]) # 3. 提取文字作为文件名 text_obj = sel_text.Item(0) if text_obj.ObjectName == "AcDbText": raw_name = text_obj.TextString else: raw_name = text_obj.Text # 清理非法字符 import re filename = re.sub(r'[\\/*?:"<>|]', '', raw_name).strip() # 4. 记录这一组 groups.append({ 'frames': sel_frames, 'filename': f"{filename}.pdf" }) sel_frames.Delete() sel_text.Delete() return groups
2.3 打印配置(重要坑点)
打印的核心是设置布局(Layout)的各项属性。
def print_frame(doc, min_point, max_point, output_path): """打印单个图框到PDF""" layout = doc.ActiveLayout # 选择打印机 layout.ConfigName = "DWG to PDF.pc5" # 设置纸张大小(这里有个坑) # AutoCAD: "ISO A3 (420.00 x 297.00 mm)" # 中望CAD: "ISO A3 (420.00 x 297.00 毫米)" layout.CanonicalMediaName = "ISO A3 (420.00 x 297.00 毫米)" layout.PaperUnits = 1 # 1=毫米 # 设置打印范围 min_x, min_y, _ = min_point max_x, max_y, _ = max_point layout.SetWindowToPlot( win32com.client.VARIANT(pythoncom.VT_ARRAY | pythoncom.VT_R8, (min_x, min_y, 0)), win32com.client.VARIANT(pythoncom.VT_ARRAY | pythoncom.VT_R8, (max_x, max_y, 0)) ) layout.PlotType = 4 # 窗口打印 layout.CenterPlot = True # 关闭后台打印(重要!) doc.SetVariable("BACKGROUNDPLOT", 0) doc.SetVariable("FILEDIA", 0) # 执行打印 doc.Plot.PlotToFile(output_path)
两个关键坑:
纸张名称:中望CAD用“毫米”,AutoCAD用“mm”。写错了不会报错,但打印出来永远是Letter尺寸。
后台打印:BACKGROUNDPLOT必须设为0。如果开着后台打印,PlotToFile会立即返回,但实际还没生成PDF,后续合并文件时会找不到。
2.4 合并PDF
每张图纸单独打印成临时PDF,最后用PyPDF2合并成一个文件。
import PyPDF2def merge_pdfs(pdf_list, output_path): """合并多个PDF""" writer = PyPDF2.PdfWriter() for pdf_file in pdf_list: reader = PyPDF2.PdfReader(pdf_file) for page in reader.pages: writer.add_page(page) with open(output_path, 'wb') as f: writer.write(f)
--------------------
🙋♀️ 作者:leilei
💫 碎碎念学习记录
📅 更新时间:2026年3月