跳到正文

加载 PDF

无论 PDF 来自 URL、本地文件,还是受密码保护,都通过 core.load() 加载。对于 URL,Core 还可以自动协商使用 HTTP Range。

说明

应用界面负责选择来源并展示进度或错误;Core 负责加载任务和文档生命周期。

加载 URL

ts
await core.load({
  url: '/documents/review.pdf',
  range: 'auto'
})

range: 'auto' 会探测服务器是否支持 HTTP Range,并尽可能分块下载大型 PDF。只有服务器明确不支持 Range 时才会回退到整文件请求;普通网络错误不会触发静默回退。

加载本地文件

ts
const file = fileInput.files?.[0]
if (file) {
  await core.load({ data: new Uint8Array(await file.arrayBuffer()) })
}

文件选择器由应用界面提供。替换文档或销毁实例时,Core 会释放文件字节占用的资源。

发送请求头和凭据

ts
await core.load({
  url: '/api/documents/42.pdf',
  range: 'auto',
  headers: { Authorization: `Bearer ${token}` },
  credentials: 'include'
})

不要把原始 URL、授权请求头或 PDF 内容写入用户可见的错误提示或遥测数据。

展示加载进度

ts
const stopProgress = core.viewer.subscribe(event => {
  if (event.type === 'loadProgress') {
    updateProgress(event.progress.percentage, event.progress.phase)
  }
})

加载阶段(phase)可能是 probingdownloadingparsing。总量未知时,percentagenull;通过 Range 加载的文档可能在全部字节到达前就已可用。组件卸载时,应在销毁 core 的同一清理流程中调用 stopProgress()

请求密码

ts
const stopPassword = core.viewer.subscribe(event => {
  if (event.type !== 'passwordRequired') return
  openPasswordDialog({
    reason: event.request.reason,
    submit: password => core.viewer.submitPassword(event.request.requestId, password),
    cancel: () => core.viewer.cancelPassword(event.request.requestId)
  })
})

密码错误后,应使用新的请求更新现有对话框,而不是再打开一个。Core 不会把密码写入状态快照或错误信息。组件卸载时调用 stopPassword() 退订监听。

取消或替换加载

ts
await core.cancelLoad()
await core.load(nextSource)

后发起的加载拥有最终控制权,旧任务无法覆盖它。如何把结构化加载错误转换成产品提示,见错误恢复

基于 MIT License 发布