深入淺出pdfjs-dist

pdfjs-dist是一個基於HTML5技術的PDF閱讀器,對於需要Web端渲染PDF文檔和PDF交互的開發人員來說其非常實用。本文將從多個方面深入淺出介紹pdfjs-dist庫,包括其基本用法、載入PDF文檔、渲染PDF文檔、處理用戶交互等方面。

一、基本用法

在使用pdfjs-dist之前,我們需要先引入所需的JS文件,這包括pdf.js和pdf.worker.js文件。pdf.js是PDFJS庫的主要代碼文件,而pdf.worker.js是PDFJS庫的工作線程代碼文件。

<script src="path/to/pdf.js"></script>
<script src="path/to/pdf.worker.js"></script>

接著,我們需要從指定的URL載入PDF文檔。PDFJS提供了一個簡單的API來做到這一點:

PDFJS.getDocument('path/to/pdf/file.pdf').then(function(pdf) {
  // ...
});

這裡,我們使用getDocument()方法來獲取PDF文檔對象。當該Promise對象被解決時,我們就可以訪問PDF文檔的各種屬性和方法,例如獲取PDF文檔總頁數。下面是一個獲取PDF文檔頁面數的簡單示例:

PDFJS.getDocument('path/to/pdf/file.pdf').then(function(pdf) {
  var numPages = pdf.numPages;
  console.log(numPages);
});

二、載入PDF文檔

PDFJS提供了非常方便的API來載入PDF文檔,但是要注意以下幾點:

  • 要載入的PDF文檔必須先存在於伺服器上。
  • 如果PDF文檔受到密碼保護,那麼我們需要先提供密碼才能載入PDF文檔。
  • PDFJS需要與載入PDF文檔相同的域名進行交互,否則會出現安全限制。

當我們需要載入PDF文檔時,PDFJS提供了兩種不同的方式:使用URL和使用 ArrayBuffer 對象。

如果我們使用URL方式載入PDF文檔,我們只需要提供一個指向PDF文檔的URL即可:

PDFJS.getDocument('path/to/pdf/file.pdf')
  .then(function(pdf) {
    // ...
  });

當使用ArrayBuffer方式載入PDF文檔時,我們需要手動引入PDFWorker:

import { PDFWorker } from 'pdfjs-dist';
const worker = new PDFWorker();
worker.loadDocument(arrayBuffer).then((pdf) => {
  // ...
});

需要注意的是,使用ArrayBuffer方式載入PDF文檔,在創建PDFWorker實例之前,我們需要在腳本中創建Blob URL,這通常可以通過FileReader實現。這個方法可能會造成一定的兼容性問題,需要根據具體情況進行處理。

三、渲染PDF文檔

PDFJS可以很容易地在HTML5畫布(canvas)上渲染PDF文檔,這要通過PDFDocument對象的getPage()方法與CanvasRenderingContext2D對象的drawImage()方法結合來完成。下面是一個簡單的例子:

PDFJS.getDocument('path/to/pdf/file.pdf')
  .then(function(pdf) {
    pdf.getPage(1).then(function(page) {
      var canvas = document.getElementById('pdf-canvas');
      var context = canvas.getContext('2d');

      var viewport = page.getViewport(1.0);
      canvas.width = viewport.width;
      canvas.height = viewport.height;

      page.render({
        canvasContext: context,
        viewport: viewport
      });
    });
  });

上述代碼中,我們使用getPage()方法獲取PDF文檔的第一頁,使用getViewport()方法獲取PDF頁面的視口對象,然後使用CanvasRenderingContext2D對象的drawImage()方法將PDF頁面渲染到指定的畫布上。

四、處理用戶交互

除了可以渲染PDF文檔,PDFJS還提供了一些API來處理用戶交互事件,例如頁面切換、縮放、旋轉和注釋等。下面是一些常用的交互操作示例:

1、綁定頁面切換事件,當用戶翻頁時觸發:

pdf.getPage(pageNumber).then(function(page) {
  // Get the viewport object.
  var viewport = page.getViewport(scale);

  // Render the page into a canvas element.
  var canvas = document.getElementById('pdf-canvas');
  var context = canvas.getContext('2d');

  page.render({
    canvasContext: context,
    viewport: viewport
  });

  // Bind the "pagerendered" event.
  var pageNumber = 1;
  page.getRendering().then(function(renderTask) {
    renderTask.promise.then(function() {
      console.log('Page rendered!');
      var nextPage = pageNumber + 1;
      if (nextPage <= pdf.numPages) {
        pdf.getPage(nextPage).then(function(nextPage) {
          pageNumber = nextPage.number;
          // ...
        });
      }
    });
  });
});

2、綁定PDF文檔縮放事件,當用戶放大或縮小時觸發:

