Причина, по которой при извлечении текста не извлекаются эти тексты, довольно проста: эти тексты не являются частью содержимого страницы c, а являются полями формы! Но «извлечение текста» в iText (и других известных мне библиотеках PDF) считается «извлечением текста из содержимого страницы stati c». Таким образом, пропущенные вами тексты просто не подлежат извлечению.
Если вы хотите, чтобы значения полей формы также соответствовали вашему коду извлечения текста, сначала вы должны сгладить форму полевые визуализации. Под «выравниванием» здесь подразумевается включение их в содержимое страницы stati c и удаление всей динамики их полей формы.
Это можно сделать, добавив после прочтения PDF в эту строку
PdfReader pdfReader = new PdfReader(filePath);
код для сглаживания этого PDF и загрузки сглаженного PDF в pdfReader
, например, так:
MemoryStream memoryStream = new MemoryStream();
PdfStamper pdfStamper = new PdfStamper(pdfReader, memoryStream);
pdfStamper.FormFlattening = true;
pdfStamper.Writer.CloseStream = false;
pdfStamper.Close();
memoryStream.Position = 0;
pdfReader = new PdfReader(memoryStream);
Извлечение текста из этой повторно инициализированной pdfReader
даст вам текст из формы поля тоже.
К сожалению, сглаженный текст формы добавляется в конце потока содержимого. Так как выбранная вами стратегия извлечения текста SimpleTextExtractionStrategy
просто возвращает текст в том порядке, в котором он нарисован, содержимое полей прежней формы все извлекается в конце.
Вы можете изменить это, используя другую стратегию извлечения текста, то есть, заменив эту строку:
ITextExtractionStrategy strategy = new SimpleTextExtractionStrategy();
Использование LocationTextExtractionStrategy
(которое является частью распространения iText) уже возвращает лучший результат; к сожалению, значения полей формы находятся не совсем в той же базовой строке, что и содержимое stati c, которое мы воспринимаем как одну и ту же строку, поэтому есть неожиданные разрывы строк.
ITextExtractionStrategy strategy = new LocationTextExtractionStrategy();
При использовании HorizontalTextExtractionStrategy
(из этого ответа , который содержит как Java, так и C# его версию) результат будет еще лучше. Однако будьте осторожны, эта стратегия не всегда лучше, прочитайте предупреждения в тексте ответа.
ITextExtractionStrategy strategy = new HorizontalTextExtractionStrategy();