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

NodeJS Express中PdfKit循环添加图片生成空白PDF问题求助

问题分析

你的代码里request.get是基于回调的异步方法,await对它不起作用——因为它不会返回Promise。循环里会立刻发起所有请求,但这些请求的回调还没执行时,doc.end()就已经被调用了,PDF文档提前结束,自然生成空白内容。

解决方案

把request.get转换成支持Promise的形式,这样就能用await等待每个请求完成后再处理图片添加,确保所有内容都写入PDF后再结束文档。

修改后的代码示例

const { promisify } = require('util');
const requestGet = promisify(request.get); // 把request.get转成Promise版本

const doc = new PDFDocument({ size: 'A6' });
var finalString = '';
var stream = doc.pipe(new Base64Encode());

// 用async函数包裹逻辑
(async function() {
  for (const label of labels) { // 用for...of更清晰,避免索引问题
    console.log(`attemping to add image ${label}`);
    
    try {
      const response = await requestGet({
        uri: label,
        encoding: null
      });
      // 直接用response.body就是Buffer,无需转base64再转回
      const img = response.body;
      doc.image(img, 5, 5, {fit: [300, 400], align: 'center', valign: 'center'})
        .rect(430, 15, 100, 100).stroke()
        .text('Centered', 430, 0);
    } catch (err) {
      console.error(`Failed to load image ${label}:`, err);
      // 可在此添加错误处理,比如跳过错误图片或添加占位符
    }
  }
  
  doc.end(); // 所有图片处理完再结束文档
})();

stream.on('data', function(chunk) {
  finalString += chunk;
});

stream.on('end', function() {
  return res.json(finalString);
});

关键修改点

  • 用util.promisify将request.get转换为Promise兼容的方法,让await能正常等待请求完成
  • 将循环逻辑放在async自执行函数中,确保异步流程顺序执行
  • 直接使用response.body作为图片Buffer:设置encoding: null后,request会直接返回Buffer,无需额外转码,节省性能
  • doc.end()放在循环完成后调用,确保所有图片都已添加到PDF文档中

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.22 20:15:11