Поиск по PDF не находит слово, которое видно
Внутри страницы нет ни слов, ни пробелов — есть команды поставить шрифт, перейти в точку и нарисовать кусок строки. Слова и промежутки просмотрщик достраивает сам, по расстояниям между кусками. Поэтому поиск спотыкается там, где склейка разошлась с тем, что видит глаз: слово разбито на части, перенесено с дефисом, буква записана двумя знаками или текстового слоя нет вовсе.
Коротко о цифрах
- Что на самом деле в файле
- команды нарисовать кусок строки в точке, без понятий слова и пробела
- Откуда берутся пробелы
- из зазора между кусками; подряд идущие пробелы ограничены по числу
- Подгружаемые данные
- таблицы предопределённых кодировок и данные стандартных шрифтов
- Проверка пригодности к правке
- три страницы выборки, порог — в среднем пять текстовых элементов на страницу
- Языки распознавания сканов
- русский, казахский, английский
Пять причин по убыванию частоты
- Слоя нет. Страница — картинка: скан, фотография или документ после растеризующего сжатия. Искать не в чем, а не «плохо ищется».
- Слово разбито на куски. Кернинг и выключка заставляют генератор рисовать слово несколькими кусками; просмотрщик склеивает их по зазору, и если зазор был принят за пробел, целое слово не найдётся, а его половина найдётся.
- Перенос по слогам. Слово физически разорвано дефисом и концом строки — это два куска в разных местах страницы, и они не склеиваются никогда.
- Нет таблицы соответствия знаков. Глифы нарисованы правильно, но обратного отображения в символы у шрифта нет: поиск и копирование получают чужие коды, а вы видите нормальные буквы.
- Разная запись одной буквы. Й и Ё существуют и как один знак, и как пара из буквы со значком; е вместо ё встречается сплошь. Сравнение идёт по кодам, а не по внешнему виду.
Диагностика за три действия
- Выделите абзац и вставьте его в любое поле ввода. Пусто — слоя нет; каша из символов — сломана таблица соответствия; нормальный текст — идём дальше.
- Найдите не всё слово, а его середину из трёх-четырёх букв. Середина находится, целое нет — слово разбито на куски или перенесено.
- Проверьте слово без ё и без й: если поиск оживает, дело в разной записи одной и той же буквы.
- Прогоните документ через извлечение текста: вы увидите ровно то, что видит поиск, только целиком и в одном месте.
- Сравните с исходником в редакторе, если он есть, — там слова хранятся словами, и расхождение сразу видно.
Что делаем мы
Извлечение собирает строку из кусков и ставит пробелы по величине зазора: маленький зазор считается кернингом внутри слова, средний — пробелом, большой — колонкой таблицы. Количество подряд идущих пробелов ограничено, иначе широкий межколоночный промежуток превращал бы файл в поле пробелов. Это те же правила, по которым склеивает просмотрщик, поэтому результат извлечения — честный слепок того, что доступно поиску.
Кроме того, при открытии документа подкладываются таблицы предопределённых кодировок и данные стандартных шрифтов. Без них у файлов, которые ссылаются на встроенные в формат кодировки, текст не извлекается вообще — а выглядит это как «в документе нет текстового слоя», хотя слой есть. Редактор дополнительно проверяет три страницы, первую, среднюю и последнюю, и считает документ пригодным только при среднем количестве текстовых элементов не ниже пяти на страницу.
Чего мы не чиним
- Сломанную таблицу соответствия знаков: правильные коды в файле отсутствуют, восстановить их можно только распознаванием картинки страницы.
- Переносы по слогам: разорванное слово останется двумя кусками, потому что так его нарисовал автор документа.
- Разную запись буквы: нормализацию делает не документ, а тот, кто ищет, и наши инструменты чужой поиск не настраивают.
- Поиск внутри чужого просмотрщика: у каждого свои правила склейки, и наш результат ничего в них не меняет.
Частые вопросы
Поиск находит половину слова, но не всё слово. Как это возможно?
Слово нарисовано несколькими кусками, и между двумя из них оказался зазор, принятый за пробел. Для просмотрщика это два слова, поэтому половина находится, а целое — нет.
Помогает ли извлечение текста, если поиск не работает?
Помогает понять причину. Вы получаете ровно тот текст, который доступен поиску, и сразу видите, чего в нём нет: слова, разорванного переносом, или всего абзаца, если страница оказалась картинкой.
Почему поиск по одному и тому же файлу работает по-разному в двух программах?
Потому что склейку кусков в слова каждая программа делает по своим порогам зазора. Один просмотрщик считает промежуток кернингом, другой пробелом, и результаты поиска расходятся на одном документе.
Как сделать документ, по которому поиск точно работает?
Выгружайте PDF прямо из редактора, а не через печать в файл, встраивайте шрифты и отключайте автоматический перенос по слогам. Для сканов единственный путь — распознавание, добавляющее текстовый слой под изображение.