读取解析预览pdf文件的插件之pdf.js

最近有这样一个需求,需要在线预览pdf文件,于是就去找这方面的插件。最后筛选了一下,选择了pdf.js这个插件。
我们先看一下pdf.js定义:
pdf.js可以实现在html下直接浏览pdf文档,是一款开源的pdf文档读取解析插件
pdf.js主要包含两个库文件,一个pdf.js和一个pdf.worker.js,,一个负责API解析,一个负责核心解析

pdf.js本质上是用canvas渲染的,pdf文件经过解析之后,在canvas画布上渲染出来,实现预览(看了一下pdf.js的源码,先是用SVG生成图形,然后在canvas画布上展示出来)
那么怎么使用它呢?如下:
(方法都是通用的,借鉴了别人写的流程)
pdf.js的使用方式:

摘自(官网的例子)http://mozilla.github.io/pdf.js/examples/

1、页面引入pdf.js。

2、使用PDFJS.getDocument(‘helloworld.pdf’)方式加载要打开的PDF文件。

3、通过PDFJS.getDocument(‘helloworld.pdf’).then(function(pdf){// you can now use pdf here});then方式处理后续的方法

4、pdf.getPage(1).then(function(page){// you can now use page here});加载PDF的第一页

5、通过h5的canvas进行展示。

 // html 部分
 <div class="pdf">
    <div class="pdf-show" id="pdf-show">
    </div>
 </div>

// 展示pdf文件 vue中写的代码 js部分
this.showPdf(result.data.url, 'pdf-show');
pdfShow(url, id, type) {
      // 先定义一个放置阅览pdf文件的dom元素(页面上定义好的)
      let cvsItem = document.getElementById(id);
      cvsItem.innerHTML = "";
      
      const loading = this.$loading({
        lock: true,
        text: type || '加载中...',
        target: cvsItem,
        spinner: 'loader',
        background: 'rgba(0, 0, 0, 0.5)',
        customClass: 'loadings'
      });
      // url.replace("http:", 'https:') 这一步是因为后台返回的url是http开头的,但是用url去请求的时候要更换成https,这个是我做的项目的原因
      PDFJS.getDocument(url.replace("http:", 'https:')).then((pafObj) => {
        cvsItem.innerHTML = "";
        this.isloading = true,
        this.pafDoc = pafObj;
        let totalNum = this.pafDoc.numPages;
        loading.close();
        // debugger;
        for (let i = 1; i <= totalNum; i++) {
          let id = 'canvas' + i;
          let cvsNode = document.createElement('canvas');
          cvsNode.setAttribute('id', id);
          cvsNode.setAttribute('class', 'canvas-item');
          cvsWraper.appendChild(cvsNode);
          this.renderPage(i);
          if (totalNum === i) {
            this.isloading = false;
          }
        }
      }).catch(err => {
        this.$message({ message: "PDF加载失败", type: 'error' });
      })
    },
    renderPage(num) {
      // 进行渲染
      let id = 'canvas' + num;
      let canvas = document.getElementById(id);
      let ctx = canvas.getContext('2d'); // canvas的知识
      this.pageRendering = true;
      this.pafDoc.getPage(num).then(page => {
        let viewport = page.getViewport(this.scale);
        canvas.height = viewport.height; 
        canvas.width = viewport.width; 
        let renderContext = {
          canvasContext: ctx,
          viewport: viewport
        };
        page.render(renderContext);
      })
    }
  },
发布了130 篇原创文章 · 获赞 103 · 访问量 26万+

猜你喜欢

转载自blog.csdn.net/xiaolinlife/article/details/90264320