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中的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個開始比較,這點是有差别的。