JHipster生成的Angular应用中jsPDF生产环境生成PDF失败(含图片报错)
问题分析
开发模式正常但生产部署后报错,核心原因是jsPDF直接用URL加载图片时,生产环境下资源加载的异步性导致图片数据未就绪就被调用。开发模式资源加载速度快,异步问题被掩盖;生产环境中资源可能存在缓存延迟、CDN分发差异或构建后的路径处理逻辑变化,导致jsPDF尝试读取未加载完成的图片数据,触发Cannot read properties of undefined (reading 'data')错误。
解决方案
将图片预加载为Base64格式后再传入jsPDF,确保图片数据完全就绪。具体修改如下:
- 添加图片转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); }); }
- 修改
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生成逻辑(如添加表格、文字等)... }
- 调用
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
相关产品推荐
相关产品推荐

