如何控制ezdxf导出PDF文件时的线条宽度?
ezdxf导出PDF大量图形线条过粗问题解决方案
问题现象
使用ezdxf绘制圆形、方形并导出PDF时,少量图形显示正常;当图形数量增多(横向绘制500+单位),线条会逐渐变粗,即使设置dxfattribs={'lineweight':0}也无法解决。核心原因是PDF画布尺寸固定,图形被缩小适配时,线条宽度未按比例缩放,导致相对过粗。
测试示例代码
def test(): from numpy import arange import ezdxf from ezdxf import units doc = ezdxf.new(dxfversion="R2010") doc.units = units.MM doc.header['$LWDISPLAY'] = 1 msp = doc.modelspace() blk = doc.blocks.new(name='MYBLOCK') blk.add_circle((0,0), 1, dxfattribs={'lineweight':0}) blk.add_polyline2d(((-1,-1),(1,-1),(1,1),(-1,1))) pos_step = 2.0 blockscale = 1.0 # 替换此处数值测试不同数量:5/50/500/5000 for x in arange(0, pos_step*5, pos_step): for y in arange(0, pos_step*3, pos_step): msp.add_blockref('MYBLOCK', (x, y), dxfattribs={'xscale': blockscale, 'yscale': blockscale}) msp.add_linear_dim( base = (0,-pos_step/2), p1 = (0,0), p2 = (pos_step,0), override = {'dimblk': ezdxf.ARROWS.closed_filled} ).render() import ezdxf.matplotlib ezdxf.matplotlib.qsave(msp, 'test.pdf')
测试结果
- 横向5个单位:PDF尺寸6.5×4.8英寸,线条正常
- 横向50个单位:PDF尺寸16×2英寸,线条略粗
- 横向500/5000个单位:PDF尺寸仍为16×2英寸,线条明显过粗甚至形成色块
解决方法
1. 手动设置PDF画布尺寸匹配图形范围
让PDF画布完全适配图形实际大小,避免自动缩放:
- 获取模型空间的边界范围
- 将毫米单位转换为PDF常用的英寸单位(1英寸=25.4毫米)
- 把计算出的尺寸传给
qsave的figsize参数
修改后的导出代码:
import ezdxf.matplotlib # 获取图形边界 extents = msp.get_extents() width_mm = extents.max_x - extents.min_x height_mm = extents.max_y - extents.min_y # 转换为英寸 figsize = (width_mm / 25.4, height_mm / 25.4) # 指定画布尺寸和固定线条宽度导出 ezdxf.matplotlib.qsave(msp, 'test.pdf', figsize=figsize, linewidth=0.3)
2. 强制固定线条宽度
放弃依赖DXF的lineweight设置,直接在导出时通过matplotlib参数指定绝对线条宽度(单位为点,1点=1/72英寸),确保无论图形缩放与否,线条宽度一致:
ezdxf.matplotlib.qsave(msp, 'test.pdf', linewidth=0.25)
3. 关闭自动页面适配(可选)
如果需要保留自定义画布尺寸且避免内容裁剪,可设置fit_page=False(需确认ezdxf版本支持),但优先推荐方法1以保证内容完整适配画布。
原理说明
- DXF的
lineweight=0表示“默认线条宽度”,实际宽度由渲染器(此处为matplotlib)决定,并非绝对0宽度。 matplotlib.qsave()默认会将图形缩放到固定大小的画布(约16×2英寸),线条宽度未随图形缩放比例调整,导致图形越小,线条相对越粗。手动设置画布尺寸后,图形无需缩放,线条宽度保持一致。
内容的提问来源于stack exchange,提问作者Sonicsmooth
相关产品推荐
相关产品推荐

