Объединяйте файлы PDF и автоматически создавайте оглавление, в котором каждый файл является записью

Объединяйте файлы PDF и автоматически создавайте оглавление, в котором каждый файл является записью

У меня есть несколько файлов pdf ( chapter1.pdf, chapter2.pdf, и т. д.), каждый из которых является главой книги. Я знаю, как объединить их в один pdf (я использую команду pdfuniteиз poppler), но поскольку выходной файл большой, сложно найти главу, не проиндексировав их в оглавлении. Так как же создать встроенное оглавление, в котором каждая объединенная глава будет записью?

Обратите внимание, что я не хочу создавать страницу в выходном файле, которая содержит список глав и соответствующие им номера страниц. Мне нужны метаданные индекса/таблицы содержания файла pdf, которые можно просматривать в любом устройстве для чтения pdf (или в устройстве для чтения электронных книг), которое поддерживает такую ​​функцию.

решение1

Неразрушающийверсия ответа @bu5hman:

#!/bin/bash

out_file="combined.pdf"
bookmarks_file="/tmp/bookmarks.txt"
bookmarks_fmt="BookmarkBegin
BookmarkTitle: %s
BookmarkLevel: 1
BookmarkPageNumber: %d
"

rm -f "$bookmarks_file" "$out_file"

declare -a files=(*.pdf)
page_counter=1

# Generate bookmarks file.
for f in "${files[@]}"; do
    title="${f%.*}"
    printf "$bookmarks_fmt" "$title" "$page_counter" >> "$bookmarks_file"
    num_pages="$(pdftk "$f" dump_data | grep NumberOfPages | awk '{print $2}')"
    page_counter=$((page_counter + num_pages))
done

# Combine PDFs and embed the generated bookmarks file.
pdftk "${files[@]}" cat output - | \
    pdftk - update_info "$bookmarks_file" output "$out_file"

Это работает следующим образом:

  1. Генерация bookmarks.txt.
  2. Объединение PDF-файлов в combined.pdf.
  3. Обновление combined.pdfс помощью bookmarks.txt.

решение2

Функция, которую я использую все время, чтобы сделать именно это. Просто убедитесь, что pdf-файлы сортируются правильно в последовательности в расширении.

tp="/tmp/tmp.pdf"
td="/tmp/data"
for i in *.pdf; do
    echo "Bookmarking $i"
    printf "BookmarkBegin\nBookmarkTitle: %s\nBookmarkLevel: 1\nBookmarkPageNumber: 1\n" "${i%.*}"> "$td"
    pdftk "$i" update_info "$td" output "$tp"
    mv "$tp" "$i"
done
pdftk *.pdf cat output myBook.pdf

Связанный контент