Невозможно прочитать текст в указанном c месте в файле PDF с помощью iTextSharp - PullRequest
0 голосов
/ 27 апреля 2020

Мне дают читать тексты в формате pdf и делать какие-то вещи, которые извлекают тексты. Я использую iTextSharp для чтения PDF. Проблема здесь в том, что PdfTextExtractor.GetTextFromPage не дает мне все содержимое страницы. Например,

enter image description here

В вышеуказанном PDF я не могу прочитать тексты, выделенные синим цветом, Остальные персонажи, которые я могу читать. Ниже строка, которая делает выше

           `string filePath = "myFile path";
            PdfReader pdfReader = new PdfReader(filePath);
            for (int page = 1; page<=1; page++)
            {
                ITextExtractionStrategy strategy = new SimpleTextExtractionStrategy();
                string currentPageText = PdfTextExtractor.GetTextFromPage(pdfReader, page, strategy);
            }`

Есть предложения здесь?

Я прошел через множество запросов и решений в SO, но не указал c для этого запроса.

1 Ответ

1 голос
/ 30 апреля 2020

Причина, по которой при извлечении текста не извлекаются эти тексты, довольно проста: эти тексты не являются частью содержимого страницы 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();
    
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...