Co powinienem zrobić, jeśli mogę kliknąć stronę spisu treści pliku PDF, ale po wyodrębnieniu tracę poziom?
Przed zapisaniem należy sprawdzić hierarchię zakładek. Pierwszy przedmiot to jeden poziom, kolejne można podnieść maksymalnie o jeden poziom; przykład odrzuca nielegalne poziomy i numery stron spoza zakresu i nie zmienia automatycznie poziomu w celu sfałszowania struktury katalogów. Numery stron zakładek zaczynają się od jednego, a indeksy stron zwykle zaczynają się od zera.
Stronę spisu treści pliku PDF można normalnie przekierować w czytniku, ale po wyodrębnieniu za pomocą skryptu hierarchia może być płaska, numery stron mogą być źle umieszczone, a nawet indeks może być nieprawidłowy. Tego typu problemy są częste podczas łączenia zeskanowanych plików lub plików o nieregularnej strukturze zakładek. Jeśli wyniki ekstrakcji zostaną bezpośrednio przekazane dalszym użytkownikom, mogą wystąpić błędy w segmentacji tłumaczeń i łączeniu.
Ten artykuł jest przeznaczony dla programistów i zespołów zajmujących się dokumentacją, którzy muszą przetwarzać wsadowo katalogi PDF. Po przeczytaniu można zrozumieć znaczenie zwracanej wartości get_toc(), opanować zasady weryfikacji poziomów i numerów stron oraz wiedzieć, które sytuacje należy zamienić na weryfikację ręczną. W tym artykule wykorzystano próbkę syntetyczną, aby zademonstrować metodę przetwarzania, a kod został sprawdzony przez próbkę w izolowanym środowisku, ale nie gwarantuje to wszystkich rzeczywistych plików lub efektów produktu. Przed przystąpieniem do przetwarzania ważnych dokumentów prosimy o zachowanie oryginałów i zapoznanie się z nimi zgodnie z granicami i pozycjami akceptacji w tekście.
Co powinienem zrobić, jeśli można kliknąć stronę spisu treści w formacie PDF, ale po wyodrębnieniu hierarchia zostaje utracona? Wniosek w jednym zdaniu
Najpierw sprawdź, a potem pisz: Najpierw należy sprawdzić poziom zakładki, za pierwszy poziom uważa się pierwszą pozycję, kolejne poziomy nie powinny przekraczać pozycji poprzedniej plus jeden, a wpisy z numerami stron spoza zakresu nie będą zapisywane.
| twoja sytuacja | Zalecane praktyki | powód |
|---|---|---|
| Można kliknąć stronę katalogu, a po wyodrębnieniu hierarchia jest płaska lub źle wyrównana. | Najpierw użyj get_toc(), aby uzyskać oryginalną listę, a następnie sprawdź ją jeden po drugim przed jej użyciem. | Oryginalna lista zwrócona przez get_toc() nie ma uporządkowanej weryfikacji |
| Numer strony wynosi 0 lub przekracza całkowitą liczbę stron | Odrzuć wpis i zaloguj się | Numery stron spoza zakresu spowodują niepowodzenie skoku |
get_toc() zwraca pustą listę | Zamiast tego użyj analizy układu tekstu i nie próbuj na ślepo | Plik może nie mieć osadzonych metadanych zakładek |
| Ten sam tytuł odpowiada wielu różnym numerom stron | Oznacz jako niejednoznaczne, przejdź do weryfikacji ręcznej | Nie można automatycznie określić, który numer strony jest prawidłowy |
Dlaczego wynik ekstrakcji traci poziomy?
get_toc() domyślnie wysyła listę trójek [level, title, page]. Wśród nich page to fizyczny numer strony zaczynający się od 1, a level reprezentuje jedynie głębokość zagnieżdżenia i nie gwarantuje ciągłości ani legalności.
Jeśli źródłowy plik PDF został wygenerowany za pomocą narzędzia do scalania skanowania, typowe problemy obejmują:
- Skok poziomu: Na przykład przeskocz bezpośrednio z 1 na 3
- Wyjątek dotyczący numeru strony: Numer strony wynosi 0 lub przekracza całkowitą liczbę stron
- Wyjątek tytułu: Tytuł zawiera znaki sterujące
Jeśli zostanie użyte bezpośrednio do dalszych zadań, spowoduje zamieszanie w segmentach tłumaczenia lub awarię łącza. Co bardziej podstępne, niektóre pliki PDF zawierają wizualny spis treści, ale nie zawierają osadzonych metadanych zakładek. To normalne, że get_toc() zwraca w tym momencie pustą listę i zamiast tego należy zastosować analizę układu tekstu.
Przykład samodzielnej kompozycji
Zobacz listę importów, na przykład zależności. Kod tworzy dane wejściowe w pamięci, a rekordy uruchamiania są dostarczane osobno i nie stanowią gwarancji istnienia wszystkich rzeczywistych plików.
import pymupdf
def validate(rows, pages):
previous = 0
for level, title, page in rows:
if type(level) is not int or level < 1 or level > previous + 1:
raise ValueError("invalid hierarchy")
if type(page) is not int or not 1 <= page <= pages:
raise ValueError("invalid destination")
if not isinstance(title, str) or not title.strip():
raise ValueError("empty title")
previous = level
return rows
with pymupdf.open() as doc:
for _ in range(3):
doc.new_page()
rows = [[1, "Chapter", 1], [2, "Section", 2], [1, "Appendix", 3]]
doc.set_toc(validate(rows, doc.page_count))
assert doc.get_toc() == rows
assert len(doc.get_toc()) == 3
for bad in [[[2, "Bad", 1]], [[1, "Bad", 99]], [[1, "", 1]]]:
try:
validate(bad, doc.page_count)
except ValueError:
pass
else:
raise AssertionError("invalid outline accepted")
Reguły przetwarzania danych wejściowych zgodnych z prawem i nielegalnych
Prawidłowe wprowadzenie powinno spełniać: listę trójek z ciągłymi poziomami i numerami stron z zakresu [1, doc.page_count]. Na przykład [[1, "引言", 1], [2, "背景", 2], [1, "方法", 5]] jest legalny, drugi poziom pojawia się po pierwszym poziomie i jest zgodny ze składnią konspektu PDF.
Typowe nieprawidłowe dane wejściowe obejmują:
- Poziom wynosi 0 lub jest ujemny
- Numer strony to 0
- Liczba stron przekracza całkowitą liczbę stron
- Tytuł jest pustym ciągiem znaków lub zawiera tylko białe znaki
W takich sytuacjach metody podane w artykule są następujące:
- Pomiń wpisy z nieprawidłowymi numerami stron i zarejestruj ostrzeżenie.
- Zachowaj symbole zastępcze, takie jak
[untitled]dla pustych tytułów, aby zachować integralność strukturalną. - Nie przerywaj analizowania całego katalogu z powodu pojedynczego błędu.
Jeśli chodzi o przypadek, gdy poziom jest mniejszy niż 1, należy pamiętać o dwóch strategiach: podsumowująca część przykładu opowiada się za odrzuceniem nielegalnych poziomów i nie korygowaniem ich automatycznie, podczas gdy opis zasady w artykule ma na celu wymuszenie wartości 1. Wybierz jedną z nich zgodnie ze swoim procesem. Należy również pamiętać, że zasady te mają na celu zapewnienie niezawodności dalszych procesów i nie są obowiązkowymi wymaganiami standardu PDF. Rzeczywiste testy wykazały, że gdy numer strony przekroczy granicę, PyMuPDF wydrukuje ostrzeżenie, ale nie zgłosi wyjątku. Dlatego funkcja weryfikacji musi aktywnie filtrować i nie może polegać na zachowaniu biblioteki.
📊 Porównanie rdzeni
W różnych sytuacjach związanych z dokumentami wyniki i sugerowane metody przetwarzania get_toc() są różne:
| Dokumentacja | Wyniki get_toc() | Zalecane leczenie |
|---|---|---|
| Są zakładki i struktura jest legalna | Zwraca listę trójek | Użyj bezpośrednio po weryfikacji |
| Istnieją zakładki, ale poziom lub numer strony są nieprawidłowe | Zwraca listę zawierającą elementy wyjątków | Filtruj i zapisuj logi, w razie potrzeby przełącz na tryb ręczny |
| Wizualnie znajduje się spis treści, ale nie ma zakładek | Zwróć pustą listę | Zamiast tego użyj analizy układu tekstu |
| EPUB i inne dokumenty przepływu | Format numeru strony to (rozdział, pno) | Ta logika weryfikacji numeru strony nie ma zastosowania i wymaga specjalnego przetwarzania. |
Kryteria akceptacji i granice ręcznego przeglądu
Poniższa tabela skupia się wyłącznie na wyodrębnianiu metadanych katalogu PDF:
| Obserwuj zjawiska | decyzja o przetwarzaniu | Czy automatyzacja ma zastosowanie |
|---|---|---|
| Numer strony wynosi 0 lub jest większy niż całkowita liczba stron | Odrzuć wpis i zarejestruj go | Tak |
| Poziom jest mniejszy niż 1 lub nie jest liczbą całkowitą | Postępuj zgodnie z powyższymi zasadami (patrz poprzednie instrukcje) | Tak |
| Tytuł zawiera całkowicie puste lub czyste symbole | Zamień na [untitled] | Tak |
| Skok poziomu (np. z 1 na 3) | Zachowaj oryginalną warstwę i nie dodawaj warstw pośrednich | Tak (struktura jest legalna) |
| Ten sam tytuł odpowiada wielu różnym numerom stron | Oznacz jako niejednoznaczne, przenieś do podręcznika | NIE |
| Liczba wejść przekracza 200 i nie następuje zmiana poziomu | W przypadku podejrzenia błędnego rozpoznania OCR wymagana jest ręczna weryfikacja. | NIE |
| Zawiera zewnętrzny identyfikator URI lub akcję JavaScript | Filtruj elementy przeskoku inne niż strona | Tak (polityka bezpieczeństwa) |
| Dokumenty zmienione, takie jak EPUB, numery stron to (rozdział, pno) | Ta logika weryfikacji numeru strony nie ma zastosowania | Nie (wymaga specjalnego przetwarzania) |
Należy zauważyć, że demonstracja kodu weryfikuje jedynie legalność konstrukcji, a efekt od końca do końca należy połączyć z renderowaniem, aby sprawdzić, czy skok jest dokładny.
🎯 Która metoda jest dla Ciebie odpowiednia?
Jeśli chcesz wyodrębniać katalogi partiami
Najpierw przeprowadź weryfikację strukturalną wyniku get_toc(), następnie zapisz ją w kolejnym procesie i zachowaj dziennik do przeglądu.
Jeśli plik PDF zawiera wizualnie spis treści, ale wyodrębnienie jest puste
Nie ponawiaj wielokrotnie operacji get_toc(), zamiast tego użyj przetwarzania analizy układu tekstu.
Jeśli Twój wpis w katalogu pojawia się na różnych stronach o tej samej nazwie
Przekonwertuj te wpisy na weryfikację ręczną i nie wybieraj automatycznie jednego z numerów stron.
Jeśli przesyłasz dokument do procesu tłumaczenia
Przed tłumaczeniem upewnij się, że struktura katalogów i numery stron są prawidłowe, aby uniknąć nieporozumień związanych z segmentacją.
❓ Często zadawane pytania (FAQ)
1. Dlaczego numer strony zaczyna się od 1, podczas gdy indeks strony zwykle zaczyna się od 0?
Numery stron zakładek to fizyczne numery stron rozpoczynające się od 1, podczas gdy indeksy stron w bibliotekach takich jak PyMuPDF zwykle zaczynają się od 0. Należy zwrócić uwagę na tę różnicę podczas konwersji, w przeciwnym razie numery stron będą źle wyrównane.
2. Jeśli get_toc() zwróci pustą listę, czy oznacza to, że coś jest nie tak z plikiem?
niepewny. Niektóre pliki PDF mają wizualnie stronę ze spisem treści, ale nie osadzają metadanych zakładek. Zwracanie pustej listy jest normalnym zjawiskiem. Zamiast tego należy zastosować analizę układu tekstu.
3. Czy gdy numer strony przekroczy granicę, biblioteka bezpośrednio zgłosi błąd?
Przyzwyczajenie. Rzeczywisty pomiar w tym artykule wykazał, że PyMuPDF wydrukuje ostrzeżenie, ale nie zgłosi wyjątku, gdy numer strony przekroczy granicę, więc funkcja weryfikacji musi aktywnie filtrować.
4. Czy musisz wypełnić środkowe warstwy w przypadku skoków poziomu (np. przejścia bezpośrednio z 1 do 3)?
Sugestia w artykule jest taka, aby zachować pierwotną hierarchię i nie dodawać warstw pośrednich, ponieważ ta struktura jest nadal legalna.
📝 Podsumowanie
Przed użyciem należy sprawdzić hierarchię i numery stron katalogu PDF. Oryginalnego wyniku get_toc() nie można bezpośrednio uważać za niezawodną strukturę. W przypadku napotkania niejasności lub braku zakładek przejście na pracę ręczną lub skorzystanie z innych metod w odpowiednim czasie może uniknąć błędów w dalszych procesach.
Wypróbuj teraz: prześlij dokument, aby rozpocząć tłumaczenie, zachowując oryginalny układ
Referencje i kolejne kroki
Sugerowany następny krok: przygotuj testowy plik PDF zawierający znane problemy z katalogami, uruchom powyższy skrypt weryfikacyjny i policz proporcje różnych anomalii. Jeśli często występują skoki poziomów lub zmiany numerów stron, rozważ dodanie etapu rekonstrukcji katalogu przed tłumaczeniem.
Użyj tej listy kontrolnej do tłumaczenia dokumentów
Najpierw sprawdź kolejność stron, lokalizację źródła i integralność tekstu, a następnie prześlij tę samą pozbawioną czułości próbkę do procesu tłumaczenia. Po tłumaczeniu nadal musisz sprawdzić, czy tytuł, tekst i ilustracje poprawnie odpowiadają sobie. Nie można po prostu sprawdzić, czy tekst jest gładki.
OmniDoc udostępnia wieloformatowy portal do tłumaczenia dokumentów, a oficjalna strona internetowa zawiera funkcje OCR, glosariusza i porównywania dokumentów dwujęzycznych. Dla zespołów, które chcą rozpocząć pracę bezpośrednio z plików, jest to ścieżka warta sprawdzenia na podstawie rzeczywistych próbek. Użyj plików pozbawionych zabezpieczeń, do przesłania których masz pozwolenie, i skorzystaj z elementów zaznaczonych w tym artykule, aby sprawdzić wyniki. Nie ma tu żadnego twierdzenia, że OmniDoc korzysta z bibliotek open source lub wewnętrznych algorytmów opisanych w tym artykule, ani też przykład nie zastępuje testowania wydajności produktu.


