Mesclar arquivos PDF e criar automaticamente um índice com cada arquivo como entrada

Mesclar arquivos PDF e criar automaticamente um índice com cada arquivo como entrada

Tenho vários arquivos pdf ( chapter1.pdf, chapter2.pdf, etc.), cada um sendo um capítulo de um livro. Agora sei como mesclá-los em um único pdf (eu uso o comando pdfunitedo poppler), mas como o arquivo de saída é grande, é difícil encontrar um capítulo sem tê-los indexados em um índice analítico. Então, como criar um índice incorporado no qual cada capítulo mesclado é uma entrada?

Observe que não quero criar uma página no arquivo de saída que contenha a lista de capítulos e seus respectivos números de página. Desejo os metadados do índice/índice de conteúdo de um arquivo PDF, que possam ser navegáveis ​​em qualquer leitor de PDF (ou dispositivo de e-book) que suporte esse recurso.

Responder1

Não destrutivoversão da resposta 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. Gerando bookmarks.txt.
  2. Mesclando PDFs em combined.pdf.
  3. Atualizando combined.pdfcom bookmarks.txt.

Responder2

Uma função que uso o tempo todo para fazer exatamente isso. Apenas certifique-se de que os PDFs sejam classificados corretamente em sequência na expansão.

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

informação relacionada