PDFファイルを結合し、各ファイルをエントリとして目次を自動的に作成します。

PDFファイルを結合し、各ファイルをエントリとして目次を自動的に作成します。

chapter1.pdf複数の PDF ファイル ( 、など)がありchapter2.pdf、それぞれが本の章になっています。それらを 1 つの PDF に結合する方法はわかっていますが ( pdfunitepoppler のコマンドを使用)、出力ファイルが大きいため、目次にインデックスを付けずに章を見つけるのは困難です。では、結合された各章がエントリとなる埋め込み目次を作成するにはどうすればよいでしょうか。

出力ファイルには、章のリストとそれぞれのページ番号を含むページを作成したくないことに注意してください。必要なのは、そのような機能をサポートする任意の 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

関連情報