Перейти к содержимому
LeedyBox
Поддержать

Извлечение текста из 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 и языковых данных. На медленном устройстве одна страница может занимать несколько секунд и больше. Страницы с текстовым слоем обрабатываются гораздо быстрее, потому что распознавание им не нужно.