2017-09-05 2 views
0

J'essaie d'extraire le texte d'un pdf, puis de retourner un nombre qui représente combien de pages du pdf correspondent à une regex que je définis. Mon problème est que, plutôt que de vérifier périodiquement si le texte d'une seule page fait partie de la correspondance, ma fonction divise les morceaux en sections plus petites que les pages. Count est destiné à incrémenter seulement après qu'une page entière ait été lue.alors ne fonctionne pas comme prévu dans la promesse 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) 
     }        


     });    
    })); 
} 

Quelqu'un peut-il me aider à comprendre comment réécrire ceci de sorte que le nombre incrémente les numéros de page correctement?

+0

On ne sait pas où le document est défini, mais ressemble à cela accumuler du texte de toutes les pages dans un ordre aléatoire (parce que getPage/getTextContent invoqué à la fois pour toutes les pages et ces être résolu dans n'importe quel ordre) – async5

+0

@ async5 J'ai laissé les déclarations de variables par accident - je les ai juste rééditées. Pourriez-vous suggérer un moyen de vous assurer que fulltext renvoie le texte dans le bon ordre? –

Répondre

1

Je ne sais pas vraiment où est le problème dans votre code mais je vous suggère simplement d'éviter trop d'imbrications avec des promesses. Vous pouvez réduire la nidification en enchaînant votre promesse comme ci-dessous:

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(() => { 
      ... 
     }); 

    }); 
}