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

JHipster生成的Angular应用中jsPDF生产环境生成PDF失败(含图片报错)

问题分析

开发模式正常但生产部署后报错,核心原因是jsPDF直接用URL加载图片时,生产环境下资源加载的异步性导致图片数据未就绪就被调用。开发模式资源加载速度快,异步问题被掩盖;生产环境中资源可能存在缓存延迟、CDN分发差异或构建后的路径处理逻辑变化,导致jsPDF尝试读取未加载完成的图片数据,触发Cannot read properties of undefined (reading 'data')错误。

解决方案

将图片预加载为Base64格式后再传入jsPDF,确保图片数据完全就绪。具体修改如下:

  1. 添加图片转Base64的工具函数
async function getImageAsBase64(url: string): Promise<string> {
  const response = await fetch(url);
  const blob = await response.blob();
  return new Promise((resolve, reject) => {
    const reader = new FileReader();
    reader.onloadend = () => resolve(reader.result as string);
    reader.onerror = reject;
    reader.readAsDataURL(blob);
  });
}
  1. 修改getPDF方法为异步,等待图片加载完成
async getPDF() {
  const options: jsPDFOptions = {
    orientation: 'p',
    unit: 'mm',
    format: 'a4',
    putOnlyUsedFonts: true,
    floatPrecision: 16,
  };
  const doc = new jsPDF(options);
  
  // 预加载图片为Base64格式
  const imageBase64 = await getImageAsBase64(ENTETE_PATH_ABMS);
  // 使用Base64数据添加图片到PDF
  doc.addImage(imageBase64, 'JPG', posX, posY, w, h);
  
  // 后续PDF生成逻辑(如添加表格、文字等)...
}
  1. 调用getPDF时处理异步逻辑
    确保调用该方法的地方使用async/await或.then()处理异步:
// 示例调用代码
async generateAndSavePDF() {
  const pdfDoc = await this.printService.getPDF();
  pdfDoc.save('document.pdf');
}
额外检查点
  • 确认posX、posY、w、h变量已正确定义,避免因参数缺失引发其他错误。
  • 验证生产环境中图片URL的可访问性(你已确认能正常访问,此步骤可跳过)。

内容的提问来源于stack exchange,提问作者Manolo de la Vega

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.16 23:27:13