天天看點

ImageMagick(1) 轉換PDF檔案至圖像

OS: Win10,Linux

相關軟體:

(1)cmder(WIndows使用)

(2)ghostscript(轉換PDF需要調用,WIndows好像不需要,Linux通過

apt install ghostscript

即可)

(3)ImageMagick ,官網下載下傳或者apt下載下傳安裝

2019-05-26更新

在Ubuntu18.04中使用convert指令轉換pdf會報如下錯誤:

$ convert -verbose -density 300 blog.pdf demo.png
convert-im6.q16: not authorized `blog.pdf' @ error/constitute.c/ReadImage/412.
convert-im6.q16: no images defined `demo.png' @ error/convert.c/ConvertImageCommand/3258.
           

網址:https://github.com/ImageMagick/ImageMagick/issues/1310 最後的回答給出了解答方案:編輯檔案

/etc/ImageMagick-6/policy.xml

第76行,修改為

<policy domain="coder" rights="read|write" pattern="PDF" />
           
ImageMagick(1) 轉換PDF檔案至圖像

本文實作使用ImageMagick中的convert指令将PDF檔案轉換為圖像檔案(png,jpg等),需要掌握的基本工具/指令有sort和convert。

convert

先介紹convert指令,詳細可以參照官網,網站https://imagemagick.org/script/examples.php 列出了convert的不同例子。

指令行選項有幾種不同的形式:

  • Image Setting
    ImageMagick(1) 轉換PDF檔案至圖像
  • Image Operator
    ImageMagick(1) 轉換PDF檔案至圖像
  • Image Channel Operator
    ImageMagick(1) 轉換PDF檔案至圖像
  • Image Sequence Operator
    ImageMagick(1) 轉換PDF檔案至圖像
  • Image Geometry
    ImageMagick(1) 轉換PDF檔案至圖像

-append:

從上至下合并圖像(Image Sequence Operator)

+append:

從左至右合并圖像(Image Sequence Operator)

-flip:

垂直翻轉

-flop:

水準翻轉

convert test.pdf demo.png
           

如果pdf檔案有n頁的話,前面步驟會生成n張圖檔,圖檔名稱分别為demo-0.png,demo-1.png,…,demo-(n-1).png,通過預設參數得到的圖像分辨率為72dpi(dots per inch),可以通過修改參數

-density

實作:

convert -density 300 test.pdf demo.png
           

300dpi分辨率已經可以接受了。

如果想要轉換pdf中的某一頁或者部分頁,可以執行下面指令:

convert -density 300 test.pdf[0] demo.png
           

test.pdf[0]表示第一頁,注意變換是從0開始的。

sort

前面得到n張demo-開頭的檔案,如果直接通過指令

convert demo-*.png -append all.png
           

其順序會無法保證,得不到想要的效果,需要先人為進行排序,Linux和Win下操作遊戲不同。

Linux

建議參考該指令手冊:

man sort

ls *png | sort -nbr -k 1.5 |convert @- -append all.png
           

sort

的常用參數及作用:

-n

:根據數值排列順序

-b

:忽略開頭空白字元

-d

:隻考慮空白和字母順序

-r

:反向順序

-k POS1,POS2

:

引用一段話進行解釋該參數:

where POS1 is the starting field position, and POS2 is the ending

field position. Each field position, in turn, is defined as: F.C

…where F is the field number and C is the character within that

field to begin the sort comparison.

使用key參數,可以用來利用不同的field來排列,每個field以空格隔開,像前面檔案名demo-0.png,這裡隻有一個field,我想在這個field的第6個數值字元開始為排列依據,忽略前面5個字元,那麼參數就為

-k 1.5

,表示排列依據為第一個field第6個字元開始,多個filed的情況一般出現在檔案中的資料排列,例如有一個檔案data.txt,其裡面的資料有:

01 Joe Sr.Designer 
02 Marie Jr.Developer 
03 Albert Jr.Designer 
04 Dave Sr.Developer
           

這樣就可以通過參數k實作不同field(每個空格間隔的字元串為一個field)的排序

Windows

Windows環境中筆者使用的是cmder終端,其指令如下:

ls *.png | sort /+7 | convert @- -append all.png
           

因為在Windows中調用的是windows系統自檢的sort指令,其文法在官網網址:https://docs.microsoft.com/en-us/previous-versions/windows/it-pro/windows-xp/bb491004(v=technet.10) 進行了詳細介紹,

/+7

表示從

第7個字元

開始作排序比較,Linux下是第6個開始比較,這點是有差别的。

繼續閱讀