Чи вимагає PDF OCR? Використовуйте PyMuPDF для виконання посторінкової попередньої перевірки замість повного повторного розпізнавання
Якщо ви хочете розпізнати PDF-файл, не потрібно повторно розпізнавати весь PDF-файл. Використовуйте PyMuPDF, щоб сторінка за сторінкою визначати, чи є текстовий шар і чи це повносторінкове зображення, і надсилайте лише ті сторінки, які справді потрібні для розпізнавання. Додано приклади, які можна виконувати, тести, що обертаються, та інструкції щодо меж гілок.
Коли багато команд мають справу з перекладом або архівуванням PDF-файлів, вони звикли на вході позначати весь документ як «відсканований» або «придатний для копіювання». 300-сторінковий PDF-файл може містити перші 280 сторінок із текстовими шарами та лише останні 20 сторінок як відскановані вкладення. Якщо класифікувати за цілими частинами, весь OCR збільшить час очікування, а також може неправильно визначити вихідні правильні числа. З іншого боку, якщо ви можете копіювати лише текст на домашній сторінці та пропускати 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 текстова сторінка кешується замість позначки успіху.
Інтерфейс OCR PyMuPDF — page.get_textpage_ocr(...). Тессеракт і відповідні мовні дані потрібно готувати окремо. Після отримання TextPage його слід передати як параметр textpage під час наступного вилучення, щоб уникнути повторного розпізнавання тієї самої сторінки. Будь ласка, зверніться до Документація 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. Як має бути оброблений текст, намальований векторним шляхом?
Вони не є ані текстом, ані зображеннями, входять у ПЕРЕГЛЯД, оцінюються людьми, і їх не слід автоматично позначати як порожні чи мовчки відкидати.
5. Чи залежить локальна програма від облікового запису OmniDoc?
Не залежний. Локальна програма для цієї статті працює незалежно та не викликає жодних онлайн-служб OCR або перекладу.
📝 Підсумок
Спершу залишайте докази сторінка за сторінкою, а потім вирішуйте, чи робити OCR. Корисніше залишити непевні сторінки в черзі, ніж маскувати непевні результати за успіх.
Спробуйте зараз: завантажте документ, щоб розпочати переклад, зберігаючи вихідний макет


