首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使用pdf.js从pdf中正确提取文本

如何使用pdf.js从pdf中正确提取文本
EN

Stack Overflow用户
提问于 2016-11-16 23:29:59
回答 6查看 28.9K关注 0票数 16

我是ES6和Promise的新手。我尝试使用pdf.js将pdf文件中所有页面的文本提取到字符串数组中。当提取完成后,我想以某种方式解析数组。假设pdf文件(通过typedarray正确传递)有4页面,我的代码是:

代码语言:javascript
复制
let str = [];
PDFJS.getDocument(typedarray).then(function(pdf) {
  for(let i = 1; i <= pdf.numPages; i++) {
    pdf.getPage(i).then(function(page) {
      page.getTextContent().then(function(textContent) {
        for(let j = 0; j < textContent.items.length; j++) {
          str.push(textContent.items[j].str);
        }
        parse(str);
      });
    });
  }
});

它成功地工作了,但是,当然,问题是我的parse函数被称为4次。我只想在所有4页提取完成后调用parse

EN

回答 6

Stack Overflow用户

回答已采纳

发布于 2016-11-18 02:06:30

https://stackoverflow.com/a/40494019/1765767类似--使用Promise.all收集页面承诺,不要忘记链接然后的:

代码语言:javascript
复制
function gettext(pdfUrl){
  var pdf = pdfjsLib.getDocument(pdfUrl);
  return pdf.then(function(pdf) { // get all pages text
    var maxPages = pdf.pdfInfo.numPages;
    var countPromises = []; // collecting all page promises
    for (var j = 1; j <= maxPages; j++) {
      var page = pdf.getPage(j);

      var txt = "";
      countPromises.push(page.then(function(page) { // add page promise
        var textContent = page.getTextContent();
        return textContent.then(function(text){ // return content promise
          return text.items.map(function (s) { return s.str; }).join(''); // value page text 
        });
      }));
    }
    // Wait for all pages and join text
    return Promise.all(countPromises).then(function (texts) {
      return texts.join('');
    });
  });
}

// waiting on gettext to finish completion, or error
gettext("https://cdn.mozilla.net/pdfjs/tracemonkey.pdf").then(function (text) {
  alert('parse ' + text);
}, 
function (reason) {
  console.error(reason);
});
代码语言:javascript
复制
<script src="https://npmcdn.com/pdfjs-dist/build/pdf.js"></script>

票数 23
EN

Stack Overflow用户

发布于 2019-03-20 22:49:14

更干净的@async5版本,并根据最新版本的"pdfjs-dist": "^2.0.943"进行了更新

代码语言:javascript
复制
import PDFJS from "pdfjs-dist";
import PDFJSWorker from "pdfjs-dist/build/pdf.worker.js"; // add this to fit 2.3.0

PDFJS.disableTextLayer = true;
PDFJS.disableWorker = true; // not availaible anymore since 2.3.0 (see imports)

const getPageText = async (pdf: Pdf, pageNo: number) => {
  const page = await pdf.getPage(pageNo);
  const tokenizedText = await page.getTextContent();
  const pageText = tokenizedText.items.map(token => token.str).join("");
  return pageText;
};

/* see example of a PDFSource below */
export const getPDFText = async (source: PDFSource): Promise<string> => {
  Object.assign(window, {pdfjsWorker: PDFJSWorker}); // added to fit 2.3.0
  const pdf: Pdf = await PDFJS.getDocument(source).promise;
  const maxPages = pdf.numPages;
  const pageTextPromises = [];
  for (let pageNo = 1; pageNo <= maxPages; pageNo += 1) {
    pageTextPromises.push(getPageText(pdf, pageNo));
  }
  const pageTexts = await Promise.all(pageTextPromises);
  return pageTexts.join(" ");
};

这是我使用过的对应的typescript声明文件,如果有人需要它的话。

代码语言:javascript
复制
declare module "pdfjs-dist";

type TokenText = {
  str: string;
};

type PageText = {
  items: TokenText[];
};

type PdfPage = {
  getTextContent: () => Promise<PageText>;
};

type Pdf = {
  numPages: number;
  getPage: (pageNo: number) => Promise<PdfPage>;
};

type PDFSource = Buffer | string;

declare module 'pdfjs-dist/build/pdf.worker.js'; // needed in 2.3.0

如何从带缓冲区的文件(从节点类型)获取PDFSource的示例:

代码语言:javascript
复制
file.arrayBuffer().then((ab: ArrayBuffer) => {
  const pdfSource: PDFSource = Buffer.from(ab);
});
票数 18
EN

Stack Overflow用户

发布于 2020-01-27 19:09:31

下面是一个更短(不一定更好)的版本:

代码语言:javascript
复制
async function getPdfText(data) {
    let doc = await pdfjsLib.getDocument({data}).promise;
    let pageTexts = Array.from({length: doc.numPages}, async (v,i) => {
        return (await (await doc.getPage(i+1)).getTextContent()).items.map(token => token.str).join('');
    });
    return (await Promise.all(pageTexts)).join('');
}

在这里,data是一个字符串或缓冲区(或者您可以将其更改为获取url,等等)。

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/40635979

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档