PDF-Dateien zusammenführen und automatisch ein Inhaltsverzeichnis mit jeder Datei als Eintrag erstellen

PDF-Dateien zusammenführen und automatisch ein Inhaltsverzeichnis mit jeder Datei als Eintrag erstellen

Ich habe mehrere PDF-Dateien ( chapter1.pdf, chapter2.pdfusw.), von denen jede ein Kapitel eines Buches ist. Ich weiß jetzt, wie ich sie zu einer einzigen PDF-Datei zusammenfüge (ich verwende den Befehl pdfunitevon Poppler), aber da die Ausgabedatei groß ist, ist es schwierig, ein Kapitel zu finden, ohne es in einem Inhaltsverzeichnis zu indizieren. Wie erstelle ich also ein eingebettetes Inhaltsverzeichnis, in dem jedes zusammengeführte Kapitel ein Eintrag ist?

Beachten Sie, dass ich in der Ausgabedatei keine Seite erstellen möchte, die die Liste der Kapitel und ihre jeweiligen Seitenzahlen enthält. Ich möchte die Index-/Inhaltsverzeichnis-Metadaten einer PDF-Datei, die in jedem PDF-Reader (oder E-Book-Gerät) durchsucht werden können, der diese Funktion unterstützt.

Antwort1

ZerstörungsfreiVersion der Antwort von @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"

Es funktioniert durch:

  1. Erstellen bookmarks.txt.
  2. Zusammenführen von PDFs in combined.pdf.
  3. Aktualisierung combined.pdfmit bookmarks.txt.

Antwort2

Eine Funktion, die ich ständig verwende, um genau dies zu tun. Stellen Sie einfach sicher, dass die PDFs bei der Erweiterung in der richtigen Reihenfolge sortiert werden.

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

verwandte Informationen