Виділіть слова для пошуку PDF, чому прямокутник обрамляє текст курсивом неправильно?
Курсивні шрифти не обов’язково роблять область шуканого Quad меншою за охоплюючий прямокутник. Якщо вам потрібно зберегти інформацію про напрямок чотирьох кутів, безпосередньо використовуйте результат 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 в один Rect, інакше семантика пробілу в середині буде втрачена.
- Зберігайте всі повернуті фрагменти Quad і малюйте виділення окремо.
2. Термін пошуку містить звичайні спеціальні символи
Якщо пошуковий термін містить звичайні спеціальні символи без їх екранування, результати можуть бути не такими, як очікувалося. Вхідний рядок має бути безпечно оброблений перед викликом.
3. Обрізка CropBox
Якщо сторінка обрізана CropBox, координати, які повертає search_for, усе ще базуються на неповернутому вихідному просторі сторінки. Після відновлення CropBox вам потрібно переконатися, що вміст усе ще знаходиться у видимій області. Ви не можете вважати, що get_text ігнорує область кадрування за замовчуванням.
Критерії прийняття та межі перевірки вручну
Це рішення вирішує лише проблему геометричного позиціонування. Наступні ситуації не стосуються вибору між Quad і Rect:
- Текстовий шар самого PDF-файлу пошкоджено;
- Ненормальне вбудовування шрифту;
- Є приховані шари.
У цих випадках результати search_for можуть взагалі не заслуговувати на довіру, і їх слід надіслати на перевірку вручну або повторно OCR. Зразок коду перевіряє лише геометричні властивості, а наскрізний ефект ще потрібно оцінити на основі конкретних типів документів.
Конкретні рішення щодо обробки винятків
| спостерігати | що робити | не слід робити висновок |
|---|---|---|
| Пошук без звернень | Перевірте текстовий шар і ключові слова | Не створюйте порожніх відблисків |
| Обертання тексту | Зберігайте чотири кути | Точність вгадування без різниці площ |
| Кілька ударів | Зберігайте номери сторінок по пунктах | Не займайтеся лише першим |
📊 Основне порівняння
| об'єкт | Інформація, яку можна зберегти | Застосовні сценарії | Варто зауважити |
|---|---|---|---|
| Quad | Чотири кути | Курсив, повернутий текст, вимагають точного виділення | Використовуйте результати quads=True безпосередньо |
| Rect (прямокутник, що оточує) | зовнішній діапазон | Просте виділення рамки для горизонтального тексту | Текст, виділений курсивом або повернутий, може вийти за межі рамки та не підходить для оцінки правильності. |
| Об’єднаний Rect | Загальний обсяг | Не рекомендується для міжстрокового пошуку | Семантика пробілу посередині буде втрачена |
🎯 Який спосіб вам підходить?
якщо ви...
- Потрібно зберегти чотирикутні напрямки тексту: безпосередньо використовуйте результати
quads=True, щоб додати виділення. - Якщо ви хочете використовувати порогове значення різниці площ, щоб визначити, чи правильне виділення: не робіть цього. Курсив не обов’язково зменшує область Quad.
- Зустрічаються перехресні лінії в пошуковому терміні: зберігайте всі фрагменти Quad, малюйте виділення окремо, не зливайте в один Rect.
- Обробка сторінок за допомогою кадрування CropBox: після відновлення CropBox переконайтеся, що вміст все ще знаходиться в зоні перегляду.
Використовуйте цей контрольний список для перекладу документа
Спочатку перевірте порядок сторінок, розташування джерела та цілісність тексту, а потім надішліть той самий десенсибілізований зразок до процесу перекладу. Після перекладу ще потрібно перевірити, чи коректно відповідають назва, текст та ілюстрації. Ви не можете просто перевірити, чи гладкий текст.
OmniDoc (портал продуктів) надає багатоформатний портал перекладу документів, а на офіційному веб-сайті представлені функції OCR, глосарій і двомовне порівняння. Для команд, які хочуть працювати безпосередньо з файлами, це шлях, який варто оцінити на прикладах із реального життя. Будь ласка, використовуйте десенсибілізовані файли, на завантаження яких у вас є дозвіл, і скористайтеся прапорцями в цій статті, щоб переглянути результати. Тут немає жодних тверджень, що OmniDoc використовує бібліотеки з відкритим кодом або внутрішні алгоритми, згадані в цій статті, і приклади не є заміною для тестування продуктивності продукту.
Посилання
❓ Часті запитання (FAQ)
1. Чи текст, виділений курсивом, однозначно зменшить площу Quad?
невизначений. Курсив не обов’язково робить область шуканого Quad меншою за охоплюючий прямокутник, тому ви не можете покладатися на різницю площ, щоб визначити, чи правильне виділення.
2. Коли слід зберігати інформацію про чотири кути?
Якщо вам потрібно зберегти інформацію про напрямок із чотирьох кутів, вам слід безпосередньо використовувати результати quads=True, щоб додати виділення.
3. Пошуковий термін перетинає рядки, і збігів не знайдено. Що мені робити?
Не створюйте порожні виділення, спочатку перевірте текстовий шар і ключові слова. Якщо повертаються лише деякі фрагменти, усі повернені фрагменти Quad мають бути збережені, а виділення намальовані окремо, замість того, щоб примусово поміщатися в один Rect.
4. На що слід звернути увагу, обрізаючи сторінку за допомогою CropBox?
Координати, які повертає search_for, усе ще базуються на неповернутому оригінальному просторі сторінки. Після відновлення CropBox вам потрібно переконатися, що вміст усе ще знаходиться у видимій області. Ви не можете вважати, що get_text ігнорує область кадрування за замовчуванням.
📝 Підсумок
Виділення курсиву та оберненого тексту має базуватися на Quad, а номери сторінок і інформацію про чотири кути слід зберігати поелементно. Такі проблеми, як пошкодження текстового шару та ненормальне вбудовування шрифту, усе ще потребують перегляду вручну або повторного OCR.


