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

