
Tengo varios archivos pdf ( chapter1.pdf
,, chapter2.pdf
etc.), siendo cada uno un capítulo de un libro. Ahora sé cómo fusionarlos en un solo pdf (uso el comando pdfunite
de 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:
- Generando
bookmarks.txt
. - Fusionar archivos PDF en
combined.pdf
. - Actualizando
combined.pdf
conbookmarks.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