使用 Docker 版 PDFtk 處理 PDF 合併、分割

PDFtk 是個跨平台的 pdf 小工具,可以用來做合併、分割之類的 PDF 編輯,本篇介紹它的 command line tool - 「PDFtk Server」,下面一樣簡稱為 pdftk。

在 Ubuntu 18.04 之後,pdftk 已經從 apt 的 repo 裡移到 Ubuntu 專屬的 snap store,因此本篇使用 Docker 版本的 pdftk

Docker 安裝 pdftk

docker pull mnuessler/pdftk

自製 pdftk 指令

如果用原生的 pdftk 只要直接打 pdftk 指令就可以了,但現在改用 docker 版本,變成要打下面一大串:

docker run --rm -u $(id -u):$(id -g) -v $(pwd):/work mnuessler/pdftk

每次都要打上這一串實在是很麻煩,所以我們自己做一個 pdftk 的指令,讓它用起來跟原生一樣

在 home 目錄建一個放執行檔的資料夾 bin

mkdir ~/bin

使用 echo $PATH,查看 /home/user/bin 是否有在 PATH 變數裡,沒有的話把下面的指令寫入 ~/.bash_profile

# User specific environment and startup programs

PATH=$PATH:$HOME/.local/bin:$HOME/bin
export PATH

將下面這段指令存到 ~/bin/pdftk

#!/bin/bash

docker run --rm -u $(id -u):$(id -g) -v $(pwd):/work mnuessler/pdftk "$@"

給予 ~/bin/pdftk 執行權限,就可以在任何路徑底下執行 pdftk 指令了

chmod +x ~/bin/pdftk

pdftk 使用教學

下面介紹幾個常用的 pdf 編輯功能,本次範例的 pdf 檔名為 demo.pdf

顯示 pdf 檔的總頁數

pdftk demo.pdf dump_data | grep NumberOfPages

將 pdf 檔的每一頁都拆成一個獨立的 pdf 檔

pdftk demo.pdf burst output page-%03d.pdf
  • page-:檔名的前綴,可以自訂
  • %03d:數字排序長度,03d 表示第 1 頁的檔名會從 page-001.pdf 開始排序,02d 則表示從 page-01.pdf 開始,建議先用上面的指令查看總頁數來決定數字的長度

將資料夾底下的所有 pdf 檔合併成一個檔案

pdftk *.pdf cat output all2one.pdf

將 pdf 的第 1 頁輸出成新檔案

pdftk demo.pdf cat 1 output 1.pdf

將 pdf 第 1 頁到第 5 頁輸出成新檔案

pdftk demo.pdf cat 1-5 output 1-5.pdf

將第 10 頁至最末頁輸出成新檔案

pdftk demo.pdf cat 10-end output 10-end.pdf

將第 1 頁至第 10 頁與第 20 頁至最末頁輸出成新檔案

pdftk demo.pdf cat 1-10 20-end output new.pdf

將多個 pdf 的不同頁面組合成新的 pdf

pdftk A=1.pdf B=2.pdf cat A1-3 B1-4 output combined.pdf

# 先定義 A 為 1.pdf,B 為 2.pdf
# 然後截取 1.pdf 的第 1 - 3 頁與 2.pdf 的第 1 - 4 頁,將這 7 頁合併成新 pdf 檔

幫 pdf 加上密碼

pdftk demo.pdf output demo-lock.pdf user_pw abc123

幫 pdf 加上使用者密碼(可閱讀但禁止複製、列印)

pdftk 1.pdf output demo-noCopy.pdf owner_pw abc123

幫 pdf 套用 index 格式檔,讓 pdf 可以用 index(書籤)來檢索瀏覽

pdftk demo.pdf update_info_utf8 indexFile.txt output new_demo.pdf

index file 的格式如下:

BookmarkTitle: Chapter 1
BookmarkLevel: 1
BookmarkPageNumber: 5
BookmarkBegin
BookmarkTitle: Ch 1-1
BookmarkLevel: 2
BookmarkPageNumber: 6
BookmarkBegin
BookmarkTitle: Ch 1-2
BookmarkLevel: 2
BookmarkPageNumber: 10
BookmarkBegin
BookmarkTitle: Chapter 2
BookmarkLevel: 1
BookmarkPageNumber: 15
BookmarkBegin
BookmarkTitle: Ch 2-1
BookmarkLevel: 2
BookmarkPageNumber: 17
BookmarkBegin
BookmarkTitle: Ch 2-2
BookmarkLevel: 2
BookmarkPageNumber: 20
BookmarkBegin

檔案內如果有空行與空欄位,輸出時會有error。


參考資料:

mnuessler/pdftk in dockerHub

Bring PDFtk back to life in a container

acidjazz Written by: