Выделите поисковые слова PDF. Почему прямоугольник неправильно обрамляет текст, выделенный курсивом?

Курсивные шрифты не обязательно делают область искомого квадрата меньше, чем охватывающий прямоугольник. Если вам нужно сохранить информацию о направлении четырех углов, напрямую используйте результат quads=True, чтобы добавить подсветку; не используйте пороговое значение разницы площадей, чтобы определить правильность выделения.

Когда поле выделения при поиске курсивного текста перекошено, это часто происходит не из-за проблемы с самим шрифтом, а из-за того, что геометрический объект, используемый для выделения, выбран неправильно. Эта статья предназначена для разработчиков, использующих PyMuPDF для обработки позиционирования текста PDF. В нем объясняется, почему охватывающий прямоугольник (Rect) нельзя использовать для определения правильности выделения курсивного или повернутого текста и как с этим обращаться в различных ситуациях.

Прочитав эту статью, вы сможете решить, использовать ли Quad или Rect для результатов поиска, узнать, как обрабатывать отсутствие попаданий, перекрестные строки, множественные попадания и обрезку CropBox при поиске, а также понять, какие проблемы выходят за рамки геометрического позиционирования.

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

Для выделения курсивного текста при поиске выберите Quad или Rect? Вывод в одно предложение

Курсивный шрифт не обязательно делает область Quad, полученную в результате поиска, меньше окружающего прямоугольника. Если необходимо сохранить информацию о четырехугольном направлении, используйте результаты quads=True напрямую, чтобы добавить блики. Не используйте пороговое значение разницы площадей, чтобы определить правильность выделения.

твоя ситуацияРекомендуемые практикипричина
Курсив или повернутый текст, ориентация по четырем углам должна быть сохранена.Используйте результаты quads=True напрямую, чтобы добавить основные моменты.Quad сохраняет информацию об ориентации по четырем углам.
Я хочу использовать порог разницы площадей, чтобы определить правильность выделения.не делай этогоКурсив не обязательно уменьшает область Quad, и оценка порога ненадежна.
Условия поиска занимают несколько строк, и система не распознает их как одну и ту же словарную единицу.Сохраняйте все возвращенные фрагменты Quad и рисуйте блики индивидуально.Принудительное слияние с Rect приведет к потере семантики пустого пространства посередине.
На странице есть обрезка CropBox.Убедитесь, что содержимое все еще находится в видимой области после восстановления CropBox.Координаты, возвращаемые search_for, основаны на не повернутом исходном пространстве страницы, и нельзя предполагать, что get_text по умолчанию игнорирует обрезанную область.
Несколько попаданийСохраняйте номера страниц поэлементно и обрабатывайте их одну за другой.Только обработка первой пропустит остальные позиции

Почему курсив отображается неправильно?

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

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

Пример автономной композиции

См. список импорта для примера зависимостей. Код создает входные данные в памяти и не требует для запуска внешних файлов. Протоколы операций предоставляются отдельно и не являются гарантией подлинности всех документов.

import pymupdf
with pymupdf.open() as source:
    page = source.new_page(width=300, height=300)
    page.insert_text((100, 250), "Searchable", fontsize=14, rotate=90)
    hits = page.search_for("Searchable", quads=True)
    assert len(hits) == 1
    assert isinstance(hits[0], pymupdf.Quad)
    page.add_highlight_annot(hits)
    assert page.search_for("Missing", quads=True) == []
    raw = source.tobytes()
with pymupdf.open(stream=raw, filetype="pdf") as doc:
    page = doc[0]  # Keep the owning page alive while using annotations.
    annotations = list(page.annots())
    assert len(annotations) == 1
    assert len(annotations[0].vertices) == 4

Правильная обработка вывода и граничного ввода

В приведенном выше синтетическом примере создается PDF-файл в памяти, который используется для проверки поведения Quad. Ниже приведены несколько общих граничных входных данных.

1. Слова поиска занимают несколько строк.

Если поисковый запрос охватывает символы новой строки и система не распознает его как одну и ту же словарную единицу, search_for может вернуть пустой список или соответствовать только частичным фрагментам.

