
本文介绍如何使用 python 自动绘制符合真实物理尺寸(毫米级精度)的圆形定位图,并导出为 a4 尺寸 pdf,确保打印后图形尺寸严格准确,适用于钻孔定位等工业场景。
本文介绍如何使用 python 自动绘制符合真实物理尺寸(毫米级精度)的圆形定位图,并导出为 a4 尺寸 pdf,确保打印后图形尺寸严格准确,适用于钻孔定位等工业场景。
在机械加工、PCB 打样或木工定位等实际作业中,常需将设计点位以真实比例(如毫米)精确呈现在纸质图纸上,用于目视对齐与钻孔。传统依赖 Excel 手动绘图易引入缩放误差、单元格尺寸失真及打印缩放干扰,导致最终纸面坐标与物理尺寸偏差显著。本文提供一种专业、可靠、零误差的解决方案:用 Python 生成物理尺寸精准的矢量 PDF 图形。
核心思路是绕过像素单位陷阱,直接在「毫米坐标系」中建模,并通过高保真 PDF 输出锁定绝对尺寸。关键在于两点:
- 坐标系统统一为毫米(mm):所有输入(x, y, diameter)均以毫米为单位;
- 输出设备参数严格匹配 A4 物理规格:A4 纸张尺寸为 210 mm × 297 mm,需在绘图时显式设置 figsize(英寸)与 dpi,使 matplotlib 的渲染逻辑与物理尺寸对齐。
以下为完整实现代码(已优化鲁棒性与实用性):
import matplotlib.pyplot as plt
from matplotlib.patches import Circle
from matplotlib.backends.backend_pdf import PdfPages
def draw_circles_to_a4_pdf(circle_data, output_path="drill_template.pdf",
margin_mm=5, grid_step_mm=10, show_grid=True):
"""
在 A4 尺寸 PDF 中绘制毫米级精度的圆形定位图
Args:
circle_data: List[Tuple[x_mm, y_mm, diameter_mm]],所有坐标单位为毫米
output_path: 输出 PDF 路径
margin_mm: 图形边界留白(毫米),避免被打印机裁切
grid_step_mm: 网格线间距(毫米),默认 10 mm
show_grid: 是否显示辅助网格
"""
# A4 尺寸(毫米)→ 转换为英寸(matplotlib 使用英寸 + DPI)
width_inch = 210 / 25.4
height_inch = 297 / 25.4
dpi = 100 # DPI 不影响 PDF 矢量精度,但影响栅格元素(如网格)渲染质量
fig, ax = plt.subplots(figsize=(width_inch, height_inch), dpi=dpi)
# 设置坐标范围:留出边距,单位为毫米
xlim = (0, 210)
ylim = (0, 297)
ax.set_xlim(xlim)
ax.set_ylim(ylim)
# 绘制辅助网格(可选)
if show_grid:
for x in range(0, 211, grid_step_mm):
ax.axvline(x=x, color='lightgray', linewidth=0.4)
for y in range(0, 298, grid_step_mm):
ax.axhline(y=y, color='lightgray', linewidth=0.4)
# 绘制用户输入的每个圆(注意:radius = diameter/2)
for x, y, d in circle_data:
if not (0 <= x <= 210 and 0 <= y <= 297):
print(f"警告:圆心 ({x:.1f}, {y:.1f}) 超出 A4 边界,将被部分截断")
circle = Circle((x, y), d/2, fill=False, edgecolor='black', linewidth=0.8)
ax.add_patch(circle)
# 关键设置:保持横纵坐标等比例,避免椭圆变形
ax.set_aspect('equal')
# 隐藏坐标轴刻度与标签,保留干净图纸
ax.set_xticks([])
ax.set_yticks([])
ax.spines['top'].set_visible(False)
ax.spines['right'].set_visible(False)
ax.spines['bottom'].set_visible(False)
ax.spines['left'].set_visible(False)
# 保存为 PDF(矢量格式,无缩放失真)
with PdfPages(output_path) as pdf:
pdf.savefig(fig, bbox_inches='tight', pad_inches=0)
plt.close(fig)
print(f"✅ 已生成精准 A4 PDF:{output_path}(尺寸 210×297 mm)")
# ✅ 示例:定义钻孔位置(单位:毫米)
circles = [
(45.0, 62.5, 8.0), # 第1个孔:x=45mm, y=62.5mm, 直径8mm
(120.3, 185.0, 6.5), # 第2个孔:带小数,体现高精度支持
(185.0, 40.0, 12.0), # 第3个孔:靠近右边界
]
# 一键生成可打印图纸
draw_circles_to_a4_pdf(
circle_data=circles,
output_path="drill_layout_A4.pdf",
margin_mm=3,
grid_step_mm=5
)? 重要注意事项:
- 打印设置必须为「实际大小」或「100% 缩放」:在 Adobe Acrobat 或系统打印对话框中,务必取消勾选“适应页面”、“缩放以适合”等自动缩放选项,否则会破坏毫米精度;
- 验证打印精度:首次使用前,建议用游标卡尺实测 PDF 中某圆直径或两点间距,确认误差
- 扩展性提示:该脚本可轻松集成至 Tkinter/PyQt GUI,接收用户输入并实时预览;亦可读取 CSV/Excel 表格批量导入坐标;
- 不推荐使用 reportlab 直接绘图:虽然可行,但 matplotlib 提供更直观的几何对象(Circle、Rectangle)和成熟坐标管理,且 PDF 输出天然支持矢量缩放与高 DPI 渲染。
通过本方案,您彻底摆脱 Excel 单元格拟合误差与打印机驱动缩放干扰,获得一份即打即用、毫米级可信的物理定位模板——这是自动化制造准备环节中不可或缺的精度基石。











