现流行的浏览器都有内置插件可以打开PDF文件,很方便,但缺点是对程序员来说,不可操纵。所以给大家推荐一个开源插件——PDF.js(基于html5,纯JS实现)
官网里有Github项目源码和DEMO http://mozilla.github.io/pdf.js/
这个插件可以绘制两部分内容——canvas 和 文本层(由一堆div组成,div内部包含pdf内的文本,这些文本是透明的,覆盖到canvas上边,还可被选中,基于这一点,可以做pdf文内搜索功能,官方的demo已经实现)
官方的DEMO比较复杂,当然可以直接使用iframe,以下代码直接粘到html文件中,用浏览器打开即可查看效果。
<!DOCTYPE html> <html lang="en-GB"> <head> <meta http-equiv="Content-Type" content="application/x-javascript; charset=utf-8"/> <style> iframe{ width:800px; height:600px; }; </style> </head> <body> <iframe src="http://mozilla.github.io/pdf.js/web/viewer.html?file=http://mozilla.github.io/pdf.js/web/compressed.tracemonkey-pldi-09.pdf" > </iframe> </body>
如果觉得这种方式可取,直接从Github下载release版本 https://github.com/mozilla/pdf.js/releases,更方便修改和使用
如果想做的轻巧一点,则只需要pdf.js和pdf.worker.js两个文件。具体用法很简单,PDF.js这个插件高度依赖promise,不了解的请移步
https://www.cnblogs.com/lvdabao/p/es6-promise-1.html
这个例子有一个缩放功能,同样,以下代码粘到html文件中可直接运行
<!DOCTYPE html> <html lang="en-GB"> <head> <meta http-equiv="Content-Type" content="application/x-javascript; charset=utf-8"/> <script src="http://libs.baidu.com/jquery/1.5.2/jquery.min.js"></script> <!-- 这是PDF.js的核心插件,以下可以通过一下URL直接下载 --> <script src="http://mozilla.github.io/pdf.js/build/pdf.js"></script> <script src="http://mozilla.github.io/pdf.js/build/pdf.worker.js"></script> <style> </style> <script> //PDF.js插件定义的对象,给定pdf文件的URL或者一个Uint8Array数组,调用PDFJS.getDocument()可以获取 var pdfDoc = null; //缩放比例 var scale = 1.5; //pdf文件的总页数 var count = 1; $(document).ready(function() { var url = "http://mozilla.github.io/pdf.js/web/compressed.tracemonkey-pldi-09.pdf"; PDFJS.getDocument(url).then(function(pdfDoc_) { pdfDoc = pdfDoc_; count = pdfDoc.numPages; //绘制所有的页面 renderAll(); }); }); function renderAll(){ for(var curPage=1;curPage<=count;curPage++){ //新建一个<canvas>用于,并将对应页面的内容绘制到这个canvas上 var canvas = document.createElement("canvas"); var div = document.createElement("div"); $(div).attr("id","page"+curPage); $(div).attr("class","page"); $(div).append(canvas); $("#pdfContainer").append(div); renderPage(curPage,canvas); } } function renderPage(num,canvas) { // Using promise to fetch the page pdfDoc.getPage(num).then(function(page) { var ctx = canvas.getContext('2d'); var viewport = page.getViewport(scale); canvas.height = viewport.height; canvas.width = viewport.width; // Render PDF page into canvas context var renderContext = { canvasContext : ctx, viewport : viewport }; var renderTask = page.render(renderContext); // Wait for rendering to finish renderTask.promise.then(function() { //这是每次绘制一页内容之后的回调函数 console.log("Page"+num+" rendered"); }); }); } function zoomOut(){ scale+=0.4; $("#pdfContainer").empty(); renderAll(); } function zoomIn(){ scale-=0.4; $("#pdfContainer").empty(); renderAll(); } </script> <title>PDFJS_DEMO</title> </head> <body> <div> <button onclick="zoomOut()">放大</button> <button onclick="zoomIn()">缩小</button> </div> <div id="pdfContainer"></div> </body> </html>
这个例子的缺点就是,没有文本层。网上看过一些例子,因为这个插件的版本太多,用法也发生了变化,最终没有做出来。有兴趣的可以参考
http://vivin.net/2013/06/06/rendering-a-pdf-with-text-selection-using-pdf-js/
https://www.sitepoint.com/custom-pdf-rendering/?utm_source=javascriptweekly&utm_medium=email
浙公网安备 33010602011771号