Требуется ли PDF-распознавание текста? Используйте PyMuPDF для постраничной предварительной проверки вместо полного повторного распознавания.

Если вы хотите распознать PDF-файл с помощью оптического распознавания символов, нет необходимости заново распознавать весь PDF-файл. Используйте PyMuPDF, чтобы постранично определять, есть ли текстовый слой и является ли это полностраничным изображением, и отправлять только те страницы, которые действительно необходимы для распознавания. Прилагаются работоспособные примеры, тесты с ротацией страниц и инструкции по границам ветвей.

Когда многие команды занимаются переводом или архивированием PDF-файлов, они привыкли на входе помечать весь документ как «отсканированный» или «копируемый». 300-страничный PDF-файл может содержать первые 280 страниц с текстовыми слоями и только последние 20 страниц в виде отсканированных вложений. Если классифицировать по целым частям, то все OCR увеличит время ожидания, а также может ошибочно идентифицировать изначально правильные числа. С другой стороны, если вы можете скопировать текст только на главной странице и пропустить распознавание текста на всех страницах, это тоже рискованно.

Более надежный подход — позволить каждой странице перейти к следующему шагу с результатами предварительной проверки. В этой статье реализовано консервативное трехстороннее разделение: прямое извлечение, отправка в очередь кандидатов OCR и проверка вручную. Это интерпретируемая инженерная эвристика, а не универсальный классификатор для оценки качества текста. После прочтения вы можете получить работоспособную постраничную предпечатную программу, а также границы отклонения и общие идеи по устранению ошибок.

Заключение одним предложением

Нет необходимости судить, требует ли PDF-файл OCR. Используйте PyMuPDF для предварительной проверки страница за страницей и отправляйте в OCR только те страницы, которые действительно необходимо распознать.

твоя ситуацияРекомендуемые практикипричина
Извлеките не менее 40 символов без пробелов с одной страницы.Прямое извлечение (TEXT_CANDIDATE)У вас уже достаточно символов, но все еще необходимо выполнить выборочную проверку на наличие скрытых плохих слоев OCR.
Менее 40 слов и одно изображение, занимающее не менее 70 % страницы.Отправить в очередь кандидатов OCRДля идентификации подойдут полностраничные сканы, но и чистых фотографий тоже будет достаточно.
Пустая страница, векторный шрифт, разреженный заголовок или сложная головоломка.Ручной осмотр (ОБЗОР)Эти ситуации не могут быть надежно отнесены к первым двум категориям и не могут быть автоматически пропущены или отброшены.
Гибридный документ на 300 страниц.Предпечатная проверка постранично, не полная обработкаИзбегайте распознавания всех страниц из-за нескольких отсканированных вложений или пропуска всего распознавания, поскольку на главной странице есть текст.

Примечание. Содержимое изображения взято из синтезированного PDF-файла, созданного с помощью приведенного ниже кода, а не из файла клиента или интерфейса OmniDoc. Текст на странице изображения представляет собой растровые пиксели; текст на текстовой странице имеет настоящий текстовый слой.

Решите, что проверить в первую очередь

Здесь используются два сигнала: количество текстовых символов после удаления пробелов и доля площади страницы, занимаемая самой большой картинкой на странице. Первый отвечает: «Было ли извлечено достаточно символов?» а последний помогает отличить полное сканирование страницы от пустой страницы. Область изображения сначала пересекается с рамкой обрезки, чтобы избежать превышения коэффициента увеличения изображения на странице.

наблюдениеОтклонение этой статьиВнимание всё ещё необходимо.
По меньшей мере 40 непустых символовTEXT_CANDIDATEСкрытый слой плохого OCR тоже может содержать много слов
Менее 40 слов и не менее 70% покрытия одного изображенияOCR_CANDIDATEЧистые фотографии также соответствуют требованиям; OCR может не иметь значения
Остальная часть ситуацииREVIEWЗдесь можно найти пустые пространства, векторный текст, редкие заголовки и сложные головоломки

