深度剖析pdfjs-dist

PDF.js是一種基於JavaScript的PDF渲染框架,它可以在現代瀏覽器中為每個頁面提供高質量的PDF文件閱讀體驗。pdfjs-dist是由PDF.js代碼庫構建的NPM Package,將PDF.js的核心渲染器封裝為一個可嵌入的,用於Node.js和瀏覽器的腳本文件。

一、基本用法

使用pdfjs-dist可以很方便地將PDF文件嵌入到Web應用中。以下是代碼示例:

  
    const pdfjsLib = require('pdfjs-dist');
    
    pdfjsLib.getDocument('example.pdf').promise.then((pdf) => {
        pdf.getPage(1).then((page) => {
            const scale = 1.5;
            const viewport = page.getViewport({ scale: scale });

            const canvas = document.getElementById('pdf-canvas');
            const context = canvas.getContext('2d');
            canvas.height = viewport.height;
            canvas.width = viewport.width;

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

上述代碼通過調用pdfjsLib對象中的getDocument方法獲取PDF文檔,然後在獲取的文檔中,使用getPage方法獲取指定頁面。獲取到頁面後,我們可以通過指定縮放比例並調用getViewport方法獲取頁面視口。獲取視口後,我們可以通過新建一個canvas元素來顯示頁面,最後,使用page.render方法渲染頁面內容到canvas上。

二、高級用法

1. 導出PDF為圖片

在某些場景中,我們需要將PDF文檔導出為圖片,以便於在其他平台或介質中展示。使用pdfjs-dist,我們可以輕鬆完成此操作。以下是代碼示例:

  
    const pdfjsLib = require('pdfjs-dist');
    const fs = require('fs');
    const path = require('path');

    pdfjsLib.getDocument('example.pdf').promise.then((pdf) => {
        const pageCount = pdf.numPages;
        const promises = [];
        for(let i = 1; i  {
                const scale = 1.5;
                const viewport = page.getViewport({ scale: scale });
                const canvas = document.createElement('canvas');
                const context = canvas.getContext('2d');
                canvas.height = viewport.height;
                canvas.width = viewport.width;
                const renderContext = {
                    canvasContext: context,
                    viewport: viewport
                };
                return page.render(renderContext).promise.then(() => {
                    const imageData = canvas.toDataURL('image/png');
                    return imageData;
                });
            });
            promises.push(promise);
        }
        Promise.all(promises).then((data) => {
            data.forEach((imageData, index) => {
                fs.writeFileSync(path.join(__dirname, `page-${index+1}.png`), imageData);
            });
        });
    });
  

上述代碼通過在PDF文檔中迭代獲取每個頁面並將其渲染為canvas元素,並將canvas元素轉換為base64編碼的圖像數據,使用fs模塊將圖像數據寫入文件系統中。通過此方法,我們可以將PDF文檔中的每個頁面導出為獨立的PNG圖像文件。

2. 搜索PDF

使用pdfjs-dist,我們還可以實現在PDF文檔中進行內容搜索的功能。以下是代碼示例:

  
    const pdfjsLib = require('pdfjs-dist');

    pdfjsLib.getDocument('example.pdf').promise.then((pdf) => {
        const pageCount = pdf.numPages;
        const promises = [];
        for(let i = 1; i  {
                return page.getTextContent().then((textContent) => {
                    const textItems = textContent.items;
                    const searchText = 'example';
                    const matches = [];

                    for (let j = 0; j  {
            const allMatches = [].concat(...data);
            console.log(allMatches);
        });
    });
  

上述代碼通過在PDF文檔中迭代獲取每個頁面並獲取其中的文本內容,使用正則表達式搜索文本內容,並將搜索結果構建為一個數組返回。

3. 合併多個PDF文檔

使用pdfjs-dist,我們還可以很容易地實現將多個PDF文檔合併為一個大的PDF文檔的功能。以下是代碼示例:

  
    const pdfjsLib = require('pdfjs-dist');
    const fs = require('fs');
    const path = require('path');

    const docUrlList = [
        'example1.pdf',
        'example2.pdf',
        'example3.pdf'
    ];

    const mergePdfs = (docUrlList) => {
        const promises = [];
        docUrlList.forEach((url) => {
            const promise = pdfjsLib.getDocument(url).promise;
            promises.push(promise);
        });
        Promise.all(promises).then((docs) => {
            const mergedPdf = docs[0];
            const pageCount = mergedPdf.numPages;
            for(let i = 1; i < docs.length; i++) {
                const doc = docs[i];
                for(let j = 1; j  {
                        doc.getPage(j).then((srcPage) => {
                            const viewport = srcPage.getViewport({ scale: 1 });
                            page.setWidth(viewport.width);
                            page.setHeight(viewport.height);

                            const context = page.getContext('2d');
                            const renderContext = {
                                canvasContext: context,
                                viewport: viewport
                            };
                            srcPage.render(renderContext).then(() => {
                                if(i === docs.length - 1 && j === doc.numPages) {
                                    mergedPdf.save().then(() => {
                                        console.log('Merge complete!');
                                    });
                                }
                            });
                        });
                    });
                }
            }
        });
    };

    mergePdfs(docUrlList);
  

上述代碼首先將所有PDF文檔獲取並存儲在docs數組中,在獲取第一個文檔作為基礎文檔。然後,迭代所有文檔並將每個頁面插入到基礎文檔中,最終將合併後的文檔保存為一個新的PDF文檔。

三、總結

pdfjs-dist是一種非常實用的PDF渲染器封裝,在實現PDF渲染和相關操作時,我們可以節省大量時間和精力。希望這篇文章可以對您了解並使用pdfjs-dist有所幫助。

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

(0)
打賞 微信掃一掃 微信掃一掃 支付寶掃一掃 支付寶掃一掃
PTRUD的頭像PTRUD
上一篇 2025-04-23 18:08
下一篇 2025-04-23 18:08

相關推薦

  • 深度查詢宴會的文化起源

    深度查詢宴會,是指通過對一種文化或主題的深度挖掘和探究,為參與者提供一次全方位的、深度體驗式的文化品嘗和交流活動。本文將從多個方面探討深度查詢宴會的文化起源。 一、宴會文化的起源 …

    編程 2025-04-29
  • Python下載深度解析

    Python作為一種強大的編程語言,在各種應用場景中都得到了廣泛的應用。Python的安裝和下載是使用Python的第一步,對這個過程的深入了解和掌握能夠為使用Python提供更加…

    編程 2025-04-28
  • Python遞歸深度用法介紹

    Python中的遞歸函數是一個函數調用自身的過程。在進行遞歸調用時,程序需要為每個函數調用開闢一定的內存空間,這就是遞歸深度的概念。本文將從多個方面對Python遞歸深度進行詳細闡…

    編程 2025-04-27
  • Spring Boot本地類和Jar包類載入順序深度剖析

    本文將從多個方面對Spring Boot本地類和Jar包類載入順序做詳細的闡述,並給出相應的代碼示例。 一、類載入機制概述 在介紹Spring Boot本地類和Jar包類載入順序之…

    編程 2025-04-27
  • 深度解析Unity InjectFix

    Unity InjectFix是一個非常強大的工具,可以用於在Unity中修復各種類型的程序中的問題。 一、安裝和使用Unity InjectFix 您可以通過Unity Asse…

    編程 2025-04-27
  • 深度剖析:cmd pip不是內部或外部命令

    一、問題背景 使用Python開發時,我們經常需要使用pip安裝第三方庫來實現項目需求。然而,在執行pip install命令時,有時會遇到「pip不是內部或外部命令」的錯誤提示,…

    編程 2025-04-25
  • 動手學深度學習 PyTorch

    一、基本介紹 深度學習是對人工神經網路的發展與應用。在人工神經網路中,神經元通過接受輸入來生成輸出。深度學習通常使用很多層神經元來構建模型,這樣可以處理更加複雜的問題。PyTorc…

    編程 2025-04-25
  • 深度解析Ant Design中Table組件的使用

    一、Antd表格兼容 Antd是一個基於React的UI框架,Table組件是其重要的組成部分之一。該組件可在各種瀏覽器和設備上進行良好的兼容。同時,它還提供了多個版本的Antd框…

    編程 2025-04-25
  • 深度解析MySQL查看當前時間的用法

    MySQL是目前最流行的關係型資料庫管理系統之一,其提供了多種方法用於查看當前時間。在本篇文章中,我們將從多個方面來介紹MySQL查看當前時間的用法。 一、當前時間的獲取方法 My…

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

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

    編程 2025-04-24

發表回復

登錄後才能評論