Как получить сумму в 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 для перехвата исключений, поскольку режимы оптимизации могут удалять утверждения. Утверждения в примере используются для регрессионной проверки. При фактическом доступе к очереди задач следует использовать четкие условные переходы и бизнес-состояния.
Три результата, три метода обработки
Результаты запроса обычно делятся на три категории, каждая из которых требует различных действий по обработке:
- Только одно попадание: в области имеется только один полный совпадающий фрагмент, при этом сохраняется номер страницы, исходный текст, прямоугольник и версия правила.
- Нулевое попадание: возможно, область выбрана неправильно, сумма разделена или текстовый слой отсутствует. Отметьте кандидата на причину, проверьте исходную страницу и не добавляйте нули.
- Несколько обращений: в одной области имеются повторяющиеся суммы или шаблон изменился, верните всех кандидатов, объедините ярлыки или устраните неоднозначность вручную.
Две другие ситуации также необходимо рассматривать отдельно:
- Рамок есть, но неверное значение: сам текстовый слой может быть неправильным или совпадающий целевой объект неверен. Вам следует вернуться на исходную страницу, чтобы проверить и предотвратить подтверждение координатами значения.
- Смещение кадра: координаты отображения и координаты извлечения могут быть смешанными, а цепочка преобразования вращения, обрезки и масштабирования рендеринга должна быть четкой.
📊 Сравнение ядра
| Метод запроса | Критерии оценки | нужно внимание |
|---|---|---|
| Полное включение (пример принят) | Прямоугольник-кандидат полностью попадает в область запроса. | Если поле запроса слишком узкое, боковая сумма может иметь нулевое количество совпадений. |
| Центральная точка падает (нужно написать еще одно правило) | Центральная точка кандидата попадает в регион | Перекрытие границ требует отдельного тестирования. |
| Полный запрос страницы | Искать всех кандидатов | Результаты по большей части неоднозначны и требуют дальнейшей маркировки или ручной оценки. |
Это не универсальный экстрактор сумм
Код не анализирует валюту, разделители тысяч или десятичные правила, а также не распознает такие семантики, как «подлежащее оплате в этом периоде» и «остаток в предыдущем периоде». Тот факт, что есть только один кандидат, не означает, что бизнес-смысл верен.
На скане также сначала должен быть доступен текст и местоположение. Страницы с текстовым слоем, но с неправильным содержанием не могут быть опубликованы просто потому, что их можно скопировать.
В этой статье используются не повернутые синтетические страницы. При повороте реальной страницы следует сначала указать, исходит ли поле запроса с экрана дисплея или из извлеченных координат, а затем при необходимости преобразовать его. Не умножайте на матрицу независимо от источника.
При сохранении исходных страниц вам также следует различать индексы, начинающиеся с нуля, и номера страниц, ориентированные на человека, чтобы рецензенты ошибочно не подумали, что доказательства не существуют после открытия соседних страниц.
🎯 Какой метод подходит вам?
Если вам нужно получить числа из формы с фиксированным макетом
Сначала ограничьте область, в которой находится бизнес-поле, затем найдите сумму и сохраните номер страницы, прямоугольник и версию правила.
Если вы столкнулись с несколькими кандидатами
Не принимайте первого напрямую, верните всех кандидатов и определите сферы бизнеса на основе ярлыков или суждений вручную.
Если ваша страница часто не имеет посещений
Прежде чем принять решение о корректировке диапазона или использовании другого маршрута извлечения, проверьте координаты области, разделена ли сумма и существует ли текстовый слой.
Если вы хотите выполнить перевод документов
Включите ключевое содержание, такое как сумма, дата, количество и т. д., в ручную проверку и обеспечьте четкое разделение труда между технической проверкой и ручной проверкой.
Оставьте ключевые цифры для проверки после перевода
Перевод документа зависит не только от того, являются ли предложения гладкими, но и ключевое содержание, такое как сумма, дата и количество, должно быть подтверждено одно за другим. OmniDoc (портал продуктов) предоставляет порталы для перевода различных документов. Двуязычное сравнение, представленное на официальном сайте, можно использовать в качестве обзорного портала; сценарий позиционирования координат подходит для сохранения исходных текстовых данных и помогает обнаружить проблемные области.
Рекомендуется сначала использовать десенсибилизированные образцы, которые у вас есть разрешение на загрузку для оценки. Когда перевод становится длиннее, положение контента может существенно измениться. «Старые и новые координаты совершенно одинаковы» не может рассматриваться как жесткое условие правильного перевода.
Более ценные проверки: сохранена ли сумма, ясна ли валюта и указывает ли соответствующая этикетка на то же деловое значение.
❓ Часто задаваемые вопросы (FAQ)
1. Почему бы просто не принять первый удар?
Поскольку полнотекстовый поиск может указать только то, где появляется сумма, он не может определить, в каком месте находится поле деятельности. Просто сделайте первый удар, и результат может выглядеть правильно, но источник может быть неправильным.
2. Почему поле запроса должно быть полностью включено, а не просто касаться края?
В примере используется метод определения полного включения, чтобы избежать обработки неполных фрагментов как допустимых совпадений. Если поле запроса слишком узкое и приводит к нулевому результату, сначала следует проверить систему координат и диапазон, а не автоматически расширять его до всей страницы.
3. Что делать, если результат запроса равен нулю?
Отметьте кандидатов на причину и проверьте исходную страницу без заполнения нулями. Неправильные области, разделенные суммы или отсутствующие текстовые слои могут привести к нулевому совпадению.
4. Можно ли использовать этот код напрямую для реальных счетов?
Его нельзя использовать напрямую. Примеры не связаны с валютой, разделителями тысяч и бизнес-семантикой, а синтетические примеры в этой статье не представляют собой проверку точности реальных купюр.
📝 Резюме
При определении суммы сначала ограничьте территорию, а затем передайте на суд звонящему все количество кандидатов. Должны быть предусмотрены четкие действия по обработке для нулевых и множественных попаданий. Сначала используйте десенсибилизированные образцы для проверки правил, а затем постепенно получайте доступ к реальным документам.
Попробуйте сейчас: загрузите документ, чтобы начать перевод, сохранив исходный макет.


