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
相关产品推荐
相关产品推荐

