浅谈PDF.js使用心得


Posted in Javascript onJune 07, 2018

一次在开发微信预览保单的时候所使用到的,由于安卓手机浏览器不支持解析PDF,所以才用了PDF.js来解析PDF并展示。

pdf.js 是一个技术原型主要用于在 HTML5 平台上展示 PDF 文档,无需任何本地技术支持。

在线演示地址:http://mozilla.github.com/pdf.js/web/viewer.html

PDF.js可在官网下载  地址:http://mozilla.github.io/pdf.js/

解压后的目录结构是:

浅谈PDF.js使用心得

其中build目录是PDF.js的核心文件。

web目录是PDF.js的配置与显示文件。

浅谈PDF.js使用心得

viewer.html是负责显示PDF的,viewer.js是负责配置的文件。viewer.js中:

浅谈PDF.js使用心得

其中var DEFAULT_URL 是默认解析的PDF文件,可以对他进行替换。

pdf.js的使用方式(一):

对于简单只展示一张PDF文件的使用只需要将

默认路径配置好即可,但是很多情况这种方式不满足开发需求。

pdf.js的使用方式(二):

在地址栏后面传?file=test.pdf 即可完成对默认路径的修改

http://localhost:8080/pdfjs/web/viewer.html?file=test.pdf     //这种最好不要传输中文   具体我没用试过

这里的test.pdf 取与viewer.html的相对路径即可(整个服务器的绝对路径也行)

pdf.js的使用方式(三):

通过为window.localStorage.pdf赋值修改PDF的路径(经过测试最好写http协议的路径)

例如:

window.localStorage.pdf= 'http://localhost:8080/pdf/20140620/000000091534588.pdf';
window.location.href=basePath+"jsTool/openPDF/web/viewer.html";

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进行展示。

var scale = 1.5; 
var viewport = page.getViewport(scale); 
 
var canvas = document.getElementById('the-canvas'); 
var context = canvas.getContext('2d'); 
canvas.height = viewport.height; 
canvas.width = viewport.width; 
 
var renderContext = { 
 canvasContext: context, 
 viewport: viewport 
}; 
page.render(renderContext);

完整例子:

//引入pdf.js之后 
var url = '//cdn.mozilla.net/pdfjs/helloworld.pdf'; 
//加载核心文件 
PDFJS.workerSrc = '//mozilla.github.io/pdf.js/build/pdf.worker.js'; 
 
var loadingTask = PDFJS.getDocument(url); 
loadingTask.promise.then(function(pdf) { 
 console.log('PDF loaded'); 
  
 var pageNumber = 1; 
 pdf.getPage(pageNumber).then(function(page) { 
  console.log('Page loaded'); 
   
  var scale = 1.5; 
  var viewport = page.getViewport(scale); 
 
  var canvas = document.getElementById('the-canvas'); 
  var context = canvas.getContext('2d'); 
  canvas.height = viewport.height; 
  canvas.width = viewport.width; 
 
  var renderContext = { 
   canvasContext: context, 
   viewport: viewport 
  }; 
  var renderTask = page.render(renderContext); 
  renderTask.then(function () { 
   console.log('Page rendered'); 
  }); 
 }); 
}, function (reason) { 
 console.error(reason); 
});

通过点击进行一页一页的查看:

页面:

<script src="//mozilla.github.io/pdf.js/build/pdf.js"></script> 
 
<h1>PDF.js Previous/Next example</h1> 
 
<div> 
 <button id="prev">Previous</button> 
 <button id="next">Next</button> 
    
 <span>Page: <span id="page_num"></span> / <span id="page_count"></span></span> 
</div> 
 
<canvas id="the-canvas"></canvas>

js:

var url = '//cdn.mozilla.net/pdfjs/tracemonkey.pdf'; 
 
PDFJS.workerSrc = '//mozilla.github.io/pdf.js/build/pdf.worker.js'; 
 
var pdfDoc = null, 
  pageNum = 1, 
  pageRendering = false, 
  pageNumPending = null, 
  scale = 0.8, 
  canvas = document.getElementById('the-canvas'), 
  ctx = canvas.getContext('2d'); 
 
function renderPage(num) { 
 pageRendering = true; 
 pdfDoc.getPage(num).then(function(page) { 
  var viewport = page.getViewport(scale); 
  canvas.height = viewport.height; 
  canvas.width = viewport.width; 
 
  var renderContext = { 
   canvasContext: ctx, 
   viewport: viewport 
  }; 
  var renderTask = page.render(renderContext); 
 
  renderTask.promise.then(function() { 
   pageRendering = false; 
   if (pageNumPending !== null) { 
    // New page rendering is pending 
    renderPage(pageNumPending); 
    pageNumPending = null; 
   } 
  }); 
 }); 
 
 document.getElementById('page_num').textContent = pageNum; 
} 
 
function queueRenderPage(num) { 
 if (pageRendering) { 
  pageNumPending = num; 
 } else { 
  renderPage(num); 
 } 
} 
 
function onPrevPage() { 
 if (pageNum <= 1) { 
  return; 
 } 
 pageNum--; 
 queueRenderPage(pageNum); 
} 
document.getElementById('prev').addEventListener('click', onPrevPage); 
 
