React中使用pdfjs(一)

項目準備

搭建react項目

用create-react-app建立一個新的react項目react

npx create-react-app my-app

下載pdfjs

npm install pdfjs-dist --save

PDF加載

導入pdfjs庫

pdfjs-dist/webpack是已經對pdfjs打包過的文件,不使用可能出現的問題webpack

import pdfjsLib from 'pdfjs-dist/webpack';

加載PDF返回PDF對象

對PDF的獲取處理等所有都是異步操做git

const pdf = await pdfjsLib.getDocument('http://xxx/xxx.pdf')

獲取PDF每頁的對象

在回調中獲取PDF每頁的對象,並將其內容渲染到canvas中github

for (let _page = 1; _page <= pdf._pdfInfo.numPages; _page++) {  
    pdf.getPage(_page).then((page) => {  
        // page.getViewport 設置縮放倍率
        const viewport = page.getViewport({scale: 1})  
        const canvas = document.createElement('canvas')  
        const context = canvas.getContext('2d')  
        canvas.height = viewport.height  
        canvas.width = viewport.width  
        const renderContext = {  
            canvasContext: context,  
            viewport: viewport,  
            enableWebGL: true,  
        }  
        // page.render將內容渲染到canvas中,
        // page.render也會返回一個對象,對象有更詳細渲染信息,其中包括渲染好的canvas對象,但這個canvas並非上文聲明的,不可控
        // const _canvas = page.render(renderContext)  
        page.render(renderContext)  
        this.pageRenderRef.current.appendChild(canvas)  
    });  
}

完整代碼

import React, {Component} from "react";  
import pdfjsLib from 'pdfjs-dist/webpack';  

export default class PDFViewer extends Component {  
    constructor(props) {  
        super(props)  
        this.pageRenders = []   // 存放每頁pdf造成的canvas
        this.pageRenderRef = React.createRef()  /渲染pdf的容器
    }
    
    componentDidMount() {  
        this.init()  
    }
    
    init = async () => {  
        console.time('pdf加載時間')  
        const pdf = await pdfjsLib.getDocument('http://xxx/xxx.pdf')  
        console.timeEnd('pdf加載時間')  
        const {_pdfInfo: {numPages}} = pdf  
  
        for (let _page = 1; _page <= numPages; _page++) {  
            pdf.getPage(_page).then((page) => {  
                const viewport = page.getViewport({scale: 1})  
                const canvas = document.createElement('canvas')  
                const context = canvas.getContext('2d')  
                canvas.height = viewport.height  
                canvas.width = viewport.width  
                const renderContext = {  
                    canvasContext: context,  
                    viewport: viewport,  
                    enableWebGL: true,  
                }  
                page.render(renderContext)  
                this.pageRenderRef.current.appendChild(canvas)  
            });  
        }  
    }
    
    render() {  
        return (  
            <div ref={this.pageRenderRef}>  
            {  
                    this.pageRenders.length > 0 && this.pageRenders  
            }  
            </div>  
        )  
    }  
}

直接導入pdfjs出現的問題

  • 不容易找到pdf.worker.js
    pdf.worker.js是pdfjs解析庫,使用時須要在pdfjs對象上指定屬性workerSrc=pdf.worker.js
  • 內存使用太高
    即便在module找到了,也還可能報high memory的錯誤
    錯誤緣由issue上已經提到了
相關文章
相關標籤/搜索