Fusione archivos pdf y cree automáticamente una tabla de contenido con cada archivo como entrada

Fusione archivos pdf y cree automáticamente una tabla de contenido con cada archivo como entrada

Tengo varios archivos pdf ( chapter1.pdf,, chapter2.pdfetc.), siendo cada uno un capítulo de un libro. Ahora sé cómo fusionarlos en un solo pdf (uso el comando pdfunitede poppler), pero como el archivo de salida es grande, es difícil encontrar un capítulo sin tenerlo indexado en una tabla de contenido. Entonces, ¿cómo crear una tabla de contenido incrustada en la que cada capítulo fusionado sea una entrada?

Tenga en cuenta que no quiero crear una página en el archivo de salida que contenga la lista de capítulos y sus respectivos números de página. Quiero los metadatos del índice/tabla de contenido de un archivo pdf, que se puedan explorar en cualquier lector de pdf (o dispositivo de libros electrónicos) que admita dicha función.

Respuesta1

No destructivoversión de la respuesta de @ 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"

Funciona por:

  1. Generando bookmarks.txt.
  2. Fusionar archivos PDF en combined.pdf.
  3. Actualizando combined.pdfcon bookmarks.txt.

Respuesta2

Una función que uso todo el tiempo para hacer exactamente esto. Solo asegúrese de que los archivos PDF se ordenen correctamente en secuencia en la expansión.

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

información relacionada