function onNextPage() { 
 if (pageNum >= pdfDoc.numPages) { 
  return; 
 } 
 pageNum++; 
 queueRenderPage(pageNum); 
} 
document.getElementById('next').addEventListener('click', onNextPage); 
 
PDFJS.getDocument(url).then(function(pdfDoc_) { 
 pdfDoc = pdfDoc_; 
 document.getElementById('page_count').textContent = pdfDoc.numPages; 
 
 renderPage(pageNum); 
});

对于该插件的功能很强大,有很多下载(下载手机端不可用)或者是跳转页面的功能,如果不想让客户查看的话可以去viewer.html中将相应的按钮隐藏或者删除即可

补充一点:viewer在解析和渲染pdf的时候有点耗费系统资源,尤其是cpu资源,不知道是不是因为我的本子配置较低的缘故,在页面加载等待的过程中,IE进程消耗掉了CPU资源的50-60%。点击翻页操作,或者改变IE的窗口大小会触发viewer对pdf进行重新解析和渲染。有时把IE前端的某个挡住他的程序窗口(比如一个txt)移开也会导致重新渲染,但是并不是每次都会触发,原因不详。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
jquery创建一个ajax关键词数据搜索实现思路
Feb 26 Javascript
Js 时间函数getYear()的使用问题探讨
Apr 01 Javascript
jQuery的ready方法详解
Nov 27 Javascript
JS数组的常见用法实例
Feb 10 Javascript
jQuery插件slides实现无缝轮播图特效
Apr 17 Javascript
用canvas 实现个图片三角化(LOW POLY)效果
Feb 18 Javascript
AngularJS基础 ng-readonly 指令简单示例
Aug 02 Javascript
AngularJS 单元测试(二)详解
Sep 21 Javascript
微信小程序 websocket 实现SpringMVC+Spring+Mybatis
Aug 04 Javascript
微信小程序实现图片上传功能实例(前端+PHP后端)
Jan 10 Javascript
JavaScript实现计算多边形质心的方法示例
Jan 31 Javascript
简单的三步vuex入门
May 20 Javascript
vue better scroll 无法滚动的解决方法
Jun 07 #Javascript
vue translate peoject实现在线翻译功能【新手必看】
Jun 07 #Javascript
JavaScript 正则命名分组【推荐】
Jun 07 #Javascript
详解create-react-app 自定义 eslint 配置
Jun 07 #Javascript
vue.js实现标签页切换效果
Jun 07 #Javascript
js数组去重的N种方法(小结)
Jun 07 #Javascript
vue+axios新手实践实现登陆的示例代码
Jun 06 #Javascript
You might like
PHP 高手之路(二)
2006/10/09 PHP
数据库查询记录php 多行多列显示
2009/08/15 PHP
Yii实现多按钮保存与提交的方法
2014/12/03 PHP
PHP配置把错误日志以邮件方式发送方法(Windows系统)
2015/06/23 PHP
在PHP站点的页面上添加Facebook评论插件的实例教程
2016/01/08 PHP
Docker搭建自己的PHP开发环境
2018/02/24 PHP
php empty 函数判断结果为空但实际值却为非空的原因解析
2018/05/28 PHP
jQuery示例收集
2010/11/05 Javascript
js页面跳转常用的几种方式
2010/11/25 Javascript
js弹出层(jQuery插件形式附带reLoad功能)
2013/04/12 Javascript
JS字符串处理实例代码
2013/08/05 Javascript
详谈jQuery中的this和$(this)
2014/11/13 Javascript
jquery+ajax实现跨域请求的方法
2015/01/20 Javascript
jQuery实现加入购物车飞入动画效果
2015/03/14 Javascript
JavaScript中的函数嵌套使用
2015/06/04 Javascript
jquery实现很酷的网页顶部图标下拉菜单效果
2015/08/22 Javascript
JS实现不规则TAB选项卡效果代码
2015/09/16 Javascript
jQuery打字效果实现方法(附demo源码下载)
2015/12/18 Javascript
前端自动化开发之Node.js的环境搭建教程
2017/04/01 Javascript
JS排序之选择排序详解
2017/04/08 Javascript
对象不支持indexOf属性或方法的解决方法(必看)
2017/05/28 Javascript
JS奇技之利用scroll来监听resize详解
2017/06/15 Javascript
浅谈angular4 ng-content 中隐藏的内容
2017/08/18 Javascript
微信小程序实现张图片合成为一张并下载
2019/07/16 Javascript
Vue  webpack 项目自动打包压缩成zip文件的方法
2019/07/24 Javascript
微信小程序实现点击导航标签滚动定位到对应位置
2020/11/19 Javascript
Python基于pygame实现的弹力球效果(附源码)
2015/11/11 Python
在python的类中动态添加属性与生成对象
2016/09/17 Python
python好玩的项目—色情图片识别代码分享
2017/11/07 Python
Python决策树和随机森林算法实例详解
2018/01/30 Python
python实现全排列代码(回溯、深度优先搜索)
2020/02/26 Python
很酷的小工具和电子产品商城:GearBest
2016/11/19 全球购物
负责人任命书范本
2014/06/04 职场文书
学校运动会广播稿
2014/10/11 职场文书
餐厅开业活动方案
2019/07/08 职场文书
MongoDB使用场景总结
2022/02/24 MongoDB