Linux中國

用 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 連接 concatenate 的縮寫,和 Linux 的 cat 命令 一樣,它將一個或多個 PDF 文件串聯成一個數據流,數據流被引導到「 輸出 output 」參數指定的任何文件中。

從一個 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 中的表格數據,但只是文本部分。你可以在任何標準的文本編輯器中編輯它,如 AtomGedit

在對生成 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,它還可以做很多其他的事情,包括 shufflerotatedump_dataupdate_infoattach_files 等動作。如果你發現自己經常與 PDF 文件打交道,可以試試 pdftk-java

via: https://opensource.com/article/21/12/edit-pdf-linux-pdftk

作者:Seth Kenlon 選題:lujun9972 譯者:geekpi 校對:wxy

本文由 LCTT 原創編譯,Linux中國 榮譽推出


本文轉載來自 Linux 中國: https://github.com/Linux-CN/archive

對這篇文章感覺如何?

太棒了
0
不錯
0
愛死了
0
不太好
0
感覺很糟
0
雨落清風。心向陽

    You may also like

    Leave a reply

    您的郵箱地址不會被公開。 必填項已用 * 標註

    此站點使用Akismet來減少垃圾評論。了解我們如何處理您的評論數據

    More in:Linux中國