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

jsPDF添加水印时文本溢出、水印重叠文本及页面文本断裂问题及布局调整需求咨询

jsPDF添加水印时文本溢出、水印重叠文本及页面文本断裂问题及布局调整需求咨询

看起来你在使用jsPDF生成多页PDF时遇到了几个挺头疼的布局问题,我结合你的代码和需求,给你梳理下解决方案:

问题根源梳理

你目前的核心问题都是因为内容渲染区域和水印区域没有明确的空间划分:

  • 文本溢出、换页断裂:doc.html()的渲染参数没和页面边距、水印空间匹配,内容直接顶到了页眉/页脚区域,甚至超出页面。
  • 水印重叠文本:水印是直接加在渲染好的内容顶层,而内容没有预留出水印的位置,自然会重叠。
  • 页眉logo未占满宽度:当前用了固定宽度45,没有适配页面宽度。

具体修改方案

1. 调整PDF内容渲染区域,预留水印空间

修改doc.html()的参数,让内容只在页眉和页脚之间的安全区域渲染,同时开启自动分页避免文本断裂:

doc.html(dados, {
  callback: function(doc) {
    doc = addWaterMark(doc, tipo);
    doc.save(tipo + evento_id +'.pdf');
  },
  x: 15, // 内容左边距
  y: 30, // 内容上边距(给页眉logo预留足够空间)
  width: doc.internal.pageSize.width - 30, // 内容宽度=页面总宽-左右边距*2,避免溢出
  height: doc.internal.pageSize.height - 70, // 内容高度=页面总高-上边距30-页脚预留40
  autoPaging: 'text', // 基于文本自动分页,解决内容断裂问题
  windowWidth: 750 // 保持你的窗口宽度设置,和PDF宽度比例匹配即可
});

2. 修改水印函数,实现页眉logo全屏+避免内容重叠

调整addWaterMark里的图片位置、尺寸,让页眉logo占满页面宽度,同时给页脚文本预留空间:

function addWaterMark(doc, tipo) {
  var totalPages = doc.internal.getNumberOfPages();
  var img2 = new Image();
  var img1 = new Image();
  img1.src = '/img/logo-pdf.png';
  img2.src = '/img/rodape-pdf.png';
  const pageMargin = 15; // 和内容边距保持一致

  // 计算页眉logo尺寸:占满页面宽度(减去边距),保持原比例
  const headerLogoWidth = doc.internal.pageSize.width - pageMargin * 2;
  const headerLogoHeight = headerLogoWidth * (14/45); // 用你原来的宽高比45:14计算高度,避免拉伸

  for (i = 1; i <= totalPages; i++) {
    doc.setPage(i);
    // 页眉logo:从左边距开始,横向铺满页面
    doc.addImage(img1, 'PNG', pageMargin, 10, headerLogoWidth, headerLogoHeight);
    
    if(tipo != 'visaogeral'){
      // 页脚logo:放在内容区域下方,预留文本空间
      const footerStartY = doc.internal.pageSize.height - 40;
      // 页脚logo也可以铺满宽度,和页眉保持一致
      doc.addImage(img2, 'PNG', pageMargin, footerStartY, doc.internal.pageSize.width - pageMargin * 2, 25);
      // 如果要添加页脚文本,在这里加即可,位置在logo下方
      // doc.setFontSize(10);
      // doc.text('你的页脚文本内容', pageMargin, footerStartY + 30);
    }
  }
  return doc;
}

3. 提前加载字体,确保渲染生效

把字体加载的代码移到创建PDF实例之后、AJAX请求之前,避免字体在渲染时未就绪:

window.jsPDF = window.jspdf.jsPDF;
var doc = new jsPDF();

// 提前添加并设置字体
doc.addFileToVFS('Montserrat-Medium-normal.ttf');
doc.addFont('Montserrat-Medium-normal.ttf', 'Montserrat-Medium-normal', 'normal');
doc.setFont('Montserrat-Medium-normal', 'normal');
doc.setFontSize(28);

// 后续的AJAX请求代码...

4. 优化HTML内容样式,避免文本溢出

在后端返回的HTML内容中添加基础样式,确保内容适配PDF渲染宽度:

<style>
  * {
    max-width: 100%;
    box-sizing: border-box;
    margin: 0;
    padding: 0;
  }
  p, div, span {
    word-wrap: break-word; /* 长文本自动换行 */
  }
</style>

修改后的效果

  • 内容会在页眉和页脚之间的安全区域渲染,不会和水印重叠。
  • 页眉logo自动铺满页面宽度,保持原有比例不变形。
  • 文本会自动分页,不会出现断裂或溢出页面的情况。
  • 页脚logo下方预留了足够空间,你可以直接添加文本而不会被覆盖。

备注:内容来源于stack exchange,提问作者LucasBrandão

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.23 10:44:12