Извлечение текста из PDF: текстовый слой и OCR
Одни PDF отдают свой текст за секунду, другие содержат только изображения страниц, и для них нужно OCR. В этом руководстве объясняется, как текст хранится в PDF, почему извлечённый текст может получиться нечитаемым или в неправильном порядке, как OCR читает отсканированные страницы и что влияет на его точность, а также что проверить, прежде чем полагаться на результат.
Два вида страниц PDF
Страница PDF может содержать текст двумя способами. У большинства PDF, экспортированных из текстового редактора, браузера или графической программы, есть текстовый слой: каждый символ хранится как код в шрифте и размещён в определённом месте страницы. Отсканированная или сфотографированная страница устроена иначе. Это одно изображение страницы, и для программы буквы на нём — просто пиксели.
| Вид страницы | Как она создана | Что даёт извлечение |
|---|---|---|
| Текстовый PDF | Экспорт или печать в PDF из приложения | Сохранённые символы, обычно точно |
| Отсканированный PDF | Сканер, камера телефона или факс | Ничего, пока OCR не прочитает изображение |
| Скан с поиском | Скан, к которому позже добавили текстовый слой OCR | Тот результат OCR вместе с его ошибками |
| Текст в кривых | Текст, превращённый в фигуры в графической программе | Символов нет; прочитать может только OCR |
Обычно вид страницы можно определить в программе просмотра PDF. Если удаётся выделить одно слово или найти его через поиск, у страницы есть текстовый слой. Если при выделении вся страница выделяется одним блоком или поиск ничего не находит, страница — изображение. В одном файле может быть и то и другое, например набранный отчёт с отсканированными приложениями.
Как работает извлечение текстового слоя
PDF не хранит абзацы. Он хранит фрагменты символов, у каждого из которых есть шрифт и позиция, часто по одному слову или по нескольку букв, в том порядке, который выбрала программа, создавшая файл. Программа извлечения читает эти фрагменты и заново собирает строки по их позициям.
Инструмент «PDF в текст» от LeedyBox читает фрагменты с помощью PDF.js — PDF-движка Firefox. Он начинает новую строку, когда вертикальная позиция меняется больше чем на 5 пунктов (около 1,8 мм), а иначе соединяет фрагменты пробелом; каждая страница в результате начинается с метки вида --- Страница 1 ---. Большинство одноколоночных документов получаются читаемыми, но есть побочные эффекты:
- Слово, сохранённое несколькими фрагментами, например из-за разрядки, может получиться с пробелами внутри.
- Колонки, врезки и подписи идут в том порядке, в каком они сохранены, а он может отличаться от порядка чтения.
- Верхние индексы, знаки сносок и другой текст выше или ниже строки могут оказаться на отдельной строке.
- Колонтитулы и номера страниц входят в текст каждой страницы.
Почему извлечённый текст бывает нечитаемым
Внутри PDF текст хранится как коды глифов шрифта, а не как символы Unicode. Чтобы снова превратить коды в буквы, в файле нужна таблица соответствия. Аккуратно сделанные PDF содержат таблицу ToUnicode для каждого шрифта, а шрифты со стандартной кодировкой можно декодировать и без неё. Проблемы начинаются, когда шрифт встроен как подмножество со своей нумерацией и без таблицы: вне файла коды ничего не значат, и при извлечении получаются неверные буквы, символы или пустые квадратики, хотя страница выглядит нормально.
Китайские, японские и корейские шрифты часто используют вместо собственных таблиц стандартные карты символов (CMap), например Adobe-Japan1 или Adobe-Korea1. Инструмент LeedyBox загружает эти CMap вместе с PDF.js, поэтому правильно читает многие восточноазиатские документы, которые простые программы искажают. Другие частые причины — лигатуры, например fi, сохранённая одним глифом, шрифты Type 3, буквы которых нарисованы как фигуры и часто не имеют таблицы, и PDF, кодировку которых намеренно перемешали, чтобы затруднить копирование.
Если у страницы есть текстовый слой, инструмент использует его, даже если текст нечитаем, и не запускает для этой страницы OCR. Чтобы прочитать такую страницу через OCR, преобразуйте её в изображение с помощью «PDF в JPG» и распознайте изображение в «Изображение в текст (OCR)».
Когда инструмент LeedyBox использует OCR
Инструмент решает отдельно для каждой страницы. Если в текстовом слое страницы меньше 15 символов, страница отрисовывается как изображение в двойном размере, около 144 пикселей на дюйм, и распознаётся Tesseract.js на языке, выбранном в поле «Язык OCR», вместе с английским. Поэтому в документе с набранными и отсканированными страницами набранные читаются точно, и через OCR проходят только сканы.
Отсканированная страница, на которой есть несколько символов от штампа или номера страницы, всё равно считается пустой и проходит через OCR. А скан, у которого уже есть текстовый слой из 15 и более символов, не проходит, поэтому некачественный слой OCR, добавленный сканером, выводится как есть. Движок OCR и языковые данные загружаются с leedybox.com при первом запуске OCR, поэтому первая отсканированная страница обрабатывается дольше. Ваш PDF читается в браузере и никуда не загружается.
Как OCR превращает пиксели в текст
OCR работает поэтапно. Сначала движок переводит изображение в чёрно-белое и находит блоки текста, строки и слова — этот шаг называется сегментацией страницы. Затем нейросеть, обученная на одном языке или письменности, читает каждую строку и выбирает наиболее вероятную последовательность символов, опираясь на словари языка. Результат — это догадка, а не копия: похожие формы, например 0 и O, 1, l и I или rn и m, могут путаться, а слова, которых нет в языковых данных, распознаются с ошибками чаще.
Выбор языка важнее любой другой настройки. Модель, обученная на латинице, не может читать тайский или японский, а текст на невыбранном языке обычно превращается в неверные символы. Все варианты в инструменте LeedyBox, кроме «Только английский», сочетают выбранный язык с английским, что помогает с двуязычными документами, например с русским договором, где названия товаров написаны по-английски.
Что влияет на точность OCR
| Фактор | Влияние | Что помогает |
|---|---|---|
| Разрешение | Мелкий шрифт теряет детали, по которым различаются буквы | Сканировать с разрешением 300 DPI и выше; для мелкого шрифта — выше |
| Наклон и изгиб | Наклонные строки и изогнутые страницы книги мешают находить строки | Сканировать ровно и прямо; фотографировать строго сверху |
| Контраст и шум | Серый фон, пятна, просвечивающий оборот и артефакты JPEG похожи на штрихи | Чистые сканы с тёмным текстом на белом фоне |
| Шрифты | Декоративные, очень тонкие или очень жирные шрифты распознаются хуже | Внимательно проверять результат |
| Рукописный текст | Tesseract обучен на печатном тексте | Ожидать плохих результатов; лучше набрать текст |
| Вертикальный текст | Вертикальный японский или китайский текст часто распознаётся неверно | Внимательно проверять или набирать заново |
Поскольку инструмент отрисовывает страницы примерно с 144 пикселями на дюйм, мелкий текст, например сноски или мелкий шрифт договора, бывает трудно распознать даже на хорошем скане. Для таких страниц «PDF в JPG» создаёт изображения в более высоком разрешении, а «Изображение в текст (OCR)» может повторно распознать мелкий текст в двукратном размере и повысить контраст перед распознаванием.
Таблицы, колонки и вёрстка
Результат — обычный текст. Таблицы теряют сетку, многоколоночные страницы могут выводиться колонка за колонкой или строка за строкой поперёк колонок, а текстовые блоки и подписи оказываются там, куда их поставил в порядке чтения файл или движок OCR. Распознать слова и восстановить вёрстку — разные задачи, и инструмент решает только первую. В таблицах с числами сверяйте каждое значение с оригиналом или заново наберите таблицу в электронной таблице; в длинных документах восстановите заголовки и абзацы в редакторе после извлечения текста.
Проверка и очистка результата
- Сравните несколько чисел, имён и дат с оригиналом: ошибки OCR в цифрах легко пропустить.
- Поищите типичные путаницы: 0 и O, 1, l и I, 5 и S, rn и m, а также пропавшие диакритические знаки, например ё и й.
- Соедините слова, перенесённые через дефис в конце строки, и строки, разорванные внутри абзацев.
- Удалите метки страниц, колонтитулы и номера страниц, если нужен сплошной текст.
- Сохраните результат кнопкой «Копировать текст» или «Сохранить как .TXT»; сохранённый файл — обычный текст в UTF-8.
Частые вопросы
Почему страница получилась пустой?
У страницы не было текстового слоя, а OCR не нашёл ничего, что мог бы прочитать: скан может быть пустым, слишком бледным или мелким, либо текст написан от руки. Попробуйте более чёткий скан или преобразуйте страницу через «PDF в JPG» и воспользуйтесь «Изображение в текст» с настройками контраста и увеличения.
Можно ли прочитать PDF, защищённый паролем?
PDF, который запрашивает пароль при открытии, прочитать нельзя: инструмент покажет ошибку. Если у вас есть на это право, откройте файл с паролем в программе просмотра PDF и сначала сохраните незащищённую копию.
Может ли инструмент сделать PDF с поиском?
Нет. Результат — обычный текст, который можно скопировать или сохранить в файл .txt, а сам PDF не меняется. Программы, создающие PDF с поиском, добавляют поверх каждой отсканированной страницы невидимый текстовый слой OCR.
Почему OCR работает медленно на длинных документах?
Каждая отсканированная страница отрисовывается как изображение и распознаётся в браузере одна за другой после загрузки движка OCR и языковых данных. На медленном устройстве одна страница может занимать несколько секунд и больше. Страницы с текстовым слоем обрабатываются гораздо быстрее, потому что распознавание им не нужно.