pdf.js预览pdf文件流(base64)

本文档介绍如何在前端使用pdf.js预览从后台获取的PDF文件流,特别是以Base64编码的形式。由于在上传PDF文件时无法获取服务器路径,而是直接获取到Base64字符串,通过修改pdf.js的viewer.js和viewer.html,实现了预览功能。在IE浏览器下可能会遇到对象不支持replace属性的错误,这是由于viewer.js未处理直接打开流的情况。

上一篇降到通过file跳转路径,取后台读取pdf文件。

后来我们需要上传pdf文件时支持预览,因为文件尚未传到服务器,所以不存在取后台取文件了,但是我们前端的小哥也没有获取选择的文件的本地路径,只抛给我一个base64码,很尴尬。。。。。

去网上查阅了很多资料,很少有这方面的文章,遂记下来,以备以后用到。

我用的是pdf自带的viewer.html页面。

直接上代码:

1、打开viewer.js,注释掉:var DEFAULT_URL

2、打开viewer.html,添加如下代码:

<script type="text/javascript">
        var DEFAULT_URL = "";
        var pdfUrl =document.location.search.substring(1);
        if(null == pdfUrl || "" == pdfUrl){
            var BASE64_MARKER = ';base64,';//声明文件流编码格式
            var preFileId = "";
            var pdfAsDataUri = "";
            var pdfAsDataUri = sessionStorage.getItem("_imgUrl");//这里就是pdf文件的base64码,我是通过session传递base64的
            var pdfAsArray = convertDataURIToBinary(pdfAsDataUri);
            DEFAULT_URL = pdfAsArray;
           
### 后端返回 PDF 文件流到前端的实现方法 后端可以通过 HTTP 协议将 PDF 文件作为二进制数据流发送至前端。为了确保浏览器能够正确处理这些数据,需设置合适的响应头来指示客户端的行为。 #### 设置 Content-Type 和 Content-Disposition 后端应配置 `Content-Type` 为 `application/pdf` 表明传输的是 PDF 数据[^1]。如果希望强制下载而非直接在浏览器中打开,则需要额外指定 `Content-Disposition` 头部字段: ```http Content-Type: application/pdf Content-Disposition: attachment; filename="example.pdf" ``` 上述头部信息会告诉浏览器此资源是一个附件并建议保存为名为 `"example.pdf"` 的文件[^2]。 对于在线查看的情况,可以省略或者改为如下形式以便于嵌入 `<iframe>` 或其他 HTML 元素展示: ```http Content-Type: application/pdf Content-Disposition: inline; filename="example.pdf" ``` 这样做的目的是让支持的应用程序插件或框架接管渲染过程而不是触发默认下载动作。 #### 前端获取与操作PDF流 当接收到服务器传来的Blob对象时,可以根据需求决定是让用户立即存储还是通过第三方库解析后再做进一步交互比如打印、查找文字等功能。 以下是两种常见场景的具体代码示例: ##### 场景一:自动触发下载链接 利用 JavaScript 创建隐藏 A 标签模拟点击事件完成自动化流程。 ```javascript fetch('https://yourserver.com/api/getPdf', { method: 'GET', }) .then(response => response.blob()) .then(blob => { const url = window.URL.createObjectURL(blob); const a = document.createElement('a'); a.style.display = 'none'; a.href = url; a.download = 'downloadedFile.pdf'; // 自定义文件名 document.body.appendChild(a); a.click(); window.URL.revokeObjectURL(url); }); ``` ##### 场景二:集成 PDF.js 实现高级功能 引入官方推荐的开源项目 [PDF.js](https://mozilla.github.io/pdf.js/) 可以加载远程文档同时提供丰富的 API 支持复杂业务逻辑开发如分页显示、高亮关键字匹配等效果。 首先调整源码中的默认 URL 定义部分使得动态加载成为可能: ```javascript // viewer.js 中找到下面这行代码将其注释掉即可 // var DEFAULT_URL = 'compressed.tracemonkey-pldi-09.pdf' ``` 接着按照官方指南初始化实例化 Viewer 组件并将目标容器绑定上去从而启动整个应用界面布局结构构建工作流: ```html <script type="text/javascript" src="/path/to/build/pdf.js"></script> <div id="viewer" class="pdfViewer"></div> <script type="text/javascript"> var loadingTask = pdfjsLib.getDocument('/some-url/example.pdf'); loadingTask.promise.then(function(pdf) { console.log('Number of pages:', pdf.numPages); function renderPage(pageNum){ pdf.getPage(pageNum).then(function(page){ var scale = 1.5; var viewport = page.getViewport({scale: scale}); var container = document.getElementById('viewer'); var canvas = document.createElement('canvas'); var context = canvas.getContext('2d'); canvas.height = viewport.height; canvas.width = viewport.width; container.append(canvas); var renderContext = {canvasContext:context,viewport:viewport}; page.render(renderContext); }); } for(var i=1;i<=pdf.numPages;i++)renderPage(i); },function(reason){console.error(reason.message)}); </script> ```
评论 19
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值