You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.06 05:33:30