用 pdftk-java 命令編輯 PDF 的 4 種方法
技術白皮書、手稿和 RPG 手冊,我每天都要處理大量的 PDF 文件。PDF 格式之所以受歡迎,是因為它包含經過處理的 PostScript 代碼。PostScript 是現代印表機的原生語言,所以出版商經常將一本書的數字版本發布為 PDF,因為他們已經投入了時間和精力來製作印刷用的文件。但是,PDF 並不是一種可編輯的格式,雖然可以進行一些逆向處理,但它是數字數據發送到印表機之前的最後一站。即便如此,有時你還是需要對 PDF 進行調整,而我最喜歡的工具之一就是 pdftk-java 命令。
在 Linux 上安裝 pdftk-java
顧名思義,pdftk-java
是用 Java 編寫的,所以只要你安裝了 Java,它就能在所有主流的操作系統上工作。
Linux 和 macOS 用戶可以從 AdoptOpenJDK.net 安裝 Java。Windows 用戶可以安裝 Red Hat 的 OpenJDK 的 Windows版本。
要安裝 pdftk-java
:
1、從 Gitlab 倉庫下載 pdftk-all.jar 程序,並將其保存到 ~/.local/bin/
或你 path 變數中的其他位置。
2、在你喜歡的文本編輯器中打開 ~/.bashrc
並添加這一行:
alias pdftk='java -jar $HOME/.local/bin/pdftk-all.jar'
3、載入你的新 Bash 設置:
$ source ~/.bashrc
命令語法
一個有效的 pdftk-java
命令的結構遵循一個模式,但在模式中的內容有很大的靈活性。語法有點不尋常,因為它沒有使用傳統風格的 終端選項,但經過實踐,它並不難記。
pdftk
:調用該命令的別名- 輸入文件:你想修改的 PDF 文件
- 動作:你想對輸入文件做什麼
- 輸出:你想在哪裡保存你修改過的 PDF 文件
最複雜的是動作部分,所以我將從簡單的任務開始。
將兩個 PDF 文件合併成一個
一本書的封面通常在一個單獨的應用中創建,如 Inkscape 或 GIMP,而書的其他部分通常在 Scribus 等排版程序或 LibreOffice 等辦公套件中完成,這種情況並不罕見。你可以在你的排版應用中把這兩者結合起來。像 Scribus 這樣的出版軟體可以很容易地引用一張圖片,這樣當封面改變時,它就會在版面中自動更新。然而,也可以用 pdftk-java
將封面預置到 PDF 中:
$ pdftk cover.pdf body.pdf
cat
output book.pdf
在這個例子中,動作是 cat
即 連接 的縮寫,和 Linux 的 cat 命令 一樣,它將一個或多個 PDF 文件串聯成一個數據流,數據流被引導到「 輸出 」參數指定的任何文件中。
從一個 PDF 中刪除頁面
你不能確切地從一個 PDF 中刪除一頁,但你可以創建一個新的 PDF,只包含你想保留的頁面。
$ pdftk book.pdf
cat 1 3-end
output shorter-book.pdf
在這個例子中,我的書的文件的第 1 頁,以及從 3 到結尾的所有頁面,都被保存到一個新文件中。因此,我刪除的那一頁是第 2 頁。
將一個 PDF 分割成不同的文件
將一個 PDF 文件分割成許多不同的文件也使用 cat
動作,它的原理與刪除頁面相似。你可以通過將你想要的頁面發送到一個新文件來分割一個 PDF:
$ pdftk book.pdf
cat 1-15
output part-1.pdf
$ pdftk book.pdf
cat 16-42
output part-2.pdf
如果你需要將一個 PDF 分割成單頁文件,有一個特殊的動作,叫做 burst
:
$ pdftk book.pdf burst
$ ls
book.pdf pg_0001.pdf pg_0002.pdf
pg_0003.pdf pg_0004.pdf pg_0005.pdf
[...]
填寫表格
很少有人能否認多年來 PDF 格式變得越來越臃腫,而你有時在 PDF 文件中發現的一個功能是可填寫的表格。你會在美國稅務文件、RPG 角色表、線上學校作業本和其他旨在互動的 PDF 文件中看到這種情況。雖然大多數現代的 PDF 瀏覽器,比如 GNOME 的 Evince 和 KDE 的 Okular,都可以填寫 PDF 表格,但你也可以在 pdftk-java
的幫助下填寫 PDF 表格。
首先,你必須使用 generate_fdf
動作提取表單數據。這將提取表單元素的 ID,並將它們放入一個文本文件。
$ pdftk character-sheet.pdf
generate_fdf
output chsheet-form.txt
你的目標文件(在這個例子中是 chsheet-form.txt
)包含 PDF 中的表格數據,但只是文本部分。你可以在任何標準的文本編輯器中編輯它,如 Atom 或 Gedit。
在對生成 PDF 的組織的工作流程的有時令人欽佩和有時尷尬的一瞥中,你會發現一些表格有明確的標籤,而其他表格有默認的名字,如 「Checkbox_001」 和 「Textfield-021」,所以你可能要把你的文本文件和你的 PDF 對照一下,但如果你要寫一個腳本來自動填寫表格,這可能是值得的。每個標籤都被標記為 /T
項,在接下來的一行中,有空間(標記為 /V
)提供給文本輸入。下面是一個片段,它的標籤有上下文,並填入了一些數據:
/T (CharacterName 2)
/V (Abaddon)
>>
<<
/T (SlotsTotal 24)
/V ()
>>
<<
/T (Hair)
/V (Brown)
>>
<<
/T (AC)
/V (15)
>>
<<
/T (Background)
/V ()
>>
<<
/T (DEXmod )
/V ()
當你輸入了表單數據,你就可以用 fill_form
動作將你的文本輸入與 PDF 結構結合起來:
$ pdftk character-sheet.pdf
fill_form chsheet-form.txt
output completed.pdf
下面是一個結果示例。
![A form filled by pdftk-java](/data/attachment/album/202112/27/130727qw8glu39ckhs5c63.jpg "A form filled by pdftk-java")
PDF 修改變得簡單
當你處理大量的 PDF 文件或通過 shell 腳本處理 PDF 文件時,像 pdftk-java
這樣的工具是非常有價值的,因為它使你不必手動做所有的事情。當我從 Docbook 的輸出建立一個 PDF 時,它是一個 Makefile,調用 pdftk-java
完成任何數量的任務,所以我沒有機會忘記某個步驟或打錯命令,也沒有必要把時間花在這上面。在你自己的工作流程中,還有很多其他的原因你可能會使用 pdftk-java
,它還可以做很多其他的事情,包括 shuffle
、rotate
、dump_data
、update_info
和 attach_files
等動作。如果你發現自己經常與 PDF 文件打交道,可以試試 pdftk-java
。
via: https://opensource.com/article/21/12/edit-pdf-linux-pdftk
作者:Seth Kenlon 選題:lujun9972 譯者:geekpi 校對:wxy
本文轉載來自 Linux 中國: https://github.com/Linux-CN/archive