PDF.js 是一个由 Mozilla 开发的开源 JavaScript 库,用于在网页上解析和渲染 PDF 文件。它不依赖于任何外部服务器或插件,可以在浏览器中直接运行。PDF.js 支持多种平台和设备,包括桌面、移动设备和嵌入式
环境:浏览器端
技术选型:pdf.js
下载地址:pdf.js稳定版
├── build/
│ ├── pdf.js - display layer
│ ├── pdf.js.map - display layer's source map
│ ├── pdf.worker.js - core layer
│ └── pdf.worker.js.map - core layer's source map
├── web/
│ ├── cmaps/ - character maps (required by core)
│ ├── compressed.tracemonkey-pldi-09.pdf - PDF file for testing purposes
│ ├── debugger.js - helpful debugging features
│ ├── images/ - images for the viewer and annotation icons
│ ├── locale/ - translation files
│ ├── viewer.css - viewer style sheet
│ ├── viewer.html - viewer layout
│ ├── viewer.js - viewer layer
│ └── viewer.js.map - viewer layer's source map
└── LICENSE
pdf.js 提供了多种pdf预览方式,本文采用iframe预览方式,即单独部署pdf.js作为一个预览网站,生产环境使用iframe时传入pdf文件地址即可实现预览
在项目页面里添加代码:
由于需要在主项目里实现一些特殊的pdf操作,故选用postMessage 对内嵌的iframe进行数据通信来实现各种操作,由于涉及跨域通信,需要后端同事做一下cos跨域处理即可
// pdf.js 应用 暴露 PDFViewerApplication 实例 改写属性 window.PDFViewerApplication.page = targetPage
// pdf.js 应用 暴露 PDFViewerApplication 实例 触发文字搜索时间,高亮文字 window.PDFViewerApplication.findBar.findField.value = value; window.PDFViewerApplication.findBar.highlightAll.checked = true; window.PDFViewerApplication.findBar.dispatchEvent('highlightallchange');
// pdf.js 应用 暴露 PDFViewerApplication 实例 改写属性 window.PDFViewerApplication.scrollTop = scrollTop
pdf.js 的dom结构在viewer.html文件,样式在viewer.css文件,改写需要的UI即可
新建messageHandler.js文件,插入pdf应用中用于接收来自主应用的操作指令,文件代码如下:
window.addEventListener('message', function (message) { const { data } = message; const { type, value } = data; switch (type) { // 页面切换 case 'SET_PAGE': window.PDFViewerApplication.page = value; break; // 高亮文本 case 'HIGHT_LINE': window.PDFViewerApplication.findBar.findField.value = value; window.PDFViewerApplication.findBar.highlightAll.checked = true; window.PDFViewerApplication.findBar.dispatchEvent('highlightallchange'); break; // 页面高度定位 case 'SET_TOP': document.getElementById('viewerContainer').scrollTop = document.getElementById('viewerContainer').scrollTop+c_urlArray['top']*1; default: break; } });
将该文件添加到预建包的web目录下,再在web目录下的viewer.html文件里插入一下代码:
PDF.js viewer // 这是要插入的代码 ····
此时pdf应用已支持处理主应用的pdf操作事件,部署到服务器即可,不要忘记叫后端同事处理一下跨域
此过程可能会遇见部署后,访问请求不到部分资源问题,这是因为部署时,配置的根目录不对,正确的根目录在web文件夹的父级,慢慢来,不要急
注意这里的src地址必需为:你部署的Ips地址+ /pdf/web...拼接而成,不然会引起代码里的文件资源会混乱,所有步骤2中正确的根目录在web文件夹的父级,这个/pdf/web里pdf文件夹是我自己起的名字,你可以自由更改这个文件夹的名字
参数说明:
const iframe = document.getElementById('pdfPreview') as HTMLIFrameElement; // 切换页面 iframe.contentWindow?.postMessage({ type: 'SET_PAGE', value: targetPageNo },'*'); // 高亮文本 iframe.contentWindow?.postMessage({ type: 'HIGHT_LINE', value: targetText},'*'); // 页面高度定位 iframe.contentWindow?.postMessage({ type: 'SET_TOP', value: targetTop},'*');
此时,你的主应用以支持调用pdf的基本操作
调整viewer.css和viewer.html文件里的代码,也可以直接引入各种库,来装饰你的pdf应用