Zaznacz wyszukiwane słowa w pliku PDF. Dlaczego prostokąt nieprawidłowo obramowuje tekst kursywą?
Kursywa niekoniecznie powoduje, że obszar szukanego Quada jest mniejszy niż otaczający go prostokąt. Jeśli chcesz zachować informacje o kierunku czterech narożników, użyj bezpośrednio wyniku quads=True, aby dodać podświetlenie; nie używaj żadnego progu różnicy obszarów w celu ustalenia, czy podświetlenie jest prawidłowe.
Kiedy pole wyróżnienia wyszukiwania tekstu pisanego kursywą jest przekrzywione, często dzieje się tak nie dlatego, że występuje problem z samą czcionką, ale dlatego, że obiekt geometryczny używany do podświetlania jest błędnie wybrany. Ten artykuł jest przeznaczony dla programistów korzystających z PyMuPDF do przetwarzania pozycjonowania tekstu PDF. Wyjaśnia, dlaczego prostokąt otaczający (Rect) nie może zostać użyty do określenia, czy podświetlanie tekstu pochylonego lub obróconego jest prawidłowe, i jak sobie z tym poradzić w różnych sytuacjach.
Po przeczytaniu tego artykułu możesz zdecydować, czy w wynikach wyszukiwania używać Quad czy Rect, wiedzieć, jak radzić sobie z brakiem trafień, krzyżowaniem wierszy, wieloma trafieniami i przycinaniem CropBox podczas wyszukiwania, a także zrozumieć, które problemy wykraczają poza zakres pozycjonowania geometrycznego.
Pełny tekst jest pokazany na syntetycznych próbkach, a kod przeszedł pomyślnie testy w odizolowanym środowisku, ale nie gwarantuje to wszystkich rzeczywistych plików lub efektów produktu. Przed przetwarzaniem ważnych dokumentów prosimy o zachowanie oryginałów, a następnie zapoznanie się z nimi zgodnie z poniższymi granicami i punktami akceptacji.
Aby wyróżnić tekst kursywą, wybierz opcję Quad lub Rect? Wniosek w jednym zdaniu
Kursywa niekoniecznie powoduje, że obszar Quad uzyskany w wyniku wyszukiwania jest mniejszy niż otaczający go prostokąt. Jeśli konieczne jest zachowanie informacji o kierunku czterech narożników, bezpośrednio użyj wyników quads=True, aby dodać światła. Nie używaj żadnego progu różnicy obszarów w celu ustalenia, czy podświetlenie jest prawidłowe.
| twoja sytuacja | Zalecane praktyki | powód |
|---|---|---|
| Tekst kursywą lub obrócony; należy zachować orientację czterech narożników | Bezpośrednio użyj wyników quads=True, aby dodać najważniejsze momenty | Quad zachowuje informacje o orientacji w czterech narożnikach |
| Chcę użyć progu różnicy obszarów, aby określić, czy podświetlanie jest prawidłowe. | nie rób tego | Kursywa niekoniecznie zmniejsza obszar Quad, a ocena progu jest zawodna. |
| Wyszukiwane hasła rozciągają się w różnych wierszach i silnik nie rozpoznaje ich jako tej samej jednostki słownictwa. | Zachowaj wszystkie zwrócone fragmenty Quada i rysuj podświetlenia indywidualnie | Wymuszone połączenie z Rect spowoduje utratę semantyki białej przestrzeni pośrodku. |
| Strona posiada przycięcie CropBox | Po przywróceniu pola CropBox sprawdź, czy zawartość nadal znajduje się w widocznym obszarze | Współrzędne zwrócone przez search_for opierają się na nieobróconym obszarze strony oryginalnej i nie można zakładać, że get_text domyślnie ignoruje przycięty obszar |
| Wiele trafień | Zapisuj numery stron element po elemencie i przetwarzaj je jeden po drugim | Dopiero przetworzenie pierwszego spowoduje pominięcie pozostałych pozycji |
Dlaczego tekst kursywy jest wyświetlany nieprawidłowo?
Wiele osób domyślnie zakłada, że prostokąt otaczający znaki kursywy jest znacznie większy niż Quad, więc użycie Rect do podświetlenia spowoduje „odchylenie ramki". Tak naprawdę czcionka kursywa niekoniecznie powoduje, że obszar przeszukiwanego kwadratu jest mniejszy niż otaczający go prostokąt, dlatego nie można polegać na różnicy obszaru w celu oceny, czy podświetlenie jest prawidłowe.
Naprawdę potrzebne jest zachowanie informacji o orientacji czterech rogów. Tak się składa, że Quad rejestruje te informacje i użycie ich do bezpośredniego dodania podświetleń jest bardziej niezawodne niż użycie otaczającego prostokąta do odgadnięcia kształtu.
Przykład samodzielnej kompozycji
Zobacz listę importów, na przykład zależności. Kod konstruuje dane wejściowe w pamięci i nie wymaga do działania plików zewnętrznych. Zapisy operacyjne są dostarczane oddzielnie i nie stanowią gwarancji, że wszystkie dokumenty są autentyczne.
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
Poprawne przetwarzanie danych wyjściowych i wejściowych
Powyższy syntetyczny przykład generuje plik PDF w pamięci, który służy do weryfikacji zachowania Quada. Poniżej znajduje się kilka typowych danych wejściowych granic.
1. Wyszukiwane słowa obejmują różne linie
Jeśli wyszukiwane hasło obejmuje znaki nowej linii i silnik nie rozpoznaje go jako tej samej jednostki słownikowej, funkcja search_for może zwrócić pustą listę lub dopasować tylko częściowe fragmenty.
- Nie łącz na siłę wielu niesąsiadujących ze sobą kwadratów w jeden prostokąt, w przeciwnym razie semantyka białej przestrzeni pośrodku zostanie utracona.
- Zachowaj wszystkie zwrócone fragmenty Quada i narysuj najważniejsze fragmenty osobno.
2. Wyszukiwane hasło zawiera zwykłe znaki specjalne
Jeśli wyszukiwane hasło zawiera zwykłe znaki specjalne bez zmiany znaczenia, wyniki mogą nie być zgodne z oczekiwaniami. Ciąg wejściowy powinien zostać bezpiecznie przetworzony przed wywołaniem.
3. Przycinanie CropBoxa
Jeśli strona ma przycięcie CropBox, współrzędne zwrócone przez search_for nadal są oparte na nieobróconym oryginalnym obszarze strony. Po przywróceniu CropBox musisz sprawdzić, czy zawartość nadal znajduje się w widocznym obszarze. Nie można założyć, że get_text domyślnie ignoruje obszar przycięcia.
Kryteria akceptacji i granice ręcznego przeglądu
To rozwiązanie rozwiązuje jedynie problem pozycjonowania geometrycznego. Następujące sytuacje nie podlegają wyborowi pomiędzy Quad i Rect:
- Warstwa tekstowa samego pliku PDF jest uszkodzona;
- Nieprawidłowe osadzanie czcionek;
- Istnieją ukryte warstwy.
W takich przypadkach wyniki search_for mogą w ogóle nie być wiarygodne i należy je poddać ręcznemu przeglądowi lub ponownemu OCR. Przykładowy kod weryfikuje jedynie właściwości geometryczne, a całościowy efekt nadal wymaga oceny w oparciu o określone typy dokumentów.
Konkretne decyzje dotyczące obsługi wyjątków
| przestrzegać | co robić | nie należy wnioskować |
|---|---|---|
| Poszukiwania nie przyniosły rezultatów | Sprawdź warstwę tekstową i słowa kluczowe | Nie tworzą się pustych podświetleń |
| Obróć tekst | Zachowaj cztery rogi Quad | Zgadywanie dokładności poprzez nieużywanie różnic powierzchni |
| i trafił w sedno w wielu miejscach | Każdy element powinien być zachowany pod numerem stron | Nie zajmuj się tylko pierwszym |
📊 Porównanie rdzenia
| Cel | Informacje, które można zachować | Dostępne scenariusze | Przypisy |
|---|---|---|---|
| Quad | Cztery rogi | Kursywa i obracanie tekstu wymagają precyzyjnego podświetlania | Bezpośrednio wykorzystaj wyniki quads=True |
| Rect (prostokąt zewnętrzny) | Zasięg styków zewnętrznych | Prosty wybór tekstu poziomego | Tekst kursywy lub obracania może być poza ramą i nieodpowiedni do sprawdzania dokładności |
| Połączony Rect | Ogólny zakres | Nie zaleca się do wyszukiwania międzyliniowego | To straci znaczenie pustych obszarów pośrodku |
🎯 Która metoda ci odpowiada?
Jeśli ......
- Należy zachować narożniki tekstu: Bezpośrednio użyj wyników
quads=Truedo dodawania podświetleń. - Chcę ocenić, czy podświetlanie jest poprawne na podstawie progu różnicy obszarów: Nie rób tego; czcionki kursywą niekoniecznie zmniejszają powierzchnię quad.
- Jeśli napotkasz przecięcie się przez linie haseł: zachowaj wszystkie segmenty Quad, zaznacz je osobno i nie łącz ich w jeden Rect.
- Obsługa stron przy przycinaniu CropBox: Po przywróceniu CropBox sprawdź, czy treść nadal znajduje się w obszarze widocznym.
Użyj tej listy kontrolnej do tłumaczenia dokumentów
Najpierw dokładnie sprawdź kolejność stron, lokalizację źródła i integralność tekstu, a następnie przekaż tę samą zanonimizowaną próbkę procesowi tłumaczeniowemu. Po tłumaczeniu nadal konieczne jest sprawdzenie, czy tytuł, główny tekst i podpisy prawidłowo się zgadzają; nie wystarczy oceniać tylko na podstawie płynności tekstu.
OmniDoc (wpis produktu) oferuje wieloformatowe portale tłumaczeniowe dokumentów, a jego oficjalna strona internetowa wprowadza OCR, terminologię oraz funkcje dwujęzyczne. Dla zespołów, które chcą zacząć bezpośrednio od plików, jest to ścieżka warta oceny na podstawie rzeczywistych próbek. Prosimy o użycie zanonimizowanego pliku, który uznałeś, aby przesłać i zweryfikować wyniki za pomocą listy kontrolnej opisanej w tym artykule. Nie oznacza to, że OmniDoc korzysta z bibliotek open-source ani wewnętrznych algorytmów wymienionych w tym artykule, ani nie zastępują tych przykładów testów wydajności produktu.
Bibliografia
❓ Najczęściej zadawane pytania (FAQ)
1. Czy tekst kursywy koniecznie zmniejsza obszar kwadratu?
Niekoniecznie. Glify kursywy niekoniecznie dają mniejszą powierzchnię czworokątną niż zewnętrzny prostokąt, więc nie można polegać na różnicach powierzchni, by określić, czy podświetlenie jest poprawne.
2. Kiedy należy przechowywać informacje o czterech narożnikach Quadu?
Jeśli musisz zachować informacje o kierunku dla czterech rogów, powinieneś bezpośrednio użyć wyników quads=True do dodania podświetleń.
3. Co powinieneś zrobić, jeśli Twoje hasło wyszukiwania przekracza granice i nie trafia w sedno?
Nie twórz pustych podkreśleń; najpierw sprawdź warstwę tekstową i słowa kluczowe. Jeśli zwracana jest tylko część segmentu, wszystkie zwrócone segmenty Quad powinny być zachowane i podświetlone osobno, zamiast przymusowo łączyć się w jeden Rect.
4. Strona zawiera CropBox. Na co powinieneś zwrócić uwagę podczas cięcia?
Współrzędne zwracane przez search_for nadal opierają się na oryginalnej przestrzeni strony, która nie została obrócona. Po przywróceniu CropBox musisz sprawdzić, czy zawartość nadal znajduje się w linii widoku; nie możesz zakładać, że get_text domyślnie ignoruje obszar przycinania.
📝 Podsumowanie
Podświetlanie kursywą i obracanie tekstu powinno być oparte na Quad, a numery stron i informacje o narożnikach powinny być zachowane dla każdego elementu. Problemy takie jak uszkodzenie warstwy tekstowej czy nieprawidłowe osadzanie czcionek nadal wymagają ręcznej weryfikacji lub ponownego OCR.


