How-To:Linux 使用 Ghostscript 處理 PDF 文件

操作環境:

  • Fedora 36
  • Ghostscript v9.55

 

赫然發現本站還沒有任何一篇文章,好好介紹過 Ghostscript 這款工具。但事實上 DR 從好幾年前就開始在使用它,藉此解決日常任務中的許多需求。Ghostscript 是一款跨平台的 PostScript 暨 PDF 直譯器,一般來說,最常見的應用就是用來處理 PDF 檔案。儘管它並不是所謂的 PDF 閱讀器,或者能夠將 PDF 重新處理成可編輯的文件。然而它能夠實現諸如合併、分割、儲存成圖片,甚至是修復有問題的 PDF 檔案等需求,所以其實是一款很實用的工具。
 

本文除了介紹安裝方式外,將會簡單列舉幾個 Ghostscript 的使用範例。它本身是使用命令行的操作方式,不過一旦瞭解指令的使用後,應該很容易就能夠搭配自行編寫的腳本,甚至是視窗程式,來實現更便利的操作。

 

1. 安裝 Ghostscript

Fedora 發行版上可以使用 dnf 指令進行安裝:

  • sudo dnf install ghostscript

 

透過前述指令安裝完畢後,Ghostscript 的執行檔名為 gs。

 

2. 儲存 PDF 複本

以下指令能夠將輸入的 input.pdf 另存為 output.pdf:

  • gs -sDEVICE=pdfwrite -dPDFSETTINGS=/prepress -o output.pdf input.pdf

 

可別小看這個儲存動作,它實際上具備修復 PDF 檔案的能力。倘若過程中有偵測到問題,會自動嘗試加以排除,因此適用於 PDF 出現奇怪的疑難雜症時。其中「-dPDFSETTINGS=/prepress」這段參數並不是必要的,它是關於輸出品質的調整,也可以考慮去除以按照預設值(也就是 /default)輸出。

 

此外,使用 /prepress 選項也有可能會形成縮減 PDF 檔案大小的效果。然而倘若縮減大小是主要的目的,則可以考慮使用 /ebook 或者是更極端的 /screen 選項。

 

3. 清除 PDF 註解

有些時候,如果是額外加上的註解(annotation)導致 PDF 出現問題,那麼也可以試試看產生一個沒有註解的複本。具體的指令是延續前一範例,然後再加上「-dShowAnnots=false」參數:

  • gs -sDEVICE=pdfwrite -dShowAnnots=false -dPDFSETTINGS=/prepress -o output.pdf input.pdf

 

4. 合併多個 PDF 檔案

以下指令能夠將多個 PDF 依序合併成單一檔案:

  • gs -sDEVICE=pdfwrite -o output.pdf input01.pdf input02.pdf input03.pdf

 

5. 分割 PDF

另一方面,以下指令則能夠將 input.pdf 的 1-3 頁輸出為 output.pdf:

  • gs -sDEVICE=pdfwrite -dFirstPage=1 -dLastPage=3 -o output.pdf input.pdf

 

所以若以此類推,只要進一步變更 -dFirstPage 及 -dLastPage 參數,就能夠再輸出其它的頁面,藉此形成分割檔案的效果。

 

6. 將 PDF 輸出為多個 PNG 圖檔

以下指令範例能夠將 input.pdf 轉換為 output-01.png、output-02.png 等多個 PNG 圖檔:

  • gs -sDEVICE=png16m -r300 -o output-%02d.png input.pdf

 

輸出檔名內的「%02d」即代表是兩位數自動補零;所以若是希望做三位數自動補零,就是改成「%03d」,以此類推即可。

 

7. 將 PDF 輸出為多頁式的單一 TIFF 圖檔

可以使用例如以下指令,將 input.pdf 輸出為多頁式的單一 output.tif:

  • gs -sDEVICE=tiff24nc -r300 -o output.tif input.pdf

 

8. 關於 Ghostscript 參數的其它補充

在網路上許多的範例裡,可能經常會看到 -dSAFER、-dBATCH 及 -dNOPAUSE 這幾個參數。而本文之所以都沒有使用到,首先是因為 -dSAFER 自 v9.50 起已是預設值,故無須特別添加;也就是預設都會檢查相關的檔案權限。至於 -dBATCH 及 -dNOPAUSE,則是若已使用 -o 來指定輸出檔案,便會自動帶入;也就是完全停用互動介面,自動完成檔案處理並結束程式。

 

然而若是使用 -sOutputFile= 而非 -o 來指定檔案,那麼 -dBATCH 及 -dNOPAUSE 就不會自動帶入了,這是需要留意的地方。

 

9. 其它參考資料