2016-11-16 4 views
1

Я новичок в ES6 и Promise. Я пытаюсь pdf.js извлекать тексты со всех страниц pdf-файла в массив строк. И когда выполняется извлечение, я хочу каким-то образом проанализировать массив. Скажем, PDF-файл (передается через typedarray правильно) имеет 4 страницы и мой код:как правильно извлечь текст из pdf с помощью pdf.js

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 раз. Я просто хочу позвонить parse только после того, как все 4-страничное извлечение сделано. Любые советы приветствуются. Прошу пролить свет на меня.

+0

Подобно http://stackoverflow.com/a/40494019/1765767 - собирайте обетования страницы с помощью Promise.all и не забудьте зацепить их. – async5

+0

@ async5 Это работает! Я сначала попробовал [this] (http://stackoverflow.com/a/28875245/6153990), и он работал с небольшими изменениями, но ответ, который вы предоставили, выглядит более корректно. Пожалуйста, ответьте на него как ответ, чтобы я мог его принять. Спасибо! –

ответ

2

Подобно https://stackoverflow.com/a/40494019/1765767 - собирать страницы обещания, используя Promise.all и не забудьте цепи, то это:

function gettext(pdfUrl){ 
 
var pdf = PDFJS.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); 
 
});
<script src="https://npmcdn.com/pdfjs-dist/build/pdf.js"></script>

Смежные вопросы