如何在 React 中引用 pdf.js 库?

xto*_*awn 10 javascript reactjs pdfjs

我正在尝试将PDF.js(由 Mozilla 提供)引用到我的 React 项目中。但是,它抛出“意外标识符”错误。

我已将 PDF.js 放在公共文件夹中并在我的 index.html 中引用它。

文件结构:

public
  - index.html
  - pdftojs
    - parsejs.js // < parseFile method in this file will be called
    - pdf-parse.js
    - misc..
src
  - pdftotext
    - parsepdf.js // < page to parse PDF

Run Code Online (Sandbox Code Playgroud)

pdf-parse.js

var PDFJS = null
function render_page(pageData) { ... } // Untouched
async function PDF(...) { ... } // Untouched

exports.pdf = PDF; // Changed this line
Run Code Online (Sandbox Code Playgroud)

来自原始库的 parsejs.js:

8    import pdf from 'pdf-parse.js';
9    const pdfjsLib = require('pdfjs-dist'); // 'require' is undefined too so I don't know what is the correct way
10    
11   function parseFile(file) {

... 
45   }
Run Code Online (Sandbox Code Playgroud)

这个文件抛出 Unexpected identifier on Line 8

解析 PDF 页面 (parsepdf.js)

  process(file) {
     parseFile(file); // calling method in parsejs.js
     ...
  }
Run Code Online (Sandbox Code Playgroud)

这使 'parseFile' is not defined

小智 8

此导入将清除未定义的问题:

import * as pdfjsLib from "pdfjs-dist/build/pdf";
Run Code Online (Sandbox Code Playgroud)


Arn*_*tor 5

我今天花了太多时间,把这个问题的其他答案的片段拼凑起来。所以这是一个完整的答案。

首先安装pdfjs-dist:

npm install pdfjs-dist
Run Code Online (Sandbox Code Playgroud)

以下是如何在实际查看器组件中使用它:

import React, { useEffect, useState, useRef, useCallback } from 'react';
import pdfjsLib from "pdfjs-dist/build/pdf";
import pdfjsWorker from "pdfjs-dist/build/pdf.worker.entry";

export default function PdfViewer({url}){
  const canvasRef = useRef();
  pdfjsLib.GlobalWorkerOptions.workerSrc = pdfjsWorker;

  const [pdfRef, setPdfRef] = useState();
  const [currentPage, setCurrentPage] = useState(1);

  const renderPage = useCallback((pageNum, pdf=pdfRef) => {
    pdf && pdf.getPage(pageNum).then(function(page) {
      const viewport = page.getViewport({scale: 1.5});
      const canvas = canvasRef.current;
      canvas.height = viewport.height;
      canvas.width = viewport.width;
      const renderContext = {
        canvasContext: canvas.getContext('2d'),
        viewport: viewport
      };
      page.render(renderContext);
    });   
  }, [pdfRef]);

  useEffect(() => {
    renderPage(currentPage, pdfRef);
  }, [pdfRef, currentPage, renderPage]);

  useEffect(() => {
    const loadingTask = pdfjsLib.getDocument(url);
    loadingTask.promise.then(loadedPdf => {
      setPdfRef(loadedPdf);
    }, function (reason) {
      console.error(reason);
    });
  }, [url]);

  const nextPage = () => pdfRef && currentPage < pdfRef.numPages && setCurrentPage(currentPage + 1);

  const prevPage = () => currentPage > 1 && setCurrentPage(currentPage - 1);

  return <canvas ref={canvasRef}></canvas>;
}
Run Code Online (Sandbox Code Playgroud)

  • 有没有什么解决方案可以渲染为 SVG 而不是画布? (3认同)
  • @DaveMunger如果遇到“未定义”问题,请尝试将导入语句更改为“import * as pdfjsLib from 'pdfjs-dist/webpack';” (2认同)

bow*_*ice 1

通过从 webpack 安装 Pdf.js 查看这些示例。

pdf.js

然后,这就是您引用信息并将其引入您自己的项目中的方式。

    import pdfjsLib from 'pdfjs-dist/webpack';
Run Code Online (Sandbox Code Playgroud)

  • 我发现他们的例子令人困惑。他们需要 gulp 才能使用 webpack...?很奇怪。 (3认同)