2016-11-16 148 views
1

我是ES6和Promise的新手。我正在嘗試使用pdf.js將PDF文件的所有頁面中的文本提取到字符串數組中。當提取完成後,我想以某種方式解析數組。說PDF文件(通過typedarray正確傳遞)有4頁,我的代碼是:如何使用pdf.js正確提取PDF文本

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。任何建議是受歡迎的。請闡明我。

+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>