Що мені робити, якщо я можу натиснути сторінку змісту PDF-файлу, але втрачаю рівень після вилучення?

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

Сторінку змісту PDF-файлу можна перенаправляти у зчитувачі нормально, але після вилучення за допомогою сценарію ієрархія може бути плоскою, номери сторінок можуть бути неправильно вирівняні або навіть індекс може бути ненормальним. Цей тип проблеми є поширеним під час об’єднання сканованих файлів або файлів із неправильною структурою закладок. Якщо результати видобування безпосередньо передаються наступним користувачам, можуть виникнути помилки в сегментації перекладу та зв’язуванні.

Ця стаття призначена для розробників і груп документації, які потребують пакетної обробки PDF-каталогів. Після прочитання ви зможете зрозуміти значення значення, що повертається get_toc(), освоїти правила перевірки для рівнів і номерів сторінок, а також знати, які ситуації слід перетворити на ручну перевірку. У цій статті використовується синтетичний зразок для демонстрації методу обробки, а код було перевірено зразком в ізольованому середовищі, але це не є гарантією всіх реальних файлів або ефектів продукту. Перед обробкою важливих документів збережіть оригінали та перегляньте їх відповідно до меж і пунктів прийняття в тексті.

Що робити, якщо сторінку змісту PDF можна клацнути, але ієрархію втрачено після вилучення? Висновок одним реченням

Спочатку перевірте, а потім запишіть: спочатку потрібно перевірити рівень закладки, перший елемент вважається першим рівнем, наступні рівні не повинні перевищувати попередній елемент плюс один, а записи з номерами сторінок, що виходять за межі, не записуватимуться.

ваша ситуаціяРекомендовані практикипричина
Сторінку каталогу можна клацнути, і після вилучення ієрархія буде плоскою або зміщеною.Спочатку скористайтеся get_toc(), щоб отримати оригінальний список, а потім перевірте його один за одним перед використанням.Оригінальний список, повернутий get_toc(), не має структурованої перевірки
Номер сторінки дорівнює 0 або перевищує загальну кількість сторінокВідкинути запис і зареєструватисяНомери сторінок за межами спричинять помилку переходу
get_toc() повертає порожній списокНатомість використовуйте аналіз макета тексту та не повторюйте наосліпФайл може не мати вбудованих метаданих закладок
Один і той самий заголовок відповідає декільком різним номерам сторінокПозначити як неоднозначне, перевести на ручну перевіркуНеможливо автоматично визначити правильний номер сторінки

Чому результат вилучення втрачає рівні?

get_toc() за замовчуванням виводить список потрійок [level, title, page]. Серед них page — це фізичний номер сторінки, починаючи з 1, а level представляє лише глибину вкладеності й не гарантує безперервності чи законності.

Якщо вихідний PDF-файл було згенеровано за допомогою інструмента сканування, поширені проблеми включають:

  • Стрибок рівня: наприклад, стрибок безпосередньо з 1 на 3
  • Виняток номера сторінки: номер сторінки дорівнює 0 або перевищує загальну кількість сторінок
  • Виняток заголовка: заголовок містить керуючі символи

Якщо використовується безпосередньо для завдань нижньої течії, це призведе до плутанини в сегментах перекладу або збою посилання. Що ще більш підступно, деякі PDF-файли мають візуальну сторінку зі змістом, але не мають вбудованих метаданих закладок. Це нормально, коли get_toc() повертає порожній список у цей час, і замість цього потрібно використовувати аналіз макета тексту.

Приклад самостійної композиції

Перегляньте список імпорту для прикладів залежностей. Код створює вхідні дані в пам’ять, а записи про виконання надаються окремо й не є гарантією всіх реальних файлів.

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")

Правила обробки законного та незаконного введення

Правильне введення має задовольняти: список трійок із безперервними рівнями та номерами сторінок у діапазоні [1, doc.page_count]. Наприклад, [[1, "引言", 1], [2, "背景", 2], [1, "方法", 5]] є законним, другий рівень з’являється після першого рівня та відповідає синтаксису структури PDF.

Поширені неправильні введення включають:

  • Рівень 0 або негативний
  • Номер сторінки 0
  • Кількість сторінок перевищує загальну кількість сторінок
  • Заголовок є порожнім рядком або містить лише пробіли

Для цих ситуацій у статті наведено такі методи:

  1. Пропускайте сторінки з недійсними сторінками та фіксуйте попередження.
  2. Залишайте заповнювачі на кшталт [untitled] для порожніх назв, щоб зберегти структурну цілісність.
  3. Не переривайте розв'язання всієї директорії через одну помилку.

Для випадків із рівнями менше 1 слід розглянути дві стратегії: підсумок прикладу, які закликають відкидати незаконні рівні і не виправляти їх автоматично, тоді як правила в тексті забезпечують виконання 1. Вибір між двома — це ваш власний процес. Слід також зазначити, що ці правила розроблені для забезпечення надійності подальших процесів і не є обов'язковими вимогами стандарту PDF. Тести показують, що коли номери сторінок виходять за межі, PyMuPDF друкує попередження, але не створює винятків, тому функція валідації має активно фільтрувати і не може покладатися на поведінку бібліотеки.

📊 Порівняння ядра

Результати та рекомендовані методи обробки для get_toc() залежать від документа:

