如何在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.




