合併 pdf 檔案並自動建立目錄,每個檔案作為一個條目

合併 pdf 檔案並自動建立目錄,每個檔案作為一個條目

我有幾個 pdf 檔(chapter1.pdfchapter2.pdf等),每個文件都是一本書的一章。我現在如何將它們合併到一個 pdf 中(我使用 poppler 中的命令pdfunite),但由於輸出檔案很大,如果不在目錄中索引它們就很難找到章節。那麼如何建立一個嵌入式目錄,其中每個合併的章節都是一個條目呢?

請注意,我不想在輸出檔案中建立包含章節清單及其各自頁碼的頁面。我想要 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.pdfbookmarks.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

相關內容