Статус документаРезультат get_toc()Рекомендоване поводження
Закладка та структурно легальнаПовернути список трійокВикористовуйте безпосередньо після верифікації
Закладки існують, але ієрархія або номер сторінки є аномальнимиПовертає список винятківФільтруйте та фіксуйте журнали, а за потреби переходьте на ручну працю
Візуальна версія має сторінку зі змістом, але без закладокПовернутися до порожнього спискуПерехід до аналізу верстки тексту
Перебудуйте документи, такі як EPUBФормат номера сторінки: (розділ, PNO)Ця логіка верифікації номерів сторінки не застосовується і потребує виділеної обробки

Критерії прийняття та межі ручного перегляду

Таблиця нижче зосереджена лише на етапі вилучення метаданих PDF-каталогу:

Спостерігайте за явищемРішення щодо розгляду справиЧи підходить автоматизація
Номер сторінки дорівнює 0 або більше за загальну кількість сторінокВідкиньте запис і зареєструйте йогоТак
Рівні менше 1 або нецілі числаКеруйте відповідно до наведених вище правил (див. попереднє пояснення)Так
Заголовки або повністю порожні, або суто символічніЗамінити на [untitled]Так
Стрибки на рівні (наприклад, від 1 до 3)Зберігайте оригінальні шари, не заповнюючи середні шариТак (структурно юридично)
Одна й та сама назва відповідає кільком різним номерам сторінокПозначено як неоднозначне, перетворено на ручнеНі
Понад 200 записів без ієрархічних змінПідозра на неправильну ідентифікацію OCR потребує ручної перевіркиНі
Включає зовнішні дії URI або JavaScriptВідфільтруйте не-сторінкові перенаправленняТак (Політика безпеки)
Переставляйте документи, такі як EPUB, номер сторінки (розділ, PNO)Ця логіка перевірки номерів сторінки не застосовуєтьсяНі (потребує особливого ставлення)

Зверніть увагу, що демонстрація коду перевіряє лише структурну легальність; наскрізні ефекти також потрібно поєднувати з рендерингом для перевірки точності стрибків.

🎯 Який метод тобі підходить?

Якщо потрібно пакетно використовувати каталоги вилучення

Спочатку проведіть структурну валідацію результатів get_toc(), потім запишіть їх у наступні робочі процеси та ведіть журнали для перевірки.

Якщо ваш PDF візуально має зміст, але витягнутий порожнім

Не повторюйте get_toc(); переходьте на аналіз і обробку тексту.

Якщо ваш запис у довіднику має однакову назву, але різні сторінки

Перевіряйте ці записи вручну; не вибирайте автоматично один із номерів сторінок.

Якщо ви хочете передати документи на процес перекладу,

По-перше, перевірте правильну структуру змісту та номери сторінок перед перекладом, щоб уникнути плутанини в абзацах.

❓ Поширені запитання (FAQ)

1. Чому номер сторінки починається з 1, а індекси сторінок зазвичай починаються з 0?

Номери сторінок закладок — це фізичні номери сторінок, що починаються з 1, тоді як індекси сторінок у бібліотеках, таких як PyMuPDF, зазвичай починаються з 0. Ця різниця важлива при конвертації, інакше номери сторінок можуть бути неправильно вирівняні.

2. get_toc(): Чи обов'язково повернення порожнього списку означає проблему з файлом?

Не обов'язково. Деякі PDF візуально мають сторінку з змістом, але без вбудованих метаданих закладок, тому повернення порожнього списку — це нормально. У такому випадку слід використовувати аналіз верстки тексту.

3. Якщо номер сторінки виходить за межі, чи буде негайно бібліотека повідомляти про помилку?

Ні. Тести в цій статті показують, що PyMuPDF друкує попередження, коли номери сторінок виходять за межі, але не створюють винятків, тому функція валідації має активно фільтрувати.

4. Чи вимагають ієрархічні стрибки (наприклад, прямий перехід з 1 на 3) заповнювати середні шари?

Пропозиція в статті — зберегти початкову ієрархію і не заповнювати середні шари, оскільки ця структура залишається легітимною.

📝 Резюме

Ієрархія та номери сторінок PDF-каталогів потрібно перевірити перед використанням, тому оригінальний вихід get_toc() не можна безпосередньо вважати надійною структурою. Коли стикаєтеся з неоднозначностями або відсутністю закладок, негайно переходьте на ручну працю або інші методи, щоб уникнути подальших помилок процесу.

Досвід зараз: завантажте документ, щоб почати переклад, зберігаючи оригінальне форматування

Рекомендації та наступні кроки

Наступний крок — підготувати тестовий PDF із відомими проблемами каталогу, запустити вищезазначений скрипт перевірки та обчислити частку різних аномалій. Якщо часто трапляються ієрархічні пропуски або зміщення кількості сторінок, розгляньте можливість додати етап реконструкції змісту перед перекладом.

Використовуйте цей чек-лист для перекладу документів

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

OmniDoc надає багатоформатні портали перекладу документів, а офіційний вебсайт пропонує OCR, глосарії та двомовні довідкові функції. Для команд, які хочуть починати безпосередньо з файлів, це шлях, який варто оцінювати за допомогою реальних зразків. Будь ласка, скористайтеся анонімізованим файлом, який ви дозволили для завантаження, і перевірте результати за допомогою чек-листа в цій статті. Це не стверджує, що OmniDoc використовує бібліотеку з відкритим кодом або внутрішні алгоритми з цієї статті, а також не замінює тестування продуктивності продукту прикладами.

Оновлено 2026-11-15