在下過往如果需要將 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 的 units 及 density 選項來修改輸出資料
convert -units PixelsPerInch -density 300 "document.pdf[0]" "document-0.png"以 A4 為例, 72 DPI 大約為 595x842 , 300 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 但用迴圈方式會使用較多時間