PDFJS使用

PDFJS是在线预览PDF的一款神器。 对于PC端浏览器,一般直接提供pdf文件,iframe一下就可以直接预览了。我使用这个插件的原因是在移动端,android微信无法在线预览。

(android微信搜了一下,原因是微信android使用x5的内核,就是QQ浏览器的那个,经过多次尝试,貌似它只要检测到文件流,就会直接下载,而不是打开到页面上)

先贴一个地址:http://mozilla.github.io/pdf.js/examples/index.html#interactive-examples 这个是官方示例。

使用pdfjs在线预览pdf可以有两个选择:

1、使用pdfjs已经写好的viewer.html页面,例子:http://mozilla.github.io/pdf.js/web/viewer.html 做的功能比较全面。就是要部署pdfjs一堆的代码到服务器上。移动端也有直接预览的页面 https://github.com/mozilla/pdf.js/tree/master/examples/mobile-viewer 这个没找到在线可运行的例子。

2、就是自己调用API做了,如果你的要求不多,实现起来也不难。

下面说下我的做法

场景:提供微信端在线pdf预览功能,框架使用Vue + pdfjs

step1:引用js文件

import PDFJS from 'pdfjs-dist'

step2:读取pdf文件

我在vue的beforeRouteEnter里加载pdf

var p = api.getPdfBase64Data(this.fileid) //后台读取pdf文件base64内容(下面说为什么是base64)
p.then(function(pdfData){
            PDFJS.getDocument({data:pdfData}).then(function getPdfHelloWorld(pdf) {
            t.totalPage = pdf.numPages;//总页数
            //我是一次加载了所有页,网上一些是一页页加载的,因为我的pdf页数不多
            for(var i = 1;i<=t.totalPage;i++) {
              pdf.getPage(i).then(function getPageHelloWorld(page) {
                var scale = 1;//缩放倍数,1表示原始大小
                var viewport = page.getViewport(scale);
                var canvas = document.getElementById('the-canvas' + page.pageNumber);
                var context = canvas.getContext('2d');
                canvas.height = viewport.height;
                canvas.width = viewport.width;
                var renderContext = {
                  canvasContext: context,
                  viewport: viewport
                };
                page.render(renderContext).promise.then(function(){
                  t.loadedPageCount ++;//加载一个+1,最后总数和totalPage一样了,表示pdf加载完了
                });
              });
            }
          }).catch(function(e){
            alert('附件暂时无法移动端预览,请在PC端查看')
          });
})

step3:HTML

<canvas v-for="n in totalPage" :id="'the-canvas' + n" class="pdf-content"></canvas>

canvas是pdf显示的地方,一个canvas加载一页pdf,所以我按总页数生成了好几个canvas

 

为什么使用base64呢?

因为,在x5内核的微信里,就算使用ajax调用返回的是pdf文件,貌似也会走下载那一套,然后ajax接收不到文件流,因此就显示不了。 使用base64,就是一个完整的字符串,可以正常返回到ajax.

放大、缩小怎么办呢:

我的做法是重新调用一下上面的for循环的内容,重新画一遍。

其它的功能,如打印、导航栏,暂时没用到,还没做。 需要用到的可以研究下git上viewer.html的实现方式。

还有文本复制, pdfjs是在canvas上又盖了一个div,把文本显示在里面的各个小div里的,记得是pdfjs有一个API page.getTextContent().then(function(textContent) , 需要用到的可以查一下如何实现。

 

posted @ 2017-12-13 15:35  WileyWong  阅读(34454)  评论(3编辑  收藏  举报