2014-10-22 3 views
1

Вот мой код:Почему iTextSharp читает страницы 1..N вместо N?

var sb = new StringBuilder(); 
var st = new SimpleTextExtractionStrategy(); 
string raw; 
using(var r = new iTextSharp.text.pdf.PdfReader(path)) { 
    for(int pn = 1; pn <= r.NumberOfPages; pn++) { 
     raw = iTextSharp.text.pdf.parser.PdfTextExtractor.GetTextFromPage(r, pn, st); 
     sb.Append(raw); 
    } 
} 

Это работает для почти всех PDF-файлов я никогда перебежать ... до сегодняшнего дня:

http://www7.dleg.state.mi.us/orr/Files/AdminCode/356_10334_AdminCode.pdf

Для этого PDF (и другие подобные ему на том же сайт), извлеченный текст для страницы 1 верен, но текст на стр. 2 содержит страницы 1 и 2, страница 3 содержит страницы 1-3 и т. д. Так что мой StringBuilder заканчивается текстом со страниц 1, 1, 2, 1, 2, 3, 1, 2, 3, 4 и т. Д.

Использование стратегии по умолчанию, основанной на местоположении, имеет ту же проблему (и не будет работать для этих конкретных PDF-файлов).

Недавно я обновился от гораздо более старой версии iTextSharp (5.1-ish?) И не испытывал этой проблемы раньше (я считаю, что я разбирал некоторые из этих файлов до этого без проблем). Я ткнул через источник и ничего не увидел.

Я думал, что смогу обойти это, попросив только последнюю страницу, но это не сработает - я получаю только последнюю страницу. Если я жестко закодирую цикл, чтобы получить страницы 2..4, я получаю 2, 2, 3, 2, 3, 4. Таким образом, проблема может быть некоторыми данными, которые PdfReader поддерживает между вызовами GetTextFromPage.

ответ

2

Изменить код на что-то вроде этого:

var sb = new StringBuilder(); 
string raw; 
using(var r = new iTextSharp.text.pdf.PdfReader(path)) { 
    for(int pn = 1; pn <= r.NumberOfPages; pn++) { 
     var st = new SimpleTextExtractionStrategy(); 
     raw = iTextSharp.text.pdf.parser.PdfTextExtractor.GetTextFromPage(r, pn, st); 
     sb.Append(raw); 
    } 
} 

Обновления на основе комментариев MKL в: стратегии запоминает все содержимое страницы она сталкивалась с. Таким образом, вы должны использовать новую стратегию, если хотите извлечь из буфера еще ничего.

+1

@richardtallent, если вы задаетесь вопросом, какова основная проблема с вашим кодом: стратегия запоминает все содержимое страницы, с которой она столкнулась. Таким образом, вы должны использовать новую стратегию, если хотите извлечь из буфера еще ничего. – mkl

+0

Спасибо! Я не ожидал этого побочного эффекта для объекта, называемого «стратегией», и я помню, что теперь перемещал экземпляр стратегии вне цикла, когда я реорганизовал его по другим причинам. Я переместил его обратно в петлю, и он снова работает отлично. – richardtallent

Смежные вопросы