Из комбинации
Я был удивлен, увидев, что itext5 (используя собственную стратегию размещения) все еще воспроизводит весь текст, который был оставлен после обрезки.
и вашего фрагмента кода
public class MyLocationTextExtractionStrategy : LocationTextExtractionStrategy
{
public void RenderText(TextRenderInfo renderInfo)
{
string text = renderInfo.GetText();
}
}
Я предполагаю, что вы действительно удивлены тем, что в методе RenderText
вашего MyLocationTextExtractionStrategy
вы извлекаете TextRenderInfo
объекты длятекст за рамкой обрезки.
Но это совершенно естественно!Ваш метод RenderText
реализует этот метод интерфейса IRenderListener
, и методы этого интерфейса вызываются для каждой соответствующей команды рисования в содержимом страницы, независимо от того, будет ли их результат в конечном итоге видимым или нет.
Как я могу заставить itext 5 обнаруживать и игнорировать такой скрытый текст?
Вы можете довольно легко обнаруживать и игнорировать текст вне поля обрезки, сравнивая текстовые координаты с координатами поля обрезкитекущей страницы документа.
iText на самом деле содержит архитектуру фильтра, которая позволяет исключать фрагменты текста для достижения стратегии, которая не удовлетворяет некоторому критерию.
Если вы, например, в настоящее время используете свою стратегию какэто:
MyLocationTextExtractionStrategy strategy = new MyLocationTextExtractionStrategy();
PdfTextExtractor.GetTextFromPage(pdfReader, 1, strategy);
Вы можете применить фильтр области рамки кадрирования следующим образом:
MyLocationTextExtractionStrategy strategy = new MyLocationTextExtractionStrategy();
FilteredTextRenderListener strategyWithFilter = new FilteredTextRenderListener(strategy,
new RegionTextRenderFilter(pdfReader.GetCropBox(1)));
PdfTextExtractor.GetTextFromPage(pdfReader, 1, strategyWithFilter);
В качестве отступления:
Я хочу всевидимый текст в документе.Когда я говорю «видимый», я имею в виду текст, который виден через Adobe Acrobat Reader DC.Я не хочу ограничивать текст какой-либо конкретной областью.Только весь видимый текст.
Текст может быть невидимым по ряду причин, помимо выхода за границы рамки обрезки, например
- itможет быть нарисован в том же цвете, что и фон, например, белый на белом
- . Некоторые настройки или операции могут преобразовывать цвет текста и фона в один и тот же цвет, даже если они могут изначально отличаться,
- можно использовать режим рендеринга текста, который ничего не рисует для начала,
- глифы шрифта, используемого для текста, могут быть невидимы,
- текст может быть покрыт каким-либо изображением,
- ...
Извлечение текста извлечет все эти «невидимые» фрагменты текста.
(До определенного момента вы можете расширить свою структуру извлечения текстаЧтобы распознать это, вы можете найти много вопросов и ответов о таких расширениях здесь при переполнении стека, но всегда будут случаи, которые вы не рассмотрели.)
Также текст может быть толькочастично покрыт.Например, рассмотрим регистр буквы «R» и некоторого белого прямоугольника, покрывающего правую ногу буквы «R», что делает его похожим на «P»
Извлечение текста вернет «R», даже если Adobe Reader отображает что-то, что выраспознавать как 'P'.
Шрифты могут иметь неполную или полную неверную информацию, которой символ Unicode соответствует одному из его глифов.
Извлечение текста вернет неправильный выводдля текста, использующего такой шрифт или, возможно, вообще не выводимого.
Текст в PDF может быть нарисован не с использованием инструкций рисования текста, а с использованием векторной графики, например произвольных форм.
Извлечение текста вообще не извлечет такой «текст».
...
Если эти проблемы являются пробным показом длявы, извлечение текста - неправильная технология для вас, и вы должны использовать OCR вместо этого.