Пороги 40 и 0,70 предназначены для облегчения аудита этого набора тестов, а не для межязыковых стандартов. Китайский, формулы, обложки и короткие формы следует маркировать отдельно. Здесь делается самое большое изображение по площади, а не просто добавление перекрывающихся областей изображений. Поэтому отсканированная страница, состоящая из нескольких изображений, может оказаться в ОБЗОРЕ. Это намеренно сохранённая граница.

Полный исполняемый сэмпл

Выборка использует PyMuPDF==1.28.0, не зависит от Tesseract и не вызывает онлайн-OCR или сервисы перевода. Сохраните как example.py и запустите его в пустой директории. Имя файла, которое он создаёт, фиксировано на routing-fixture.pdf. Для реальных проектов, пожалуйста, не перезаписывайте входные файлы.

import json
import pymupdf

def inspect_page(page):
    chars = len("".join(page.get_text().split()))
    bounds = page.cropbox
    # 图片坐标与文本坐标都是未旋转坐标;不要混用旋转后的 page.rect。
    bounds = pymupdf.Rect(0, 0, bounds.width, bounds.height)
    ratios = []
    for image in page.get_image_info():
        rect = pymupdf.Rect(image["bbox"]) & bounds
        ratios.append(max(0, rect.get_area()) / bounds.get_area())
    largest = max(ratios, default=0.0)
    route = ("TEXT_CANDIDATE" if chars >= 40 else
             "OCR_CANDIDATE" if largest >= 0.70 else "REVIEW")
    return {"page": page.number + 1, "chars": chars,
            "largest_image_ratio": round(largest, 3), "route": route}

with pymupdf.open() as source:
    page = source.new_page(width=360, height=480)
    page.insert_text((28, 60), "Sample invoice 2026-09-26", fontsize=16)
    page.insert_text((28, 100), "Quantity 12   Unit price USD 15.00", fontsize=12)
    page.insert_text((28, 132), "Amount USD 180.00   Checked manually", fontsize=12)
    scan = page.get_pixmap(matrix=pymupdf.Matrix(2, 2)).tobytes("png")
    page = source.new_page(width=360, height=480)
    page.insert_image(page.rect, stream=scan)
    source.new_page(width=360, height=480)
    source.save("routing-fixture.pdf")

with pymupdf.open("routing-fixture.pdf") as pdf:
    result = [inspect_page(page) for page in pdf]
    assert [r["route"] for r in result] == [
        "TEXT_CANDIDATE", "OCR_CANDIDATE", "REVIEW"]
    assert result[1]["chars"] == 0
    assert result[1]["largest_image_ratio"] == 1.0
    pdf[1].set_rotation(90)
    assert inspect_page(pdf[1])["route"] == "OCR_CANDIDATE"
print(json.dumps(result, indent=2))

При доступе к OCR кэшируйте TextPage, это не показатель успеха

OCR-интерфейс PyMuPDF — page.get_textpage_ocr(...). Тессеракт и соответствующие ему языковые данные должны быть подготовлены отдельно. После получения TextPage последующее извлечение должно передавать её как параметр textpage, чтобы избежать распознавания дублирования на той же странице. Для конкретных методов установки и параметров, пожалуйста, обратитесь к Документ OCR PyMuPDF.

В этой статье не используется движок OCR, поэтому результаты тестов лишь подтверждают правильность логики распределения и использования координат и не отражают скорость распознавания китайцев, скорость восстановления таблиц или качество перевода. В производстве должны записываться версия движка OCR, языковой пакет, номер страницы, сводка входных файлов и результаты ручной выборки. Не оставляйте только финальную строку, иначе сложно понять, с какой страницы взято число.

Три типа недостатков, которые легко упустить из виду

Скрытые текстовые слои могут быть искажённым текстом. Соблюдение количества символов означает только «вы можете продолжать попытку извлечения». Также нужно проверить, соответствуют ли заменённые символы, дублирующиеся строки и ключевые поля рендерингу. Ключевые пункты, такие как номер контракта и сумма, должны быть случайно проверены.

Текст, нарисованный векторным путём, не является ни текстом, ни изображениями. Они войдут в ОБЗОР. Не отмечайте страницы автоматически как пустые и не опускайте страницы без шума.

