2017-09-05 55 views
0

我试图从PDF中提取文本,然后返回一个数字,表示有多少页的pdf由我定义的正则表达式匹配。然后不按预期工作在JS承诺

我的问题是,与其定期检查单个页面的文本是否为匹配的一部分,我的功能将这些部分分成比页面小的部分。计数只能在整个页面被读取后才增加。

getnopages: function(){ 
    var fulltext = "" 
    var partialmatch;  
    var somerx = /something/ 
    return pdfjs.getDocument(data).then(function(pdf) { 
    var pages = []; 
    pageNumbers = []; 
    for (var i = 0; i <= 6; i++) { 
     pages.push(i); 
    } 
    var found = false; 
    var count = 1; 
    return Promise.all(pages.map(function(pageNumber) { 
     pageNumbers.push(pageNumber); 

     return pdf.getPage(pageNumber + 1).then(function(page) 

      return page.getTextContent().then(function(textContent) { 
       return textContent.items.map(function(item) { 
        fulltext+=item.str+'&&&'; 

        return item.str; 
       }).join('&&&'); 
      }); 
     }).then(function(){ 
      count++; 
      console.log('the count is ' + count) 
      var partialmatch; 
      try { 
       partialmatch = fulltext.match(somerx)[0] 
       console.log('the match: ' + partialmatch) 
       var full = fulltext.slice(0, fulltext.length-3) 
      console.log('the full text ' + full) 
      if (fulltext && partialmatch!==full && !found){ 
      found = true; 
      console.log('now we found our number: ' + count) // this finds where the full text differs from the partial text but returns a number too large to be a page number 
      }     
     } 
     catch(e){ 
      console.log(e) 
     }        


     });    
    })); 
} 

任何人都可以帮助我弄清楚如何重写这个,以便计数正确递增页码?

+0

目前尚不清楚其中的全文定义,但看起来像是从随机顺序的所有页面累计文本(因为GETPAGE/getTextContent调用一次为所有页面,这些以任何顺序解决) – async5

+0

@ async5我遗漏了变量声明 - 只是重新编辑它们。你能否建议一种方法来确保全文以正确的顺序返回文本? –

回答

1

我真的不知道代码中的问题在哪里,但我建议您避免使用承诺过多嵌套。您可以通过链接你的承诺像下面减少嵌套:

getnopages: function() { 

    var somerx = /something/ 

    return pdfjs.getDocument(data).then(function(pdf) {  

     var pages = []; 
     pageNumbers = []; 
     for (var i = 0; i <= 6; i++) { 
      pages.push(i); 
     } 
     var found = false; 
     var count = 1; 

     var promises = pages.map(pageNumber => { 
      pageNumbers.push(pageNumber); 
      return pdf.getPage(pageNumber + 1).then(page => { 
       return page.getTextContent(); 
      }).then(textContent => { 
       return textContent.items.map(item => { 
        fulltext += item.str +'&&&'; 
        return item.str; 
       }).join('&&&'); 
      }); 
     }); 
     return Promise.all(promises).then(() => { 
      ... 
     }); 

    }); 
}