2019-07-02

Linux PDF文件 轉換成 圖像檔

偶然有位朋友查問在下如何將 PDF文件 轉換成 圖像檔
在下過往如果需要將 PDF文件 轉換成 圖像檔,通常會將 PDF文件 匯入到 GIMP ,然後選取需要匯出成 圖像檔 的分頁後匯出成 PNG
由於通常亦只是一兩頁,便沒有用特別方法處理
但發現如果將一個非常多分頁的 PDF文件 整個轉換成 圖像檔,這個卻是非常不方便


使用 GIMP 轉換


在下使用以前製作的 Alan Wake Manuscript 測試

見下文
以 GIMP 開啟 PDF文件

開啟 GIMP 後,選擇開啟 PDF文件
會顯示 PDF文件 匯入程序
可以選擇 PDF文件 的頁面寬度及高度像素解析度 等設定

見下文
匯入後便可以匯出成各種圖像格
若果匯入超過一頁,便需要每層匯出

使用 ImageMagick 轉換


當然現今網上有很多免費的網上 PDF文件 轉換成 圖像檔的資源
但如果需要轉換的 PDF文件 非常多,又需要特定操作顯示有些微調操作未必能夠滿足

由於 GIMP 能夠將 PDF文件 轉換成 圖像檔,因此在下認為指令操作的 ImageMagick 都能轉換,而且指令操作亦很適合自訂操作

先安裝 ImageMagick ,在 Terminal 輸入
sudo apt-get install imagemagick
或按此安裝 ImageMagick

見下文
在下輸入
convert "document.pdf" "document.png"
(document.pdf 及 document.png 是輸入及輸出的檔案名,替換成閣下需要轉換的檔案名)
但傳回錯誤
convert-im6.q16: not authorized `document.pdf' @ error/constitute.c/ReadImage/412.
convert-im6.q16: no images defined `document.png' @ error/convert.c/ConvertImageCommand/3258.
不能轉換成 PNG檔

見下文
見下文
以 root 或 super user 使用文字編輯器修改 /etc/ImageMagick*/policy.xml
(不同版本會有些少分別,舊版為 ImageMagick ,新版為 ImageMagick-6 ,使用 * 可以自動匹配)
尋找 <policy domain="coder" rights="none" pattern="PDF"/>
修改為 <policy domain="coder" rights="read|write" pattern="PDF"/>

見下文
見下文
再次輸入
convert "document.pdf" "document.png"
便可以整個 PDF文件 所有頁面輸出成 圖像檔
圖像檔 會自動編排頁數號碼
(輸出時偶然會有一些警告及錯誤訊息,但 PDF文件 的結構具備修正功能)

見下文
見下文
除了將整個 PDF文件 輸出,還可以指定頁面輸出
輸出第1頁 (使用 0-base 設計,第1頁 編號為 0)
convert "document.pdf[0]" "document-0.png"
輸出第1頁、第3頁 (輸出頁面超過1頁,會根據頁面自動加上編號)
convert "document.pdf[0,2]" "document.png"
輸出第1頁至第3頁
convert "document.pdf[0-2]" "document.png"

見下文
見下文
由於 預設輸出 DPI 為 72 ,若果需要輸出印刷文件,品質可能偏低
可以使用 ImageMagick 的 unitsdensity 選項來修改輸出資料
convert -units PixelsPerInch -density 300 "document.pdf[0]" "document-0.png"
以 A4 為例, 72 DPI 大約為 595x842300 DPI 大約為 2480x3508

見下文
可能在下測試的 PDF文件 過於巨大,轉換時出現錯誤
convert-im6.q16: DistributedPixelCache '127.0.0.1' @ error/distribute-cache.c/ConnectPixelCacheServer/244.
convert-im6.q16: cache resources exhausted `/tmp/magick-<Random-ID>' @ error/cache.c/OpenPixelCache/3984.
錯誤內容指 暫存資源耗盡
可以再次修改 /etc/ImageMagick-6/policy.xml
尋找 <policy domain="resource" name="memory" value="256MiB"/> 加大數值資料
但在下希望避免記憶體過度損耗,在下使用 pdfinfo 讀取頁數後,用迴圈方式轉換所有頁面
輸入
sudo apt-get install poppler-utils
或按此安裝 Poppler Utilities
f="document.pdf"
count=`pdfinfo "${f}" 2>/dev/null | grep "Pages" | awk -F " " '{print $2}'`
i="0"
while [ "${i}" -lt "${count}" ]; do
    j=`printf "%0${#count}d" "${i}"`
    command="convert -units PixelsPerInch -density 300 '${f}[${i}]' '${f:0:-4}-${j}.png'"
    echo "${command}"
    eval "${command}" 2>/dev/null
    i=$(($i+1))
done
但用迴圈方式會使用較多時間

沒有留言 :

張貼留言