jsPDF中setCurrentTransformationMatrix方法使用异常排查求助
问题原因与解决方案
你的问题根源在于误用了setCurrentTransformationMatrix方法:当你设置unit: 'mm'时,jsPDF会自动应用一个单位转换矩阵(将毫米转换为PDF内部的点单位,1mm≈2.83465点),而setCurrentTransformationMatrix会直接替换掉这个默认矩阵,导致你传入的100被解析为100点(约35.28mm),而非预期的100毫米,最终圆心位置严重偏移。
正确解决方案
方案1:使用addTransform叠加变换(推荐)
addTransform会在默认单位转换矩阵的基础上叠加你的平移操作,不会破坏原有单位逻辑:
import { jsPDF } from 'jspdf'; const doc = new jsPDF({ unit: 'mm' }); // 叠加平移变换:x/y方向各偏移100mm doc.addTransform(1, 0, 0, 1, 100, 100); doc.circle(0, 0, 100); doc.save('output/circle.pdf');
方案2:直接使用translate方法(最简洁)
translate是jsPDF封装的平移工具,本质是对addTransform的简化:
import { jsPDF } from 'jspdf'; const doc = new jsPDF({ unit: 'mm' }); doc.translate(100, 100); doc.circle(0, 0, 100); doc.save('output/circle.pdf');
方案3:若坚持用setCurrentTransformationMatrix
需手动将毫米转换为PDF点,保留单位缩放逻辑:
import { jsPDF } from 'jspdf'; const doc = new jsPDF({ unit: 'mm' }); const scale = doc.internal.scaleFactor; // 获取mm转点的缩放比例 // 构造包含单位转换的完整矩阵 const matrix = doc.Matrix(scale, 0, 0, scale, 100 * scale, 100 * scale); doc.setCurrentTransformationMatrix(matrix); doc.circle(0, 0, 100 * scale); // 半径也要同步转换 doc.save('output/circle.pdf');
额外说明
jsPDF默认坐标系为左上角原点,y轴向下,所以(100,100)是页面左上角向右、向下各100mm的位置。半径100的圆会向左、向上延伸至页面边界(0mm处),这部分会被裁剪,属于正常现象,并非位置错误。
内容的提问来源于stack exchange,提问作者Nmiya
相关产品推荐
相关产品推荐

