第23车厢-在网页中预览pdf—pdf.js简易版应用篇

本篇介绍JS插件pdf.js简易应用篇

今天介绍透过插件pdf.js在网页中直接浏览pdf
https://ithelp.ithome.com.tw/upload/images/20211008/20142016hPDINNtRe9.jpg
官网: https://mozilla.github.io/pdf.js/
官网范例:https://mozilla.github.io/pdf.js/examples/

起手式

介绍Dounload版的,因为CDN版的话官网有介绍
首先下载至电脑
https://ithelp.ithome.com.tw/upload/images/20211008/20142016un2hPYjESY.jpg

其他下载方式可看 https://mozilla.github.io/pdf.js/getting_started/

▼ 本地下载之後,资料匣名称为"pdfjs-2.10.377-dist.zip"
解压缩後 > 新增一专案资料夹 > 将下载包 放到Visual Studio Code执行

本篇分享两种
1.使用Pdf.js 的 viewer.js 可以直接有放大缩小列印等功能
2.使用Pdf.js 搭配官网范例js 将PDF文件渲染成Canvas

1.viewer.js

整体资料匣 + 要用的东西

https://ithelp.ithome.com.tw/upload/images/20211008/20142016cpKNEVKHtx.png

引入

  • "pdfjs-2.10.377-dist.zip" 我改命名为"pdfjs-dist" (不一定要改名字)
  <link rel="stylesheet"
        href="pdfjs-dist/web/viewer.css"> //pdf查看器样式
  <link rel="stylesheet"
        href="pdfjs-dist/web/locale/locale.properties"> //资源文件

  <script src="pdfjs-dist/build/pdf.js"></script> // 核心
  <script src="pdfjs-dist/web/viewer.js"></script> // viewer.html是pdf查看器

https://ithelp.ithome.com.tw/upload/images/20211008/20142016ClNSV18S2H.jpg

使用iframe嵌入在网页中

HTML
src="pdfjs-dist/web/viewer.html?file=/pdf/五倍券懒人包.pdf"
/pdf/五倍券懒人包.pdf 为我自己资料匣要抓的pdf档案路径
pdfjs-dist/web/viewer.html?file= 前面要加这段,pdfjs-dist/是我下载包的资料匣名称

<div style="width: 80%;margin: auto;">
    <iframe src="pdfjs-dist/web/viewer.html?file=/pdf/五倍券懒人包.pdf"
            width="100%"
            height="500px"
            frameborder="0"
            border="0"
            cellspacing="0"></iframe>
  </div>

这样就完成啦!
https://ithelp.ithome.com.tw/upload/images/20211008/20142016aVrHUVAytT.jpg

2.渲染成canvas

整体资料匣 + 要用的东西

https://ithelp.ithome.com.tw/upload/images/20211008/20142016DgJKfinsyi.png

引入

  <script src='https://cdnjs.cloudflare.com/ajax/libs/jquery/3.5.1/jquery.js'></script>
  <script src="pdfjs-dist/build/pdf.js"></script>
  <script src="runpdf.js"></script> // 为自行新增的js

HTML

  • 预先准备好容器canvas
<div>
  <button id="prev">上一页</button>
  <button id="next">下一页</button>
     
  <span>Page: <span id="page_num"></span> / <span id="page_count"></span></span>
</div>

<canvas id="the-canvas" ></canvas>

JS (我资料匣命名为runpdf.js)

  • var url = 'pdf/compressed.pdf'; //这边是要秀的pdf
  • pdfjsLib.GlobalWorkerOptions.workerSrc = 'pdfjs-dist/build/pdf.worker.js'; //这边抓资料匣命名的bulid底下的worker.js
  • scale 可以调整
// If absolute URL from the remote server is provided, configure the CORS
// header on that server.
var url = 'pdf/compressed.pdf'; //这边是要秀的pdf

$(function() {
// Loaded via <script> tag, create shortcut to access PDF.js exports.
var pdfjsLib = window['pdfjs-dist/build/pdf'];

// The workerSrc property shall be specified.
pdfjsLib.GlobalWorkerOptions.workerSrc = 'pdfjs-dist/build/pdf.worker.js'; //这边抓我资料匣命名的bulid底下的worker.js

var pdfDoc = null,
    pageNum = 1,
    pageRendering = false,
    pageNumPending = null,
    scale = 1 // 这边可以缩放
    canvas = document.getElementById('the-canvas'), // 抓html ID
    ctx = canvas.getContext('2d');

/**
 * Get page info from document, resize canvas accordingly, and render page.
 * @param num Page number.
 */
function renderPage(num) {
  pageRendering = true;
  // Using promise to fetch the page
  pdfDoc.getPage(num).then(function(page) {
    var viewport = page.getViewport({scale: 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() {
      pageRendering = false;
      if (pageNumPending !== null) {
        // New page rendering is pending
        renderPage(pageNumPending);
        pageNumPending = null;
      }
    });
  });

  // Update page counters
  document.getElementById('page_num').textContent = num;
}

/**
 * If another page rendering in progress, waits until the rendering is
 * finised. Otherwise, executes rendering immediately.
 */
function queueRenderPage(num) {
  if (pageRendering) {
    pageNumPending = num;
  } else {
    renderPage(num);
  }
}

/**
 * Displays previous page.
 */
function onPrevPage() {
  if (pageNum <= 1) {
    return;
  }
  pageNum--;
  queueRenderPage(pageNum);
}
document.getElementById('prev').addEventListener('click', onPrevPage);

/**
 * Displays next page.
 */
function onNextPage() {
  if (pageNum >= pdfDoc.numPages) {
    return;
  }
  pageNum++;
  queueRenderPage(pageNum);
}
document.getElementById('next').addEventListener('click', onNextPage);

/**
 * Asynchronously downloads PDF.
 */
pdfjsLib.getDocument(url).promise.then(function(pdfDoc_) {
  pdfDoc = pdfDoc_;
  document.getElementById('page_count').textContent = pdfDoc.numPages;

  // Initial/first page rendering
  renderPage(pageNum);
});
});

https://ithelp.ithome.com.tw/upload/images/20211008/20142016t1wDEbqprY.png
这样就完成啦! ▲ 此段js基本上是透过官网范例贴上

注意使用canvas产生的pdf会较模糊,目前网路上找了一下解法,我是还没找到一个完美的解答,如果你知道也请留言在下方,感谢

  • 如果大家只是要简易的用,目前我是透过调整scale的大小,就会比较清晰,如果你的canvas是随着萤幕缩放,就要按照比例调整,或者找更适合的解法

本篇参考文章:
https://codingnote.cc/zh-tw/p/18741/


<<:  RNN

>>:  Day23 React 共享的State(一) Context

C# Expression tree

运算式树 Expression tree Expression tree 是一个树状结构的物件, 这...

误用/滥用测试(Misuse/Abuse testing)

-HTTP请求(来源:Chua Hock-Chuan) 测试人员在HTTP请求中操纵URL的查询字...

[拯救上班族的 Chrome 扩充套件] 当朋友问我说,为什麽我的页面怎麽开都是猫咪,你有头绪吗? 我 __ __ 怎麽会知道。

经过昨天一键插入所有猫咪到每个页面後, 发现一打开新的页面又是崭新的开始, 那怎麽可以? 今天我们要...

开启Python IDLE

昨天我们下载完Python了,那我今天就来教大家怎麽使用吧! 首先我们可以在应用程序那边直接找P开头...

安全框架和成熟度模型(Security Frameworks and Maturity Models)

框架(Frameworks) -NIST网络安全框架 NIST网络安全框架(CSF) .认识到美国的...