如何在React.js中提取PDF的内容?

How to extract content of PDF in React.js?

提问人:TopTen1310 提问时间:5/16/2023 更新时间:10/26/2023 访问量:5798

问:

我正在尝试加载本地存储的PDF文件,然后在没有任何后端的情况下在React.js中提取内容。

我试图从谷歌找到类似的模块,但还没有找到合适的模块。 有许多用于解析 PDF 的节点模块,我可以在后端提取 PDF 的内容,但我不确定我们是否可以在 Web 浏览器中使用它。

reactjs pdf-解析

评论

0赞 JASBIR SINGH 5/16/2023
stackoverflow.com/questions/49763744/......
0赞 TopTen1310 5/16/2023
谢谢JASBIR,但我需要在React.js中加载本地驱动程序的PDF。在这种情况下,我可以使用输入 DOM 获取 PDF。然后我不知道下一步该怎么做。

答:

1赞 Prayas Jain 5/16/2023 #1

要在 React.js 应用程序中提取 PDF 的内容,您可以使用该库,它提供了处理 PDF 文件的功能。下面是如何实现此目的的示例:pdfjs-dist

  1. 安装所需的软件包: 首先使用 npm 或 yarn 安装包:pdfjs-dist

    npm install pdfjs-dist
    
  2. 在组件中导入所需的模块:

    import { Document, Page } from 'react-pdf/dist/esm/entry.webpack';
    import pdfjs from 'pdfjs-dist';
    
  3. 配置 PDF.js 库: 在加载 PDF 文件之前,您需要通过设置工作文件的正确路径来配置库。您可以在将要处理 PDF 文件的组件中执行此操作:pdfjs

    pdfjs.GlobalWorkerOptions.workerSrc = `//cdnjs.cloudflare.com/ajax/libs/pdf.js/${pdfjs.version}/pdf.worker.js`;
    
  4. 从 PDF 中加载和提取内容: 在组件中,您可以加载 PDF 文件并提取其内容。下面是一个使用函数组件和钩子的示例:

    import React, { useState } from 'react';
    
    const PdfExtractor = () => {
      const [numPages, setNumPages] = useState(null);
      const [pdfText, setPdfText] = useState('');
    
      const onDocumentLoadSuccess = ({ numPages }) => {
        setNumPages(numPages);
    
        // Extract text from each page
        const textPromises = [];
        for (let i = 1; i <= numPages; i++) {
          textPromises.push(
            pdfjs.getDocument({ url: 'path/to/pdf/file.pdf' })
              .then((pdf) => pdf.getPage(i))
              .then((page) => page.getTextContent())
              .then((textContent) => {
                const pageText = textContent.items.map((item) => item.str).join(' ');
                return pageText;
              })
          );
        }
    
        Promise.all(textPromises)
          .then((pageTexts) => {
            const extractedText = pageTexts.join(' ');
            setPdfText(extractedText);
          })
          .catch((error) => console.error('Failed to extract PDF text:', error));
      };
    
      return (
        <div>
          <Document
            file="path/to/pdf/file.pdf"
            onLoadSuccess={onDocumentLoadSuccess}
          >
            {Array.from(new Array(numPages), (el, index) => (
              <Page key={`page_${index + 1}`} pageNumber={index + 1} />
            ))}
          </Document>
          <div>{pdfText}</div>
        </div>
      );
    };
    
    export default PdfExtractor;
    

    在上面的示例中,替换为 PDF 文件的实际路径或 URL。'path/to/pdf/file.pdf'

    当 PDF 成功加载时,将调用该函数。它从 PDF 的每一页中提取文本内容并将它们连接在一起。onDocumentLoadSuccess

    提取的文本存储在状态变量中,该变量可以在组件内呈现或根据需要使用。pdfText

    组件 from 用于呈现 PDF 页面,该组件表示每个单独的页面。Documentreact-pdfPage

通过执行这些步骤,您可以使用库在 React.js 应用程序中提取 PDF 的内容。pdfjs-dist

更新:

要允许使用该组件选择文件,您可以执行以下操作:<input>

import { useState } from 'react';
import { PDFDocument } from 'pdfjs-dist';

function YourComponent() {
  const [pdfContent, setPdfContent] = useState('');

  const handleFileChange = async (event) => {
    const file = event.target.files[0];
    const reader = new FileReader();

    reader.onload = async (e) => {
      const contents = e.target.result;
      const pdf = await PDFDocument.load(contents);
      const pages = pdf.getPages();
      let extractedText = '';

      for (const page of pages) {
        const textContent = await page.getTextContent();
        const pageText = textContent.items.map((item) => item.str).join(' ');
        extractedText += pageText;
      }

      setPdfContent(extractedText);
    };

    reader.readAsArrayBuffer(file);
  };

  return (
    <div>
      <input type="file" onChange={handleFileChange} />
      <div>{pdfContent}</div>
    </div>
  );
}

export default YourComponent;

评论

0赞 TopTen1310 5/16/2023
嗨,普拉亚斯。谢谢你的回答。但是你提到了'path/to/pdf/file.pdf',这意味着pdf文件应该位于公共文件夹中,对吧?我想使用输入 DOM 加载 PDF。 (<input type=file .... />
0赞 Prayas Jain 5/16/2023
嗨,@SmartGuru,我更新了答案。希望对你有所帮助。
3赞 PGT 6/14/2023
@PrayasJain我正在尝试您的代码,从版本 3.7.107 开始,似乎没有导出的代码pdf-distPDFDocument
1赞 tchrist 7/11/2023
这个答案看起来像是由人工智能(如 ChatGPT)生成的,而不是由真人生成的。您应该知道,在 Stack Overflow 上发布 AI 生成的输出是正式禁止。如果这个答案确实是由人工智能生成的,那么我强烈建议你在给自己带来更大的麻烦之前删除它:我们在这里认真对待抄袭。请阅读:为什么目前不允许发布 GPT 和 ChatGPT 生成的答案
0赞 Oluwafemi Akinyemi 10/26/2023
@PrayasJain 你能检查一下我在下面遇到的错误并就此向我提出建议吗?