— Не объединяйте принудительно несколько несмежных квадратов в один прямоугольник, иначе семантика белого пространства в середине будет потеряна.

  • Сохраняйте все возвращенные фрагменты Quad и рисуйте блики отдельно.

2. Поисковые запросы содержат регулярные специальные символы

Если в поисковом запросе есть обычные специальные символы, но он не уходит, результаты могут не соответствовать ожиданиям. Перед вызовом входная строка должна быть надёжно обработана.

3. CropBox Crop

Если страница имеет обрезку CropBox, координаты, возвращаемые search_for, по-прежнему основаны на не повернутом исходном пространстве страницы. После восстановления CropBox вам необходимо убедиться, что содержимое все еще находится в видимой области. Вы не можете предполагать, что get_text по умолчанию игнорирует область обрезки.

Критерии приема и границы ручной проверки

Это решение решает только задачу геометрического позиционирования. Следующие ситуации не подпадают под вопрос выбора Quad против Rect:

  • Повреждение текстового слоя самого PDF;
  • Аномалии вложения шрифтов;
  • Наличие скрытых слоёв.

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

Конкретные решения по управлению исключениями

НаблюдениеЧто нужно делатьи не должен быть осуждён
Поиск не дал результатовПроверьте текстовый слой и ключевые словаПустые выделения не создаются
Вращать текстСохранить четыре угла QuadУгадывание точности без использования разницы площадей
и во многих местах попал в точкуКаждый элемент должен сохраняться с номерами страницНе смирись только с первым

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

ЦельИнформация, которую можно сохранитьПрименимые сценарииПримечания
QuadЧетыре углаКурсивный и вращающийся текст требуют точного выделенияНапрямую используйте результаты quads=True
Прямоугольник (внешний прямоугольник)Внешний контактный диапазонПростой выбор горизонтального текстаКурсивный или вращающийся текст может быть вне коробки и не подходит для проверки точности
Объединённые RectОбщий охватНе рекомендуется для кросс-линейного поискаЭто теряет смысл пустых областей посередине

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

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

  • Текстовые углы нужно сохранять: Напрямую используйте результаты quads=True для добавления подсветок.
  • Хотите оценить, правильно ли выделение по порогу разницы площади: Не делайте этого; курсивные шрифты не обязательно уменьшают квадратную площадь.
  • Если вы столкнётесь с поисковыми запросами, пересекающими границы: Оставьте все сегменты Quad, выделяйте их отдельно и не объединяйте в один Rect.
  • Обработка страниц с обрезкой cropBox: После восстановления CropBox убедитесь, что содержимое всё ещё находится в видимой области.

Используйте этот чек-лист для перевода документов

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

OmniDoc (запись продукта) предоставляет многоформатные порталы для перевода документов, а её официальный сайт предлагает OCR, терминологию и билингвальные справочные функции. Для команд, которые хотят начинать напрямую с файлов, этот путь стоит оценивать с помощью реальных образцов. Пожалуйста, используйте анонимный файл, который вы разрешили загрузить, и проверьте результаты с помощью чек-листа в этой статье. Это не утверждает, что OmniDoc использует открытые библиотеки или внутренние алгоритмы, упомянутые в этой статье, и примеры не заменяют тестирование производительности продукта.

Ссылки

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

1. Обязательно ли курсивный текст уменьшает площадь квадрата?

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

2. Когда следует сохранять информацию о четырёх углах Quad?

Если вам нужно сохранить информацию о направлении для четырёх углов, напрямую используйте результаты quads=True для добавления подсветки.

3. Что делать, если ваш поисковый запрос пересекает границы и не попадает в цель?

Не создавайте пустые выделения; сначала проверьте текстовый слой и ключевые слова. Если возвращается только часть сегмента, все возвращённые сегменты Quad следует сохранять и выделять отдельно, а не насильно объединять их в один Rect.

4. На странице есть CropBox. На что стоит обращать внимание при резке?

Координаты, возвращаемые search_for, по-прежнему основаны на исходном пространстве страницы, которое не было повернуто. После восстановления CropBox нужно проверить, остаётся ли содержимое внутри линии просмотра; нельзя предполагать, что get_text по умолчанию игнорирует область обрезки.

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

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

Бесплатная скачать настольную версию OmniDoc: обрабатывайте документы, таблицы, презентации и PDF в одном месте

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