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

如何不使用fetch/node加载本地PDF通过pdf-lib在客户端编辑

纯客户端无Node、无fetch加载本地PDF方案

所有方案最终输出的都是和fetch返回格式完全一致的ArrayBuffer类型PDF字节流,可以直接传入pdf-lib的加载方法,不需要修改后续PDF编辑逻辑。

方案1:用户自主选择本地PDF文件(最常用)

通过原生文件选择控件获取用户本地的PDF文件,直接调用浏览器原生API读取字节流,全程无网络请求、不依赖Node环境。

  • 页面中加入PDF文件选择控件:
<input type="file" id="localPdfSelector" accept=".pdf" />
  • 监听选择事件读取文件内容:
const selector = document.getElementById('localPdfSelector')
selector.addEventListener('change', async (e) => {
  const pdfFile = e.target.files[0]
  if (!pdfFile) return
  // 直接读取为ArrayBuffer,和原有fetch返回结果完全等价
  const formPdfBytes = await pdfFile.arrayBuffer()
  // 后续直接调用pdf-lib加载即可,示例:
  // const pdfDoc = await PDFDocument.load(formPdfBytes)
})

*如果需要兼容极老旧不支持File.arrayBuffer()的浏览器,可以替换为FileReader.readAsArrayBuffer()实现,逻辑一致。

方案2:内嵌固定PDF模板(适用于预设模板场景)

如果待加载的是固定不变的PDF模板(比如表单模板、合同模板),不需要用户选择,也不想发起fetch请求,可以提前把PDF文件转为base64字符串内嵌到代码中,运行时直接转成ArrayBuffer使用。

// 提前转换好的PDF base64字符串,替换为你自己的文件内容即可
const pdfTemplateBase64 = '此处替换为你的PDF转base64后的长字符串'

// base64转ArrayBuffer工具函数
function base64ToBuffer(base64) {
  const binary = atob(base64)
  const byteArr = new Uint8Array(binary.length)
  for (let i = 0; i < binary.length; i++) {
    byteArr[i] = binary.charCodeAt(i)
  }
  return byteArr.buffer
}

// 直接获取可用的PDF字节流,无任何网络请求
const formPdfBytes = base64ToBuffer(pdfTemplateBase64)
// 后续直接传入pdf-lib加载即可

提示:不要把大体积PDF转base64内嵌,会明显增加前端代码包体积,超过2M的PDF优先用方案1的用户选择方式加载。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.27 14:06:28