Pdf. Оглавление. pdf.tocgen
Pdf. Оглавление. pdf.tocgen.
Содержание
1 Общая информация
- Репозиторий: https://github.com/Krasjet/pdf.tocgen
 - Сайт: https://krasjet.com/voice/pdf.tocgen/
 
2 Установка
- Устанавливается как python-пакет:
pipx install pdf.tocgen 
3 Рабочий процесс
Пакет pdf.tocgen состоит из 3 отдельных программ:
pdfxmeta: извлечь метаданные (атрибуты шрифта, позиции) заголовков в создать файл рецепта;pdftocgen: создать оглавление из рецепта;pdftocio: импортировать оглавление в документ PDF.
Используем
pdfxmetaдля поиска метаданных заголовков и генерации фильтры заголовков с использованием автоматической настройки:pdfxmeta -p <page> -a 1 in.pdf "Section" >> recipe.toml pdfxmeta -p <page> -a 2 in.pdf "Subsection" >> recipe.toml- Здесь 
<page>есть номер страницы в файле. 
- Здесь 
 Файл
recipe.tomlбудет содержать несколько фильтров заголовков.Пример файла рецепта будет выглядеть так:
[[heading]] level = 1 greedy = true font.name = "Times-Bold" font.size = 19.92530059814453 [[heading]] level = 2 greedy = true font.name = "Times-Bold" font.size = 11.9552001953125Передадим рецепт программе
pdftocgenдля создания оглавления:pdftocgen in.pdf < recipe.tomlВ результате получим текст оглавления следующего вида:
"Preface" 5 "Bottom-up Design" 5 "Plan of the Book" 7 "Examples" 9 "Acknowledgements" 9 "Contents" 11 "The Extensible Language" 14 "1.1 Design by Evolution" 14 "1.2 Programming Bottom-Up" 16 "1.3 Extensible Software" 18 "1.4 Extending Lisp" 19 "1.5 Why Lisp (or When)" 21 "Functions" 22 "2.1 Functions as Data" 22 "2.2 Defining Functions" 23 "2.3 Functional Arguments" 26 "2.4 Functions as Properties" 28 "2.5 Scope" 29 "2.6 Closures" 30 "2.7 Local Functions" 34 "2.8 Tail-Recursion" 35 "2.9 Compilation" 37 "2.10 Functions from Lists" 40 "Functional Programming" 41 "3.1 Functional Design" 41 "3.2 Imperative Outside-In" 46 "3.3 Functional Interfaces" 48 "3.4 Interactive Programming" 50Его можно сразу импортировать в файл PDF с помощью
pdftocio:$ pdftocgen in.pdf < recipe.toml | pdftocio -o out.pdf in.pdfМожно отредактировать оглавление перед его импортом:
pdftocgen in.pdf < recipe.toml > toc pdftocio in.pdf < toc
4 Примеры использования
4.1 pdftocio
Отобразить существующее оглавление PDF-файла в stdout:
pdftocio doc.pdfЗаписать существующее оглавление PDF-файла в файл с именем toc:
pdftocio doc.pdf > tocЗаписать оглавление из toc-файла в doc.pdf:
pdftocio doc.pdf < tocУказать имя выходного PDF-файла:
pdftocio -o out.pdf doc.pdf < tocСкопировать оглавление из doc1.pdf в doc2.pdf:
pdftocio -v doc1.pdf | pdftocio doc2.pdf- Флаг 
-vпомогает сохранить вертикальные позиции заголовков при копировании. 
- Флаг 
 Вывести оглавление для чтения:
pdftocio -H doc.pdf
4.2 pdftocgen
Применить существующий рецепт
recipe.tomlк файлуdoc.pdf(результат дублируется вstdout):pdftocgen doc.pdf < recipe.tomlВывести оглавление в файл с именем
toc:pdftocgen doc.pdf < recipe.toml > tocИмпортировать созданное оглавление в файл PDF и вывести в doc_out.pdf:
pdftocgen doc.pdf < recipe.toml | pdftocio -o doc_out.pdf doc.pdfВывести сгенерированное оглавление для чтения:
pdftocgen -H doc.pdf < recipe.tomlЕсли вы хотите включить вертикальное положение на странице для каждого заголовка, используйте флаг
-v:pdftocgen -v doc.pdf < recipe.toml
4.3 pdfxmeta
Искать слово
Anaphoricво всем PDF:pdfxmeta onlisp.pdf "Anaphoric"Вывести результат в виде фильтра заголовков с автоматическими настройками:
pdfxmeta -a 1 onlisp.pdf "Anaphoric"Поиск без учета регистра
Anaphoricво всем PDF:pdfxmeta -i onlisp.pdf "Anaphoric"Использование регулярного выражения для поиска без учета регистра
Anaphoricв PDF-файле:pdfxmeta onlisp.pdf "[Aa]naphoric"Поиск только на странице 203:
pdfxmeta -p 203 onlisp.pdf "anaphoric"
5 Исправление номеров страниц
Возможно несовпадения номеров страниц книги и pdf-файла.
Возможно сдвинуть все номера страниц на некоторую величину.
Скрипт изменяет номера страниц в конце строк:
#!/bin/bash if [ $# -ne 2 ]; then echo "Использование: $0 <файл> <инкремент>" exit 1 fi file="$1" increment="$2" cp "$file" "${file}.bak" awk -v inc="$increment" ' { # Сохраняем оригинальные отступы match($0, /^ */) leading_space = substr($0, 1, RLENGTH) content = substr($0, RLENGTH+1) # Ищем номер страницы в формате: пробел+число(или диапазон) в конце строки if (match(content, /([0-9]+(-[0-9]+)?)[[:space:]]*$/)) { prefix = substr(content, 1, RSTART-1) split(substr(content, RSTART, RLENGTH), parts, "-") # Обрабатываем числа new_nums = "" for(i in parts) { parts[i] += inc new_nums = (i>1 ? new_nums "-" : "") parts[i] } # Собираем новую строку $0 = leading_space prefix new_nums } print }' "$file" > tmp && mv tmp "$file" echo "Номера страниц увеличены на $increment. Резервная копия: ${file}.bak"Распечатка 1: increment_page.shПример использования:
./increment_page.sh toc 1