Использование страницы после закрытия документа приведёт к недопустимому объекту. Пожалуйста, сохраняйте область действия with pymupdf.open(...) и выпускайте файл только после предварительной проверки, рендеринга и распаковки. Для получения дополнительной информации о координатах, информации о изображениях и жизненных циклах страницы смотрите PyMuPDF Page API.

Ненадёжные PDF также должны устанавливать размер файла, количество страниц, пиксели рендера, время и лимиты памяти в автономном процессе. Пример тестирует только небольшие файлы и не предоставляет песочницу для вредоносных файлов. Перед созданием и использованием PyMuPDF следует также проверить условия лицензирования и способ распространения.

Переход от потоков к переводческому процессу

Квалифицированный результат — это не строка текста, а запись с номерами страниц и причинами принятия решения. Перед переводом убедитесь, какие страницы можно надёжно извлечь; После перевода рассматриваются содержание, номера и оформление. Вы можете просматривать услуги обработки документов на Запись продукта в OmniDoc. Локальная программа в этой статье работает независимо и не опирается на аккаунт OmniDoc, а также не означает, что она является внутренним алгоритмом продукта.

📊 Сравнение ядра

МаршрутУсловия срабатыванияПодходящая страницаОсновные риски
Прямое извлечение (TEXT_CANDIDATE)По меньшей мере 40 символов без интерваловОсновная страница существующего текстового слояСкрытые неисправные слои OCR могут содержать искажённый текст
Кандидаты на OCR (OCR_CANDIDATE)Менее 40 слов, одно изображение занимает не менее 70%Отсканированная копия на всю страницуЧистые фотографии тоже соответствуют требованиям, но результаты OCR могут быть незначимыми
Ручной осмотр (ОБЗОР)Он не соответствует двум вышеуказанным категориямПустые страницы, векторный текст, редкие заголовки, сложные головоломкиТребуется ручное суждение; пропуск или отброс нельзя выполнять автоматически

🎯 Какой способ тебе подходит?

Если ты ......

  • Обработка смешанных документов с большими разницей качества между главной и последней страницами: предварительная проверка страница за страницей, каждая из которых вводит свой путь.
  • В основном работайте с контрактами, финансовыми документами и другими документами с ключевыми номерами: на странице TEXT_CANDIDATE случайным образом проверяйте соответствие между номерами и рендерами.
  • Пакетная обработка сканов: версии движка записи, языковые пакеты и номера страниц для результатов OCR для удобства отслеживания.
  • Получение PDF-файлов из неизвестных источников: установите лимиты ресурсов в автономных процессах; не обрабатывайте их напрямую в основном процессе.

❓ Часто задаваемые вопросы (FAQ)

1. Главная страница может копировать текст; могу ли я пропустить процесс OCR для всего PDF?

Нет, ты не можешь. Наличие текстового слоя на первой странице не означает, что на следующих страницах он тоже есть; вы должны оценивать страницу за страницей.

2. Почему бы просто не суммировать область изображения напрямую?

Добавление перекрывающихся изображений по площади завышение скорости покрытия. Эта статья занимает самое большое изображение по площади, поэтому отсканированные страницы, сшитые из нескольких изображений, могут попадать в раздел ОБЗОР, который является намеренной границей.

3. Если количество символов достигает 40, значит ли это, что качество текста в порядке?

Таким выводом нельзя. Скрытые плохие OCR-слои могут содержать много символов, поэтому всё равно нужно проверять замену, дублирующиеся линии и ключевые поля.

4. Как следует обрабатывать текст, нарисованный векторными путями?

Они не являются ни текстом, ни изображениями, вводят REVIEW и оцениваются вручную; их не следует автоматически отмечать как пустые или безмолвно отброшенные страницы.

5. Зависит ли местная программа от аккаунта OmniDoc?

Не зависимый. Местная программа в этой статье работает независимо и не вызывает онлайн-OCR или услуги перевода.

📝 Краткое содержание

Во-первых, оставляйте доказательства страница за страницей, прежде чем решать, проводить ли OCR. Оставлять неопределённые страницы в очереди эффективнее, чем маскировать неопределённые результаты под успех.

Опыт сейчас: загрузите документ, чтобы начать перевод, сохраняя оригинальное форматирование

Обновлено 2026-11-15