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

SPFX Web Part合并PDF生成空白页,求排查原因

问题描述

我正在开发一个SPFX Web Part,用于将选中的文档合并为一个文件,使用的是pdf-lib和@pnp/sp库。测试运行后,生成的文档仅为空白页,以下是我的代码:

const mergedFile = await PDFDocument.create();

// Loop through each selected item
this.context.listView.selectedRows.forEach(async (row: RowAccessor) => {
   // Get the file array buffer
   const file = sp.web.getFileByServerRelativePath(row.getValueByName('FileRef'));
   const fileBytes: ArrayBuffer = await file.getBuffer();
   const fileToMerge = await PDFDocument.load(fileBytes);

   const copyPages = await mergedFile.copyPages(fileToMerge, fileToMerge.getPageIndices());
   copyPages.forEach((page) => {
     mergedFile.addPage(page);
   });
});


const savedMergedFile = await Promise.resolve(mergedFile.save());
const newFileAsBlob = new Blob([savedMergedFile]);
const newFile = await sp.web.getFolderByServerRelativePath(path).files.addChunked(encodeURI("newFile.pdf"), newFileAsBlob,  undefined, true);
问题原因及修复方案

核心问题

forEach循环搭配async回调时,不会等待每个异步任务执行完成,代码会直接跳过循环执行后续的mergedFile.save(),此时mergedFile还未添加任何页面,最终生成空白PDF。

修复代码

const mergedFile = await PDFDocument.create();

// 用map生成Promise数组,通过Promise.all等待所有合并操作完成
await Promise.all(this.context.listView.selectedRows.map(async (row: RowAccessor) => {
   const file = sp.web.getFileByServerRelativePath(row.getValueByName('FileRef'));
   const fileBytes: ArrayBuffer = await file.getBuffer();
   const fileToMerge = await PDFDocument.load(fileBytes);

   const copyPages = await mergedFile.copyPages(fileToMerge, fileToMerge.getPageIndices());
   copyPages.forEach((page) => {
     mergedFile.addPage(page);
   });
}));

// 确认所有页面添加完成后再保存上传
const savedMergedFile = await mergedFile.save();
const newFileAsBlob = new Blob([savedMergedFile]);
const newFile = await sp.web.getFolderByServerRelativePath(path).files.addChunked(encodeURI("newFile.pdf"), newFileAsBlob, undefined, true);

额外建议

  • 增加文件类型校验,确保选中的都是有效的PDF文件,避免PDFDocument.load()抛出错误
  • 添加加载状态提示,防止用户在异步操作未完成时重复触发功能

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.12 18:03:35