web-dev-qa-db-ja.com

PDF.jsを使用してPDFからテキストを正しく抽出する方法

ES6とPromiseは初めてです。私はpdf.jsを試して、pdfファイルのすべてのページから文字列配列にテキストを抽出しています。そして、抽出が完了したら、どういうわけか配列を解析したいと思います。 PDFファイル(typedarrayを介して正しく渡された)に4ページがあり、私のコードは次のとおりです。

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を呼び出したいだけです。

8
Sangbok Lee

以下は、より短い(必ずしも良いとは限りません)バージョンです。

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を取得するように変更することもできます)。

0
voracity