You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何在pdf.js中使用Base64编码内容时设置选项?

配置pdf.js选项(Base64 PDF场景)

当你拿到的是Base64编码的PDF字符串时,确实没法直接用URL参数来设置pdf.js的选项——毕竟URL参数是针对通过地址加载PDF的场景设计的。不过没关系,我们可以通过代码层面直接配置pdf.js的实例,下面分两种常用场景来说明:

1. 使用官方Viewer组件(带工具栏的完整预览)

如果你想用pdf.js自带的viewer.html那套完整界面,同时加载Base64 PDF并设置选项,可以这么做:

首先,把Base64字符串转成Uint8Array(pdf.js更偏好这种格式):

// 注意:如果你的Base64带了"data:application/pdf;base64,"前缀,要先去掉
const rawBase64 = "这里是你的Base64字符串";
const decodedPdf = atob(rawBase64);
const pdfUint8 = new Uint8Array(decodedPdf.length);
for (let i = 0; i < decodedPdf.length; i++) {
  pdfUint8[i] = decodedPdf.charCodeAt(i);
}

然后,不要直接打开viewer.html,而是手动初始化Viewer实例并传入配置:

// 确保已经引入了pdf.js、pdf.worker.js以及viewer的js和css文件
const container = document.getElementById('pdf-viewer-container');

// 初始化Viewer时直接传入选项
const pdfViewer = new PDFViewer({
  container: container,
  defaultZoom: 'page-width', // 默认页面宽度缩放
  sidebarViewOnLoad: 0, // 0=隐藏侧边栏,1=显示大纲,2=显示缩略图
  enableDownload: false, // 禁用下载按钮
  enablePrint: true, // 启用打印按钮
  // 更多选项可以参考官方文档里的配置项,比如locale、toolbar布局等
});

// 加载转换后的PDF数据
const loadingTask = pdfjsLib.getDocument({ data: pdfUint8 });
loadingTask.promise.then(pdfDoc => {
  pdfViewer.setDocument(pdfDoc);
});

如果你一定要用独立的viewer.html页面,也可以通过postMessage传递PDF数据和配置:

父页面代码:

const viewerWindow = window.open('/path/to/viewer.html');
viewerWindow.onload = () => {
  viewerWindow.postMessage({
    type: 'load-custom-pdf',
    pdfData: pdfUint8,
    options: {
      defaultZoom: 'page-fit',
      enableDownload: false
    }
  }, '*');
};

在viewer.html里添加监听脚本:

window.addEventListener('message', (event) => {
  if (event.data.type === 'load-custom-pdf') {
    const viewer = document.querySelector('#viewer').viewer;
    // 合并自定义选项到Viewer配置
    Object.assign(viewer.options, event.data.options);
    // 加载PDF
    const loadingTask = pdfjsLib.getDocument({ data: event.data.pdfData });
    loadingTask.promise.then(pdfDoc => viewer.setDocument(pdfDoc));
  }
});

2. 直接使用pdf.js核心库(轻量渲染,无工具栏)

如果只需要渲染PDF页面,不需要完整的Viewer界面,可以直接用核心库,配置选项在getDocument方法里传入:

// 同样先把Base64转成Uint8Array
const rawBase64 = "你的Base64字符串";
const decodedPdf = atob(rawBase64);
const pdfUint8 = new Uint8Array(decodedPdf.length);
for (let i = 0; i < decodedPdf.length; i++) {
  pdfUint8[i] = decodedPdf.charCodeAt(i);
}

// 调用getDocument时传入核心配置选项
const loadingTask = pdfjsLib.getDocument({
  data: pdfUint8,
  cMapUrl: '/path/to/cmaps/', // 字体映射文件路径(如果有特殊字体需要处理)
  cMapPacked: true,
  disableFontFace: false, // 是否禁用字体渲染
  maxCanvasPixels: 4096 * 4096 // 最大画布像素限制
});

loadingTask.promise.then(pdfDoc => {
  // 渲染第一页示例
  return pdfDoc.getPage(1);
}).then(page => {
  const canvas = document.getElementById('pdf-canvas');
  const ctx = canvas.getContext('2d');
  const viewport = page.getViewport({ scale: 1.2 });
  canvas.height = viewport.height;
  canvas.width = viewport.width;
  page.render({
    canvasContext: ctx,
    viewport: viewport
  });
});

小提示

  • 官方文档里的URL参数对应的功能,几乎都能找到对应的代码配置项,比如URL的zoom=page-width对应Viewer的defaultZoom: 'page-width',名字大多是对应的。
  • 处理Base64时一定要记得去掉data:application/pdf;base64,前缀,不然atob解码会失败。

内容的提问来源于stack exchange,提问作者Adam S.

火山引擎 最新活动