var DEFAULT_SCALE = 1.0;

var pdfDoc = null,
    pageNum = 1,
    pageRendering = false,
    pageNumPending = null,
    scale = DEFAULT_SCALE;

PDFJS.getDocument(url).then(function (doc) {
  pdfDoc = doc;
  renderPage(pageNum);
});

function renderPage(num) {
  pageRendering = true;
  pdfDoc.getPage(num).then(function(page) {
    var viewport = page.getViewport(scale);
    var canvas = document.getElementById('the-canvas');
    var ctx = canvas.getContext('2d');
    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) {
        renderPage(pageNumPending);
        pageNumPending = null;
      }
    });
  });
}

function zoomIn() {
  var newScale = scale + 0.1;
  if (newScale = 0.2) {
    scale = newScale;
    renderPage(pageNum);
  }
}

document.getElementById('zoom-in').addEventListener('click', zoomIn);
document.getElementById('zoom-out').addEventListener('click', zoomOut);

以上代碼,為用戶提供縮放控制按鈕,並使用了EVENT監聽來調整PDF的放大比例。

五、總結

本文介紹了PDFJS的基本用法、載入PDF文檔、渲染PDF文檔和處理用戶交互等方面,這些操作都可以以非常優雅的方式實現在Web頁面的中。PDFJS的編寫過程中,我們要注意JS實例化和文檔載入的步驟,也要提防安全限制。

原創文章,作者:FYDA,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/143423.html

(0)
打賞 微信掃一掃 微信掃一掃 支付寶掃一掃 支付寶掃一掃
FYDA的頭像FYDA
上一篇 2024-10-19 16:43
下一篇 2024-10-19 16:43

相關推薦

  • 深入淺出統計學

    統計學是一門關於收集、分析、解釋和呈現數據的學科。它在各行各業都有廣泛應用,包括社會科學、醫學、自然科學、商業、經濟學、政治學等等。深入淺出統計學是指想要學習統計學的人能夠理解統計…

    編程 2025-04-25
  • 深入淺出torch.autograd

    一、介紹autograd torch.autograd 模塊是 PyTorch 中的自動微分引擎。它支持任意數量的計算圖,可以自動執行前向傳遞、後向傳遞和計算梯度,同時提供很多有用…

    編程 2025-04-24
  • Vue3-pdfjs: 基於Vue 3的PDF庫

    一、介紹 Vue3-pdfjs是一個用於在Vue3項目中顯示和操作PDF文件的庫。它基於pdfjs-dist庫,為Vue3提供了一個PDF渲染組件,並且提供了一系列API來方便地操…

    編程 2025-04-24
  • 深入淺出SQL佔位符

    一、什麼是SQL佔位符 SQL佔位符是一種佔用SQL語句中某些值的標記或佔位符。當執行SQL時,將使用該標記替換為實際的值,並將這些值傳遞給查詢。SQL佔位符使查詢更加安全,防止S…

    編程 2025-04-24
  • 深入淺出:理解nginx unknown directive

    一、概述 nginx是目前使用非常廣泛的Web伺服器之一,它可以運行在Linux、Windows等不同的操作系統平台上,支持高並發、高擴展性等特性。然而,在使用nginx時,有時候…

    編程 2025-04-24
  • 深入淺出ThinkPHP框架

    一、簡介 ThinkPHP是一款開源的PHP框架,它遵循Apache2開源協議發布。ThinkPHP具有快速的開發速度、簡便的使用方式、良好的擴展性和豐富的功能特性。它的核心思想是…

    編程 2025-04-24
  • 深入淺出arthas火焰圖

    arthas是一個非常方便的Java診斷工具,包括很多功能,例如JVM診斷、應用診斷、Spring應用診斷等。arthas使診斷問題變得更加容易和準確,因此被廣泛地使用。artha…

    編程 2025-04-24
  • 深入淺出AWK -v參數

    一、功能介紹 AWK是一種強大的文本處理工具,它可以用於數據分析、報告生成、日誌分析等多個領域。其中,-v參數是AWK中一個非常有用的參數,它用於定義一個變數並賦值。下面讓我們詳細…

    編程 2025-04-24
  • 深入淺出Markdown文字顏色

    一、Markdown文字顏色的背景 Markdown是一種輕量級標記語言,由於其簡單易學、易讀易寫,被廣泛應用於博客、文檔、代碼注釋等場景。Markdown支持使用HTML標籤,因…

    編程 2025-04-23
  • 深入淺出runafter——非同步任務調度器的實現

    一、runafter是什麼? runafter是一個基於JavaScript實現的非同步任務調度器,可以幫助開發人員高效地管理非同步任務。利用runafter,開發人員可以輕鬆地定義和…

    編程 2025-04-23

發表回復

登錄後才能評論