Як отримати суму в PDF, її положення на сторінці
У цій статті демонструється використання PyMuPDF для пошуку повторюваної кількості тексту в межах указаного прямокутника. Розбираючи перші п’ять полів октету слів і перевіряючи кількість кандидатів, можна уникнути неправильних оцінок під час з’єднання фрагментів. Надає приклади Python на рівні пам’яті, стратегії обробки меж і таблиці прийнятності, а також дає практичні поради щодо підключення до робочого процесу перекладу документів OmniDoc.
Як знайти повторювані суми? Висновок одним реченням
Коли макет зафіксовано, спочатку обмежте відому область, а потім перевірте текст і залиште кількість кандидатів на розсуд абонента. Це легше інтерпретувати, ніж продовжувати нагромаджувати регулярні вирази, і менше шансів зробити мовчазні помилки.
| ваша ситуація | Рекомендовані практики | причина |
|---|---|---|
| Однакова сума відображається в кількох місцях на сторінці | Обмежте пошук прямокутною областю, де розташоване бізнес-поле, а потім виконайте пошук | Повнотекстовий пошук не може визначити, яке поле є бізнес-полем |
| В області запиту є кілька кандидатів | Повернути всі кандидати в поєднанні з мітками або ручним усуненням неоднозначності | Програми не повинні робити вибір для бізнесу |
| В області запиту немає збігів | Позначте причину та перевірте оригінальну сторінку, без нульових відступів | Неправильна область, кількість розділених чи відсутні текстові шари можуть призвести до нульового збігу |
| Положення кадру виглядає зміщеним | Явні ланцюжки трансформації для обертання, обрізання та масштабування візуалізації | Змішування відображених координат і витягнутих координат призведе до відхилень |
Дві однакові суми в одній виписці
1,200.00 з’являється у виписці двічі: один раз у стовпці суми до сплати та один раз у тексті опису. Повнотекстовий пошук може знайти їх, але він не може вирішити за вас, яка з них є бізнес-сферою.
Якщо макет форми фіксований, його зазвичай легше інтерпретувати, спочатку обмеживши відому область, а потім здійснивши пошук у тексті, ніж продовжуючи коригувати регулярний вираз. Головне не «знайти лише одну коробку», а розглядати як нульові, так і численні збіги як чіткі результати та не дозволяти програмі робити неавторизовані вибори.
Залиште позицію слова, а не лише тексту
`page.get_text("words")` PyMuPDF повертає запис слова з позицією, загальне поле (x0, y0, x1, y1, text, block_no, line_no, word_no). У наступному прикладі беруться лише перші п’ять полів, а останні три числа наразі не залучаються до регіональної фільтрації.
«Слово» тут є фрагментом, наданим екстрактором, який не обов’язково дорівнює слову в лінгвістичному сенсі, і не гарантується, що сума завжди буде повним фрагментом. 1,200.00 може бути розібраним або мати суміжні теги. У цій статті йдеться лише про точне зіставлення повних фрагментів: я б краще віддав записи, які не відповідають умовам, для перевірки, ніж тихо з’єднав їх у начебто законну суму.
Перевірте за допомогою двох синтетичних сторінок однакової кількості
Ми створюємо нову сторінку PDF у пам’яті та розміщуємо стільки ж біля вертикальних координат 120 та 420 відповідно. Область запиту охоплює лише вказану вище суму.
Точка вставки тексту – це положення базової лінії, а не лівий верхній кут текстового поля. Шрифт і розмір шрифту впливатимуть на висоту та ширину реального поля, тому координати не можуть бути жорстко закодовані у фіксоване значення.
Правильний вихід повинен відповідати двом умовам:
- В області запиту є лише один кандидат, і прямокутник кандидата повністю включено в область.
- Після розширення області запиту на всю сторінку має бути отримано два кандидати, таким чином увійшовши у гілку неоднозначності.
Нарешті, перевірте нульові звернення до рядка, якого немає на сторінці. Це ближче до контракту, який вимагає реальний інтерфейс, ніж просто демонстрація успішного пошуку.
Виконуваний код: передайте кількість кандидатів абоненту
Залежність — pymupdf. Будь ласка, встановіть і заблокуйте версію в тестовому середовищі. Нижче наведений код не має доступу до мережі, не записує файли і не змінює існуючі клієнтські документи; він лише створює PDF для демонстрації.
import pymupdf
def locate(page, target, query):
query = pymupdf.Rect(query)
candidates = []
for word in page.get_text("words"):
x0, y0, x1, y1, text = word[:5]
box = pymupdf.Rect(x0, y0, x1, y1)
if text == target and query.contains(box):
candidates.append(tuple(box))
return candidates
def decide(candidates):
if len(candidates) == 0:
return "missing"
if len(candidates) > 1:
return "ambiguous"
return "unique"
with pymupdf.open() as doc:
page = doc.new_page(width=595, height=842)
page.insert_text((80, 120), "1,200.00", fontsize=11)
page.insert_text((80, 420), "1,200.00", fontsize=11)
query = pymupdf.Rect(72, 100, 300, 150)
local = locate(page, "1,200.00", query)
assert decide(local) == "unique"
assert query.contains(pymupdf.Rect(local[0]))
assert decide(locate(page, "1,200.00", page.rect)) == "ambiguous"
assert decide(locate(page, "999.99", query)) == "missing"
print("unique / ambiguous / missing cases passed")
contains вимагає повної включеності, а не лише дотику до краю зони. Якщо поле запиту занадто тісне, кількість на краю може впасти до нуля, що не є причиною автоматично розслабляти всю сторінку. Спочатку слід перевірити систему координат, що використовується для вимірювальної області, перш ніж вирішувати, як регулювати діапазон.
Якщо бізнес дозволяє центральній точці впасти всередину, тоді напишіть окреме правило і доповніть тести на перекриття меж. Не змінюйте таємно значення судження в межах однієї функції.
Логіка виробництва не повинна покладатися виключно на assert для блокування винятків, оскільки оптимізаційні шаблони можуть видаляти твердження. Твердження в прикладі використовуються для перевірок регресії; при справжньому доступі до черги завдань слід використовувати явні умовні гілки та бізнес-стани.
Три результати, три способи впоратися з цим
Результати запитів зазвичай поділяються на три категорії, кожна з яких вимагає різних дій обчислення:
- Лише один хіт: У регіоні є лише один повний відповідний фрагмент, збережений номер сторінки, оригінальний текст, прямокутник і версія правила.
- Zero Hit: Можливо, через неправильні регіони, розділення або відсутні шари тексту. Позначте причину як кандидатів, перевірте оригінальну сторінку і не заповнюйте нулі.
- Multiple Hits: Якщо в одній області є дублікати або шаблон змінився, поверніть усі кандидати, об'єднайте теги або вручну роз'ясніть неоднозначність.
Інші дві ситуації також потрібно розглядати окремо:
- Коробка, але неправильні значення: Сам текстовий шар може бути неправильним або відповідна цільова ціль неправильною; поверніться на оригінальну сторінку для перевірки і не дозволяйте підтверджувати координати числовими значеннями.
- Зсув коробки: Координати відображення та вилучення можуть бути змішаними, що вимагає чітких ланцюгів переходів для сівообороту, обрізки та масштабування рендерингу.
📊 Порівняння ядра
| Методи дослідження | Критерії визначення | Потрібна обережність |
|---|---|---|
| Повне включення (використаний приклад) | Кандидат-прямокутник повністю розміщується в області запиту | Якщо блок запиту занадто тугий, кількість на краю може бути нульовою |
| Центральна точка падає (правила потрібно писати окремо) | Точки центру кандидатів розташовані в межах регіону | Перекриття меж потребує окремого додаткового тестування |
| Пошук повних сторінок | Пошук усіх кандидатів | Більшість результатів є неоднозначними і потребують маркування або ручного подальшого оцінювання |
Це не універсальний екстрактор
Кодекс не розбирає валюту, тисячі сепараторів чи десяткових правил, а також не визнає семантики на кшталт «поточний період сплати» та «баланс попереднього періоду». Те, що є лише один кандидат, не означає, що бізнес має правильне значення.
Відсканована копія також має бути доступною за текстом і місцем розташування. Сторінки з текстовими шарами, але неправильним вмістом, не можуть бути дозволені лише тому, що їх можна копіювати.
У цій статті використовується сторінка твору без обертання. Коли реальна сторінка обертається, спочатку вкажіть, чи запит походить із екрану відображення або витягує координати, і конвертуйте лише за потреби. Не множте на матрицю незалежно від джерела.
При збереженні сторінок джерела розрізняйте індекси від нуля до нуля та номери сторінок, орієнтовані на людину, щоб уникнути помилкового уявлення, що доказів немає при перевірці сусідніх сторінок.
🎯 Який метод тобі підходить?
Якщо потрібно витягти дані з фіксованої форми макету
Спочатку обмежте область, де розташоване бізнес-поле, потім знайдіть суму і збережіть номер сторінки, прямокутник і версію правила.
Якщо ви зустрінете кількох кандидатів
Не обирайте перший варіант напряму; поверніть усіх кандидатів і визначайте бізнес-поля на основі тегів або ручного судження.
Якщо ваша сторінка часто стає нульовою
Спочатку перевірте, чи існують координати області, обсяг і шар тексту, а потім вирішіть, чи коригувати область видимості, чи перейти на інші маршрути вилучення.
Якщо хочеш перекладати документи
Ключові деталі, такі як сума, дата та кількість, включені у ручний огляд, з чітким розподілом обов'язків між технічним і ручним оглядом.
Залиште ключові номери для перегляду перекладу
Переклад документів має базуватися не лише на плавності речення, а й на ключових елементах, таких як сума, дата та кількість. OmniDoc (Запис продукту) надає кілька порталів для перекладу документів, а двомовне порівняння, представлене на офіційному сайті, може слугувати входною точкою для огляду; Скрипти координатного позиціонування підходять для збереження оригінальних доказів і допомоги у виявленні проблемних зон.
Рекомендується спочатку оцінити за допомогою зразка десенсибілізації, яку ви дозволили завантажувати. Оскільки переклад стає довшим, положення змісту може суттєво змінюватися, і «нова і стара координати абсолютно однакові» не слід вважати жорсткою умовою для правильного перекладу.
Більш цінними перевірками є: чи зберігається сума, чи чітко визначена валюта, і чи відповідна мітка все ще вказує на те саме бізнес-значення.
❓ Поширені запитання (FAQ)
1. Чому б просто не зробити перший удар?
Тому що повнотекстовий пошук може лише показати, де з'являється сума, і не може визначити, яка частина є бізнес-полем. Пряме взяття першого удару може здаватися правильним, але джерело може вже помилятися.
2. Чому поле запиту вимагає повного включення, а не просто торкнутися краю?
У прикладі використовується повністю включений метод визначення, щоб уникнути розглядання неповних сегментів як дійсних збігів. Якщо поле запиту надто вузьке і не викликає жодних збігів, спочатку перевірте координатну систему та діапазон, а не автоматично розширюйте всю сторінку.
3. Що робити, коли результат запиту дорівнює нулю?
Позначте кандидатську причину і перевірте оригінальну сторінку; не додавайте нулі. Неправильні регіони, розділені обсяги або відсутні шари тексту можуть призвести до нульових результатів.
4. Чи можна цей код безпосередньо використовувати для реальних рахунків?
Його не можна використовувати безпосередньо. Приклад не охоплює валюту, тисячний сепаратор чи бізнес-семантику, а зразок синтезу в цій статті не є тестом точності для реальних купюр.
📝 Резюме
При визначенні суми спочатку визначте площу, а потім надайте повну кількість кандидатів абоненту для оцінки. І нуль, і множинний результат повинні мати чіткі дії обробки. Спочатку використовуйте анксимізовані зразки для перевірки правил, а потім поступово інтегруйте реальні документи.
Досвід зараз: завантажте документ, щоб почати переклад, зберігаючи оригінальне форматування


