2016-12-07 2 views
2

Ich benutze iTextSharp PDFReader, um eine PDF-Datei zu lesen, die 18 Seiten hat, aber jedes Mal, wenn ich die Seitenzahl inkrementiere, beginnt es am Anfang der PDF statt nur diese bestimmte Seite zu lesen . Wenn ich "x" auf den Wert von pdfReader.NumberOfPages einstelle, liest es nur die letzte Seite. Ich möchte jede Seite einzeln lesen und die Daten meiner Liste der Schnur s hinzufügen. Ich gehe auch durch einen Ordner und lese jede PDF-Datei, aber ich teste gerade mit nur einem.C# iTextSharp PDFReader liest vom Anfang der PDF Immer

List<string> s = new List<string>(); 
while (z < filePaths.Count()) 
{ 
    PdfReader pdfReader = new PdfReader(filePaths[z]); 
    ITextExtractionStrategy strategy = new SimpleTextExtractionStrategy(); 
    for (int x = 1; x <= pdfReader.NumberOfPages; x++) 
    { 
     string currentText = "";         
     currentText = PdfTextExtractor.GetTextFromPage(pdfReader, x, strategy);       
     s.Add(currentText); 
    } 
    z++; 
    pdfReader.Close(); 
} 
+0

ist es nur die erste Seite immer zu lesen, mit Ausnahme der letzten Seite oder liest sie alles von der ersten bis x-ten Seite jeder? die zugrunde liegende Arbeitstiermethode 'ProcessContent (int pageNumber, E renderListener)' sollte klar machen, was Sie vorhaben ... welche Version von ITextSharp verwenden Sie? – dlatikay

+0

mit 5.5.10.0, es beginnt immer auf der ersten Seite und liest bis zur x-ten Seite – AWooster

+0

nur um sicher zu gehen ... erwarten Sie 's' zu enthalten alle Seiten aller Dateien, eine Seite im Wert von Text pro Listenelement, wenn die äußere Schleife fertig ist? – dlatikay

Antwort

0

Ich vermute, ein Problem Leserstatus. Versuchen Sie, den PdfReader einmal vor der Schleife zu öffnen, um die Anzahl der Seiten zu ermitteln. Speichern Sie die Seitenanzahl in einer Variablen. Verwenden Sie diese Variable als obere Grenze für die Schleife. Dann instanziieren Sie in der Schleife einen neuen PdfReader für jede Seite, und entsorgen Sie ihn nach jeder Iteration.

EDIT: Es stellte sich heraus, dass die Textextraktions-Strategie der Schuldige ist. Es behält Zustand irgendwie bei. Instanziieren Sie immer einen neuen SimpleTextExtractionStrategy, bevor Sie GetTextFromPage aufrufen, oder lassen Sie den Parameter strategy weg - dann wird intern eine neue Instanz der Standardimplementierung ITextExtractionStrategy erstellt.

+0

Ich habe Folgendes versucht und habe immer noch das gleiche Ergebnis wie oben: for (int x = 1; x <= count; x ++) { PdfReader newReader = neuer PdfReader (filePaths [z]); string currentText = ""; currentText = PdfTextExtractor.GetTextFromPage (newReader, x, Strategie); s.Add (currentText); newReader.Dispose(); } – AWooster

+0

seltsam. wir sollten sicherstellen, dass das Seitenwörterbuch dieser PDF-Datei nicht beschädigt ist. Können Sie es mit einer anderen PDF-Datei versuchen? und Ihre Bemerkung, dass es funktioniert, wenn Sie 'x' auf die Anzahl der Seiten setzen: Was passiert, wenn Sie es auf, sagen wir, 7 setzen? – dlatikay

+0

Ich könnte einfach eine andere Liste von Strings verwenden und den letzten Index von "s" nehmen, aber ich befürchte, dass es nicht alle Daten aus der PDF enthält, da die Stringlänge begrenzt ist und ich nicht sicher bin, wie viele Seiten drin sind eine dieser pdfs – AWooster

1

Verstanden, indem die Strategie von dieser Linie PdfTextExtractor.GetTextFromPage(pdfReader, x, strategy) Alle bisherigen Antworten sind

static void Main(string[] args) 
     { 
      List<string> filePaths = new List<string>(); 
      filePaths.Add("C:\\temp\\pe\\ACN-ONFBG-010-R-EN-ONT (1364).pdf"); 
      filePaths.Add("C:\\temp\\pe\\ACN-ONFBG-010-R-UN-NOR (1364).pdf"); 
      filePaths.Add("C:\\temp\\pe\\ACN-ONFBG-010-R-UN-SOU (1364).pdf"); 
      List<string> results = doit(filePaths); 
      string stall = "stall"; 
     } 


     private static List<string> doit(List<string> filePaths) 
     { 
      List<string> s = new List<string>(); 
      int z = 0; 
      while (z < filePaths.Count()) 
      { 
       PdfReader pdfReader = new PdfReader(filePaths[z]); 
       ITextExtractionStrategy strategy = new SimpleTextExtractionStrategy(); 
       for (int x = 1; x <= pdfReader.NumberOfPages; x++) 
       { 
        string currentText = ""; 
        currentText = PdfTextExtractor.GetTextFromPage(pdfReader, x); 
        s.Add(currentText); 
       } 
       z++; 
       pdfReader.Close(); 
      } 
      return s; 
     } 
+0

zu beheben, das den Standard 'LocationTextExtractionStrategy' anstelle von' SimpleTextExtractionStrategy' aufruft. Offensichtlich behandelt letzteres Seitengrenzen nicht richtig - keine Ahnung, ob per Definition oder wegen eines Fehlers. – dlatikay

+0

Es macht es unabhängig davon. Es ging von nicht arbeiten, zu arbeiten und das ist die einzige Änderung, die ich gemacht habe, um es zum Laufen zu bringen. An diesem Punkt würde ich mich auf einen Fehler konzentrieren. Bruno ist oft hier und beantwortet iText-bezogene Fragen, hoffentlich wird er diesen sehen und einsteigen. –

+0

deshalb habe ich upvotiert, obwohl die Diskussion unter meiner Antwort zu der gleichen Schlussfolgerung führte :) lasst uns hoffen, dass jemand von iText das liest, könnten sie erklären oder reparieren. – dlatikay

4

arbeitet ziemlich nah dran, das heißt Sie richtig es auf irgendeine Art von Staat Ausgabe Schuld war.

Der einzige Teil, der fehlte, ist, dass es die strategy Variable ist, die sich ihren Zustand merkt. Nach dem Aufruf GetTextFromPage wird Ihr vorhandenes Objekt von Ihrem Strategieobjekt nicht gelöscht.

So ist der Trick, um Ihre strategy innerhalb der Schleife zu instanziieren:

for (int x = 1; x <= pdfReader.NumberOfPages; x++) 
{ 
    ITextExtractionStrategy strategy = new SimpleTextExtractionStrategy(); 
    string currentText = "";         
    currentText = PdfTextExtractor.GetTextFromPage(pdfReader, x, strategy);       
    s.Add(currentText); 
} 
Verwandte Themen