Ting-Jun (snsd0805)

Ting-Jun (snsd0805)

Developer. Student

© 2019

[筆記]Linux中使用shell將pdf轉檔

事件

彰中新生報到當天會使用app掃描QRCode檢查是否完成各項資料填報,
而今年必須加入各處室的帳號,供其檢視各別處室所需事項之功能。
而出納組必須檢查新生是否完成個人銀行帳號的填報及存摺影本。
存摺影本開放上傳.jpg檔及pdf檔,而將pdf檔顯示在網頁上是容易的事。
但因本次需要在app中檢視,而ai2編寫出的app中的瀏覽器卻不支援pdf的plugin。
重點是!在編寫這部份程式碼時已經開放資料上傳、填報,因此無法限制上傳檔案。

查了一些資料,ai2編寫的app似乎在這方面是無解,
無法更改客戶端環境的情況下,只好暫時在今年修改伺服端,
將所有pdf檔轉檔程jpg檔。
我選擇了使用ImageMagick這套強大的圖片處理工具。
可使用convert轉檔指令。

安裝ImageMagick工具

彰中伺服器全部為CentOS 6,使用yum即可安裝。

	yum install ImageMagick ImageMagick-devel

#使用convert指令

	convert -density 300 input.pdf -quality 90 output.jpg

-density參數設定輸出檔的每英吋點數(dpi)
-quality參數設定圖片壓縮層級
convert指令若遇到多頁的pdf檔,會自動從0開始編碼並生成圖檔(ex: output-0.jpg)
這部份需注意名稱的變換,在後面寫shell的時候因為這個撞牆很久,一直找不到我要的檔。

使用shell自動化處理大量資料

因為系統已經開放上傳兩天,資料量已經非常龐大,
我不可能人工一個一個慢慢convert,
因此前不久學的shell指令可以派上用場,讓電腦自動化幫我工作。

找出pdf檔

因為pdf、jpg混在一起,因此要先找出pdf檔建表,
等等只要從表裡找目標物就可以開始處理了。
我使用find指令將所有pdf檔案寫入pdf_file.out文字檔中。

	find *.pdf > pdf_file.out

列表

讓使用者先知道清單中有哪些需要更改,
其實這有點無用,但就當作練習shell吧!
用迴圈讀取每一行

	filename="pdf_file.out"
	for line in `cat $filename`
	do
		echo $line
	done

處理文件

我有加了確認的步驟,雖然好像有點無用,
不過這讓我可以比較安心一點,畢竟這是在正在運作的伺服器上。

	read -p "Please input (Y/N): " choise
	if [ $choise == "Y" ]||[ $choise == "y" ] ;then
		echo "Yes"
		for line in `cat $filename`
		do
			out=${line:4:10}.jpg
			echo $out
			convert -density 300 $line -quality 90 $out
			mv $out 108/
			mv $line pdfbk/
		done
		else
			echo "No"
	fi

講其中一段

	out=${line:4:10}.jpg
	echo $out
	convert -density 300 $line -quality 90 $out
	mv $out 108/
	mv $line pdfbk/

out=${line:4:10}.jpg因取得的檔案名稱為108/N111222333.pdf格式
需取得N111222333十字,因此由4號往後數10,並把副檔名設成jpg
並使用convert指令轉檔,最後將輸出檔移至所需位置,
並把原pdf檔移至pdfbk留存備份。

pdf.sh總文件


# 編寫者:snsd0805<levi900227@gmail.com>
# 用途:新生報到bank圖檔 由pdf轉jpg
# 原因:雖電腦瀏覽器可以瀏覽pdf檔,然而app端因ai2網頁瀏覽器不支援pdf相關plugin,因此需要先轉檔使用
echo "新生報到銀行pdf轉jpg"
echo "讀取pdf檔..."
echo "寫入pdf_file.out..."
sleep 2
find 108/*.pdf > pdf_file.out

echo "以下為清單列表"

filename="pdf_file.out"
#exec<$filename
for line in `cat $filename`
do
    echo $line
done
echo ""
echo "按Y/n確認是否轉換並備份原檔至studentreg2019"
read -p "Please input (Y/N): " choise
if [ $choise == "Y" ]||[ $choise == "y" ] ;then
    echo "Yes"
    for line in `cat $filename`
    do
	out=${line:4:10}.jpg
	echo $out
	convert -density 300 $line -quality 90 $out
	mv $out 108/
	mv $line pdfbk/
    done
else
    echo "No"
fi
echo "完成"

雖然很大部份寫了無用的程式碼,然而當作練習也不錯
第一次使用shell幫助工作讓我很興奮呢!

結束