在 Linux 將 PDF 彩色轉成黑白

(最近更新:2019-03-10,修正指令的錯誤)

免責聲明:以下僅供參考,本文作者不為使用者執行以下內容之後果負擔任何責任。

最近因為下載過著作權保護的愛爾蘭語相關著作古籍,這些書籍是黑白印刷的,但是因為紙張泛黃,和黑白相比,並太不適宜閱讀,轉成灰階對比度較低,更難閱讀。若是列印供紙本閱讀的話,當然希望能夠用黑白列印就好了。所以就有如標體所述,將這種彩色 PDF 轉成黑白的需求。

因為如果用 convert 指令直接轉換的話,似乎效果不太好,而這些 pdf 檔案都是圖片檔組合而成,我後來參考網路上的教學,歸納可以為三個步驟,比較適合這種類型的 PDF:

  • 將 PDF 抽取圖片。
  • 將每幅圖片變成黑白。
  • 將這些黑白圖片組回去變成 PDF。

現在不易找齊我那時候參考哪些來源了(同類型的 Q&A 與可能參考來源列於「相關資料與可能參考來源」段),以下只是參考教學。

為方便解說,input.pdf 指定為欲處理的 PDF 檔,output 為輸出結果。

  1. 將 PDF 抽取圖片(rx 和 ry 各指定 x 維和 y 維的解析度,單位為 dpi)。將產生一系列圖片依頁碼為流水號如:temp-001.png、temp-002.png、temp-003.png……
  2. pdftoppm input.pdf temp -png -rx 450 -ry 450
  3. 將這些圖片批次用 convert 轉成黑白圖片。
  4. for file in $(ls temp*.png) ; \
    do convert $file -threshold 67% result-$file.png; \
    done ;

    這裡解說一下:

    • for file in $(ls temp*.png) ;:顯示檔名符合 temp*.png 格式(就是我們剛才抽取出的流水號圖檔)的檔名列表,存在 file 這個迴圈用的臨時變數(file=temp-001.png, temp-002.png,...),進行迴圈批次操作。
    • do convert $file -threshold 67% result-$file.png;:迴圈內要重複執行的部份。將檔案名稱為 $file 的彩色圖檔用 convert 指令轉換成黑白兩色圖片,名稱為 result-$file(比如:temp-001.png 轉換成 output-temp-001.png)。-threshold 區分黑白和彩色的閾值參數(範圍為0-100%,參考「相關資料與可能參考來源」第1點連結 Der Hochstapler 的回答),這裡設定為67%。
    • done;:結束迴圈。
  5. 將這些生成的圖片結合成新的 PDF:
  6. convert result-temp-*.png output.pdf

相關資料與可能參考來源

1. [How to convert a photo to a black and white image by ImageMagick? - Superuser](https://superuser.com/questions/405686/how-to-convert-a-photo-to-a-black-and-white-image-by-imagemagick) 2. [How can I convert a series of images to a PDF from the command line on linux? - StackOverflow](https://stackoverflow.com/questions/8955425/how-can-i-convert-a-series-of-images-to-a-pdf-from-the-command-line-on-linux)
  1. How to convert PDF to Image?
  2. [SOLVED] command line to convert png to pdf