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

使用JsPDF自定义自动宽高比函数添加图片至PDF不显示

问题原因与解决方案

核心原因

img.onload是异步执行的事件回调。当你调用addImageAutoWidth后,代码会立刻继续执行后续的PDF生成、保存等操作;而图片加载完成触发onload回调时,PDF可能已经被生成完毕,此时doc.addImage的操作根本没被纳入最终的PDF文档中。

而直接调用doc.addImage能正常显示,是因为你传入的base64图片数据已经是就绪状态,addImage是同步执行的,操作会被立即应用到PDF实例上。

修复方案

方案1:利用base64特性直接计算宽高(无需异步加载)

既然你的图片是存储在全局变量中的base64数据,完全可以跳过Image对象的异步加载步骤,直接通过Canvas解析图片宽高,同步计算比例:

function addImageAutoWidth(imageKey, x, y, height) {
  const base64Data = window[imageKey];
  const img = new Image();
  img.src = base64Data;
  
  // 用Canvas同步获取图片宽高(base64数据无需等待网络加载,可立即获取)
  const canvas = document.createElement('canvas');
  const ctx = canvas.getContext('2d');
  ctx.drawImage(img, 0, 0);
  
  const aspectRatio = canvas.width / canvas.height;
  const width = height * aspectRatio;
  
  doc.addImage(base64Data, 'PNG', x, y, width, height);
}

方案2:将函数改为异步,确保图片加载后再处理PDF

如果必须保留onload逻辑,可将函数改为返回Promise,调用时等待加载完成后再执行PDF的保存操作:

function addImageAutoWidth(imageKey, x, y, height) {
  return new Promise((resolve) => {
    const img = new Image();
    img.src = window[imageKey];
    
    img.onload = function() {
      const aspectRatio = img.width / img.height;
      const width = height * aspectRatio;
      
      doc.addImage(img, 'PNG', x, y, width, height);
      resolve();
    };
  });
}

// 调用方式(需在async函数中)
async function generatePDF() {
  // 其他PDF操作...
  await addImageAutoWidth("img_months_" + currentMonth, startPos[0], startPos[1], 20);
  // 确保图片添加完成后再保存PDF
  doc.save('output.pdf');
}

补充说明

你之前的代码中还有一个小问题:width变量没有用let或const声明,会变成全局变量,可能引发意外的变量污染,修复时记得补上声明。

内容的提问来源于stack exchange,提问作者Tobias Glaus

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.21 08:27:49