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

如何将PDF的Base64字符串转回ArrayBuffer供pdf-lib加载?

问题描述
  • 后端(Node.js)将PDF转为Base64字符串的逻辑:
const filePath = path.join(pdfFolderPath, file);

// Read the PDF file
const fileData = await fs.readFile(filePath);

// Load the PDF document
const pdfDoc = await PDFDocument.load(fileData);
const arrayBuffer = await pdfDoc.save(); // Save as ArrayBuffer

// Get the file name without extension
const nameWithoutExtension = path.basename(file, path.extname(file));

// Convert to Base64 string for JSON
pdfArray.push({
  name: nameWithoutExtension, // Save without .pdf
  pdf: arrayBuffer.toString("base64"),
});
  • 当前处于纯浏览器环境(无服务器、仅静态HTML),需将上述代码生成的Base64字符串转回可被PDFDocument.load()加载的格式,尝试过atob但未成功。
解决方案

atob解码后得到的是二进制字符串,而PDFDocument.load()只接受二进制数据类型(如Uint8Array或ArrayBuffer),因此需要把二进制字符串转换为Uint8Array:

// 假设a.pdf是你的Base64字符串
const base64Str = a.pdf;

// 解码Base64为二进制字符串
const binaryString = atob(base64Str);

// 将二进制字符串转为Uint8Array
const uint8Array = new Uint8Array(binaryString.length);
for (let i = 0; i < binaryString.length; i++) {
  uint8Array[i] = binaryString.charCodeAt(i);
}

// 用Uint8Array加载PDF
const pdfDoc = await PDFDocument.load(uint8Array);

也可以将Uint8Array转为ArrayBuffer后再加载,效果一致:

const arrayBuffer = uint8Array.buffer;
const pdfDoc = await PDFDocument.load(arrayBuffer);

关键说明

atob(base64Str)会把Base64字符串解码成ASCII字符组成的二进制字符串,但该字符串无法被pdf-lib直接识别,必须转换为二进制数组类型——这是因为PDFDocument.load()仅支持二进制数据输入,不接受字符串格式的内容。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.18 02:24:56