Вот мой код:Почему 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
.
@richardtallent, если вы задаетесь вопросом, какова основная проблема с вашим кодом: стратегия запоминает все содержимое страницы, с которой она столкнулась. Таким образом, вы должны использовать новую стратегию, если хотите извлечь из буфера еще ничего. – mkl
Спасибо! Я не ожидал этого побочного эффекта для объекта, называемого «стратегией», и я помню, что теперь перемещал экземпляр стратегии вне цикла, когда я реорганизовал его по другим причинам. Я переместил его обратно в петлю, и он снова работает отлично. – richardtallent