美文网首页
viewerjs+pdf.js预览pdf文件

viewerjs+pdf.js预览pdf文件

作者: Trytodo_zbs | 来源:发表于2018-11-27 01:31 被阅读22次

前言

开发预览功能,要对各种图片,txt文本,word文档,pdf文档做预览
对于pdf文件的转换可以上传到后端由后端转换为图片在返回地址,也可以直接由前端直接转换pdf文件查看

1.所需工具
<link rel="stylesheet" type="text/css" href="viewer.min.css" />
<script type="text/javascript" src="viewer.js"></script>
<script type="text/javascript" src="pdf.min.js"></script>
<script type="text/javascript" src="pdf.worker.min.js"></script>
2.声明viewer对象
var viewer=new Viewer(document.getElementById("images"),{
    inline: false,//这里使用的是嵌入模式,图片框会嵌入到一定范围,而不会是生产到body中(全屏)
    navbar:navbar,//是否有底部功能栏,
    show: function(){//显示后
        //do something
    },
    viewed: function(evt){
        //do something
    },
    hidden: function(){
        //do something
    }
});

如果需要对图片进行一些初始化调整,在这些钩子里面写相应方法就行
这些钩子在全屏与缩小的时候并不执行,如果想要执行需要修改viewer.js源代码

3.使用Promise来异步加载pdf文件
var srcData=new Promise((resolve, reject)=>{
    PDFJS.getDocument(url).then(function (pdfdoc) {
        //pdfdoc.numPages;pdf文件的总页数
        pdfdoc.getPage(1).then(function (page) {
            var scale = 2;//缩放倍数  个人感觉两倍正好
            var viewport = page.getViewport(scale);
            var canvas = document.createElement('canvas');
            var context = canvas.getContext('2d');
            canvas.height = viewport.height;
            canvas.width = viewport.width;
            var renderContext = {
                canvasContext: context,
                viewport: viewport
            };
            page.render(renderContext).then(()=>{
                //返回图片的base64数据   可直接用于img的src属性
                resolve(canvas.toDataURL("image/png"));
            });
        });
    });
});
4.将获取的数据展示出来
srcData.then((dat)=>{
    document.getElementById("images").innerHTML="<li><img src=\'"+dat+"\'></img></li>";
    viewer.update();
    viewer.view();
});

这样就做到了预览pdf文件的单页
由于pdf文件可能会过于庞大,建议单页预览,所以可以将PDFJS中的pdfdoc属性保存起来,方便获取其他页

//x 代表页数,只需要判断它小于pdfdoc.numPages总页数即可
pdfdoc.getPage(x).then(function (page) {
    //do something
});
5.替换按钮

viewer.js里面的前进和后退按钮就并不符合这种异步观念了,需要自定义按钮替换

//css
.prevBtnInstead{
    position: absolute;
    z-index: 100000;
    width: 49px;
    height: 32px;
    bottom: 0;
    left: calc(50% - 24.5px);
    display: none;
}
//这里的控制逻辑的vue的 当没有图片的时候这两个按钮不应该显示  显示异步的时候我没有显示预览图,所以地步工具栏是没有的bottom为0
<ul id="bodyImgViewBtn" v-if="viewing.list&&viewing.list.length" class="viewer-toolbar prevBtnInstead" :style="{'bottom':'0px','position':'fixed'}">
    <li @click="viewPrev" class="viewer-prev"></li>
    <li @click="viewNext" class="viewer-next"></li>
</ul>
//这里省略了一些代码
//具体控制逻辑具体分析  这里就不写完了
function pdfExec(index){
    var _this=this;
    pdfdoc.getPage(index).then(function (page) {
        var scale = 2;
        var viewport = page.getViewport(scale);
        var canvas = document.createElement('canvas');
        var context = canvas.getContext('2d');
        canvas.height = viewport.height;
        canvas.width = viewport.width;
        var renderContext = {
            canvasContext: context,
            viewport: viewport
        };
        page.render(renderContext).then(()=>{
            _this.$set(_this.viewing,"img",canvas.toDataURL("image/png"));
            _this.$set(_this.viewing,"index",index);
            setTimeout(function(){
                viewer.update();
            },100);
        });
    });
}

viewPrev:function(){
    var nowFile=this.viewing;
    var index=(nowFile.index-1)>=1?(nowFile.index-1):nowFile.length;
    if(index!=nowFile.index){
        this.pdfPageget(index);
    }
},

相关文章

网友评论

      本文标题:viewerjs+pdf.js预览pdf文件

      本文链接:https://www.haomeiwen.com/subject/cdpyfqtx.html