2016-07-09 15 views
1

Ich baue eine clientseitige Anwendung, die Pdf.js verwendet den Inhalt einer ausgewählten PDF-Datei zu analysieren, und ich laufe in eine seltsame Frage .Pdf.js gibt Textinhalte des gesamten Dokuments als jede textcontent Seite

Alles scheint gut zu funktionieren. Der Code lädt das PDF.js-PDF-Objekt erfolgreich, das dann die Seiten des Dokuments durchläuft und dann den Textinhalt für jede Seite abruft.

Nachdem ich den Code unten ausgeführt habe und die Daten in Browser-Tools überprüfen, bemerke ich, dass das textContent-Objekt jeder Seite den Text des gesamten Dokuments enthält und nicht nur den Text von der zugehörigen Seite.

Hat jemand das schon erlebt?

Ich zog (und modifiziert) die meisten der Code, den ich von Pdf.js Beiträge hier bin mit, und es ist ziemlich geradlinig und scheint genau wie erwartet, abgesehen von dieser Ausgabe:

testLoop: function (event) { 
    var file = event.target.files[0]; 
    var fileReader = new FileReader(); 
    fileReader.readAsArrayBuffer(file); 
    fileReader.onload = function() { 
     var typedArray = new Uint8Array(this.result); 
     PDFJS.getDocument(typedArray).then(function (pdf) { 
      for(var i = 1; i <= pdf.numPages; i++) { 
       pdf.getPage(i).then(function (page) { 
        page.getTextContent().then(function (textContent) { 
         console.log(textContent); 
        }); 
       }); 
      } 
     }); 
    } 
}, 

Außerdem ist die Größe der zurückgegebenen textContent-Objekte für jede Seite leicht unterschiedlich, obwohl alle Objekte ein gemeinsames letztes Objekt teilen - das letzte Bit des gesamten Dokuments. Hier

ist ein Bild von meinem Kontrolleur zu verdeutlichen, dass die Objekte sind alle sehr ähnlich dimensioniert.

Durch manuelle Inspektion der Objekte im Inspektor gezeigt, kann ich sehen, dass die Daten von, Seite # 1 zum Beispiel wirklich nur aus etwa 140 Array-Elemente bestehen sollte, also warum das Objekt für diese Seite enthält ~ 700 oder so? Und warum die Variation?

enter image description here

+0

Was sind die Einzelteile? Ohne das Array oder das PDF zu sehen, ist es nicht sicher, aber ich habe Dokumente durchsucht, in denen die Elemente nicht in einfachen Wort-Tokens enthalten sind. Für (gute, schlechte, zufällige, irrelevante) Gründe könnte das pdf so aufgebaut sein, dass es sich oft auf Whitespace oder Midwords aufteilt. Ich habe mich immer den Arrays angeschlossen und meine eigene Tokenisierung durchgeführt. Ein einfacher '.join() .split (/ \ s + /)' könnte einen Versuch wert sein. – user01

+0

Diese Antwort hat ein sehr gutes Beispiel dafür, wie Pdf.js verwendet Textinhalt zu extrahieren: http://stackoverflow.com/a/20522307/6481438 – GCSDC

+0

@ user01 Danke für die Antwort - Ihr Punkt über die PDF ist seltsam hilft zusammengesetzt viel! – ineedhelp

Antwort

0

Es ist wie die Frage sieht hier die Formatierung des PDF-Dokuments zu analysieren Ich versuche. Das PDF enthält Regierungsdaten in einem tabellarischen Format, das offensichtlich nicht nach modernen PDF-Standards erstellt wurde.

Ich habe das Skript mit verschiedenen PDF-Dateien getestet (was ich weiß, richtig zusammengesetzt ist), und die Seite textcontent zurückgegebenen Objekte korrekt auf dem Inhalt der Seiten aufgeteilt basiert.

Falls jemand anderes in dieser Frage läuft in die Zukunft, gibt es mindestens zwei Möglichkeiten, das Problem, so weit zu behandeln, wie ich bisher vorgestellt haben:

  1. Irgendwie die fehlerhafte PDF umformatieren zu Verwenden Sie aktualisierte Standards und bearbeiten Sie sie anschließend. Ich weiß nicht, wie ich das machen soll, und ich bin mir auch nicht sicher, ob es realistisch ist.

  2. Wählen Sie das größte der zurückgegebenen page textContent-Objekte aus (da sie alle mehr oder weniger den vollständigen Text des Dokuments enthalten) und führen Sie Ihre Operationen für dieses textContent-Objekt aus.