2016-12-07 2 views
2

Я использую iTextSharp PDFReader для чтения PDF-файла с 18 страницами, но каждый раз, когда я увеличиваю номер страницы, он начинается с начала pdf, вместо того, чтобы читать только эту конкретную страницу , Если я установил значение «x» в значение pdfReader.NumberOfPages, он будет читать только последнюю страницу. Я хотел бы прочитать каждую страницу отдельно и добавить данные в список строк s. Я также просматриваю папку, читая каждый файл pdf, но сначала тестирую только один.C# iTextSharp PDFReader читает с начала PDF всегда

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

это всегда читать только первую страницу, на последнюю страницу, кроме, или это все от первого до хх страниц каждого читать? основной метод workhorse 'ProcessContent (int pageNumber, E renderListener)' явно должен делать то, что вы намерены ... какую версию ITextSharp вы используете? – dlatikay

+0

, используя 5.5.10.0, он всегда начинается с первой страницы и читается до xth страницы – AWooster

+0

, чтобы убедиться, что ... вы ожидаете, что 's' будет содержать все страницы всех файлов, одну страницу для текста на элемент списка, когда внешний контур завершен? – dlatikay

ответ

0

Я подозреваю, что проблема с читателем. Попробуйте открыть PdfReader один раз перед циклом, чтобы получить количество страниц. Храните количество страниц в переменной. Используйте эту переменную в качестве верхней границы цикла. Затем в цикле создайте новый PdfReader для каждой страницы, разместите его после каждой итерации.

EDIT: Оказалось, что стратегия удаления текста является виновником. Он как-то сохраняет состояние. Всегда создавайте экземпляр нового SimpleTextExtractionStrategy перед вызовом GetTextFromPage или опустите параметр strategy. Затем будет создан новый экземпляр реализации по умолчанию ITextExtractionStrategy.

+0

Я попробовал следующее и получил тот же результат, что и выше: for (int x = 1; x <= count; x ++) { PdfReader newReader = new PdfReader (filePaths [z]); string currentText = ""; currentText = PdfTextExtractor.GetTextFromPage (newReader, x, strategy); s.Add (currentText); newReader.Dispose(); } – AWooster

+0

странный. мы должны убедиться, что словарь страниц этого PDF-файла не нарушен ... можете ли вы попробовать с любым другим PDF-файлом? и ваше замечание, что оно работает, когда вы устанавливаете 'x' на количество страниц: что произойдет, если вы установите его, допустим, 7? – dlatikay

+0

Я мог бы просто использовать другой список строк и захватить последний индекс «s», но я боюсь, что он не может содержать все данные из pdf, поскольку длина строк ограничена, и я не уверен, сколько страниц может быть в любой из этих pdf-файлов – AWooster

1

Понял работать путем удаления стратегии из этой линии PdfTextExtractor.GetTextFromPage(pdfReader, x, strategy)

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

, которая вызывает значение по умолчанию, 'LocationTextExtractionStrategy', а не' SimpleTextExtractionStrategy'. Очевидно, что последнее не обрабатывает границы страницы правильно - не знаю, по определению, или из-за ошибки. – dlatikay

+0

Это заставляет его работать независимо. Он шел от нерабочего, к работе, и это единственное изменение, которое я сделал, чтобы заставить его работать. На данный момент я склоняюсь к ошибке. Бруно часто здесь, отвечая на вопрос, связанный с iText, надеюсь, он увидит это и включится. –

+0

вот почему я поддержал, хотя обсуждение ниже моего ответа привело к такому же выводу :) будем надеяться, что кто-то из iText прочитает это, они могут объяснить или исправить. – dlatikay

4

Все предыдущие ответы достаточно близки, то есть вы были правильно обвиняла его на какой-то государственной проблемы.

Единственная потерянная часть - это переменная strategy, которая запоминает ее состояние. После вызова GetTextFromPage ваш объект стратегии не очищает существующее содержимое.

Так хитрость заключается в том, чтобы создать экземпляр strategy внутри цикла:

for (int x = 1; x <= pdfReader.NumberOfPages; x++) 
{ 
    ITextExtractionStrategy strategy = new SimpleTextExtractionStrategy(); 
    string currentText = "";         
    currentText = PdfTextExtractor.GetTextFromPage(pdfReader, x, strategy);       
    s.Add(currentText); 
} 
Смежные вопросы