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

JsPDF中旋转180度的多行居中对齐文本仅渲染首行的问题求助

JsPDF中旋转180度的多行居中对齐文本仅渲染首行的问题求助

兄弟,我之前也踩过这个坑!JsPDF自带的text方法在同时处理180度旋转、多行文本和居中对齐的时候,确实有坐标计算的bug——导致后续行要么跑到页面可视区域外,要么被错误定位,所以只显示首行。

给你两个亲测有效的解决办法:


方法一:手动拆分文本逐行绘制

先把文本拆分成符合宽度要求的行,然后手动调整每一行的位置——因为180度旋转后,文本的排列方向会反转,我们得反向处理行的偏移:

const description = "你的多行测试文本内容,这里可以替换成实际需要渲染的内容";
const maxWidth = 80;
const lineHeight = doc.internal.getLineHeight();

// 第一步:把文本拆分成符合宽度的多行
const lines = doc.splitTextToSize(description, maxWidth);

// 保存当前绘图状态,避免影响后续的PDF内容
doc.save();

// 平移到目标位置,再旋转180度(顺序很重要!先平移再旋转)
doc.translate(x, y);
doc.rotate(180);

// 计算整个文本块的总高度,用来调整起始位置实现居中
const totalTextHeight = lines.length * lineHeight;
let currentY = -totalTextHeight + lineHeight; // 从文本块底部开始绘制

// 逐行绘制,手动保证每一行居中
lines.forEach(line => {
  const singleLineWidth = doc.getTextWidth(line);
  // 计算居中的x坐标:让行文本在maxWidth范围内居中
  const centeredX = (maxWidth - singleLineWidth) / 2;
  doc.text(line, centeredX, currentY, { maxWidth: maxWidth });
  currentY += lineHeight;
});

// 恢复之前的绘图状态
doc.restore();

方法二:调整旋转原点简化操作

这个方法更简洁,核心是先把坐标系原点移到文本块的中心,再旋转180度,这样JsPDF的居中对齐就能正常工作:

const description = "你的多行测试文本内容,这里可以替换成实际需要渲染的内容";
const maxWidth = 80;

// 拆分文本为多行
const lines = doc.splitTextToSize(description, maxWidth);
const lineHeight = doc.internal.getLineHeight();
const totalTextHeight = lines.length * lineHeight;

doc.save();

// 计算文本块的中心坐标:目标位置(x,y)需要调整为文本块的中心
const textCenterX = x - maxWidth / 2;
const textCenterY = y - totalTextHeight / 2;

// 平移到文本块中心,再旋转180度
doc.translate(textCenterX, textCenterY);
doc.rotate(180);

// 直接绘制多行文本,此时align:center会正常生效
doc.text(lines, 0, 0, { maxWidth: maxWidth, align: 'center' });

doc.restore();

为啥原来的代码不行?因为当你直接给text方法传angle:180时,JsPDF的多行布局算法会错误地计算后续行的y坐标——默认多行是向下排列,180度旋转后,这个向下的偏移就变成了向上,直接超出了页面顶部(或者可视区域),所以只有首行能被看到。

备注:内容来源于stack exchange,提问作者CeVR

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.14 10:23:00