base64 基于pdf.js的html多页面系统pdf预览(电子签章)

3,204 阅读2分钟

首先说一下需求:

    PC端实现文件盖章预览功能;后端返回的是base64的数据

环境说明:

    pc是多页面系统,也就是最古老的html+js+css

PC端:

    pc端因为是单页面系统,也不需要考虑打包,项目库跟随本地代码更新,pdfjs源码需要修改的地方修改一次,提交到代码库,其他开发者拉取之后无需二次修改。

具体实现:

1. 下载pdf.js包,可以在官方地址下载

    mozilla.github.io/pdf.js/gett…

    或者到我的网盘下载(已修改后的源码包--注释相关代码,以显示电子签章):地址已设置永久有效,无法获取可私信或者留言

    链接:pan.baidu.com/s/1l302vEar… 提取码:5pgj

2. 然后将pdf.js包放置在自己的项目中,我是先将文件夹名称统一改成了pdf(感觉清晰简洁,个人习惯),以下是我的目录:

3. 因为接口返回的数据是base64的缘故,我们需要对源码中的一些地方进行修改

打开web下面的viewer.html文件,我们可以看到如下代码(源码):

添加如下代码(只是插入一段处理base64数据的js,我的pdf数据存放在localStorage里面,需要支持ie8以下的浏览器慎用):

<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 = localStorage.getItem("_pdf");//这里就是pdf文件的base64码,我是通过session传递base64的        var pdfAsArray = convertDataURIToBinary(pdfAsDataUri);        DEFAULT_URL = pdfAsArray;        //编码转换        function convertDataURIToBinary(dataURI) {            //[RFC2045]中有规定:Base64一行不能超过76字符,超过则添加回车换行符。因此需要把base64字段中的换行符,回车符给去掉。            // var base64Index = dataURI.indexOf(BASE64_MARKER) + BASE64_MARKER.length;            var newUrl = dataURI.replace(/[\n\r]/g,'');            var raw = window.atob(newUrl);//这个方法在ie内核下无法正常解析。            var rawLength = raw.length;            //转换成pdf.js能直接解析的Uint8Array类型            var array = new Uint8Array(new ArrayBuffer(rawLength));            for (i = 0; i < rawLength; i++) {                array[i] = raw.charCodeAt(i) & 0xff;            }            return array;        }    }  </script>

结果如下:

这里配置好之后,那么我们就要来调用了

4. 使用pdfjs

// 先将base64数据存入缓存(根据自己需求来取)localStorage.setItem('_pdf',r.data.base64); // 可以直接打开viewer.html实现效果window.location.href="./pdf/web/viewer.html";// 以下是本人基于layui的弹窗需求pdfView('./pdf/web/viewer.html');pdfView: function(uul) {    layui.use('layer', function () {    var layer = layui.layer;    layer.open({       type: 2,       area: ['1000px', '750px'],       fixed: false, //不固定       maxmin: true,       content: uul     });   });},

5.效果展示(因为内容涉及敏感信息,所以就打码了,但是所需要展示的功能点保留完整)(不知道为什么掘金里面这张图片显示不出来)

6. 下面就说一下电子签章的问题,因为pdfjs默认隐藏签章功能的,所以只需要找到源码包,build文件夹下面的pdf.worker.js文件,并找到如下代码:

if (data.fieldType === 'Sig') {   data.fieldValue = null;    _this3.setFlags(_util.AnnotationFlag.HIDDEN);}

    将以上代码注释掉即可显示电子签章(亲测有效),但是需要说明的是如果你使用的是pdf-dest这个包,很有可能注释之后还是无法显示电子签章,目前未找到有效的解决办法。

感谢:

    最后,感谢您的阅读,如果以上内容存在疑问或者错误,欢迎留言提供意见和建议

下一篇预告:vue框架中预览pdf(中文、水印、电子签章)