Tech Blog - mixross

アーカイブの中の画像をPDF化

このエントリーをはてなブックマークに追加
LINE

ツールの内容

画像ファイルが大量にアーカイブされている場合、解凍してからプレビューなどのツールで1枚1枚画像ファイルの内容をチェックするのが面倒なのでコマンド一発で画像ファイルを全て1つのPDFにするようにした。
とりあえずzipまたはrarの中のjp(e)g、pngに対応。
その他の圧縮形式や画像形式に対応したい場合は、以下のソースを少し修正すれば十分拡張は可能。

準備

Macで標準インストールされているunzip以外にunrar、ImageMagickを使うので入っていない場合はインストールする

brew install unrar
brew install imagemagick@6

ImageMagickはいくつか環境変数の設定をしなくてはいけないので、インストール時のログを参考に対応する。
自分の時は~/.bash_profileに以下を追記した。

~/.bash_profile
export PATH=/usr/local/opt/imagemagick@6/bin:$PATH
export LDFLAGS="-L/usr/local/opt/imagemagick@6/lib"
export CPPFLAGS="-I/usr/local/opt/imagemagick@6/include"

ソースコード

imgzip2pdf

#!/bin/bash

if [ $# == 0 ]; then
	echo "[Error] parameter is nothing!"
	exit 1
fi

SRC=$1
if [ ! -f $SRC ]; then
	echo '[Error] src file is not found'
	exit 1
fi

SRC_EXT=`tr '[A-Z]' '[a-z]'<<<${SRC##*.}`

if [ $SRC_EXT != "zip" ] && [ $SRC_EXT != "rar" ]; then
	echo '[Error] invalid src file type'
	exit 1
fi

if [ $# -eq 1 ]; then
	DIST=${SRC%.*}.pdf
elif [ -d $2 ]; then
	DIST=$2/${SRC%.*}.pdf
else
	DIST=$2
fi

DIST_EXT=`tr '[A-Z]' '[a-z]'<<<${DIST##*.}`

if [ $DIST_EXT != "pdf" ]; then
	DIST=$DIST.pdf
fi


TMP_DIR=$(mktemp -d /tmp/$(basename $0).XXXXXX)

if [ $SRC_EXT == "zip" ]; then
	unzip -jq -d "$TMP_DIR" "$SRC"
elif [ $SRC_EXT == "rar" ]; then
	unrar e -idq "$SRC" "$TMP_DIR"
fi

if [ $? -ne 0 ]; then
    echo "[Error] unzip error"
	rm -fr "$TMP_DIR"
    exit 1
fi

convert "$TMP_DIR/*.{jpg,jpeg,png}" "$DIST"

rm -fr "$TMP_DIR"

使い方

imgzip2pdf <アーカイブファイル> (<出力先パス>)

解説

引数の数

$#

引数の値

1個目:$1、2個目:$2、・・・、n個目:$n
ちなみに
$0
で実行時のコマンドが取得できる。

ファイル、ディレクトリの存在チェック

ファイル・存在

if [ -f $SRC ]; then
fi

ファイル・非存在

if [ ! -f $SRC ]; then
fi

ディレクトリ存在

if [ -d $SRC ]; then
fi

ディレクトリ・非存在

if [ ! -d $SRC ]; then
fi

拡張子の取得

シェルの変数展開を利用して拡張子(ドットの後続文字列)を取得している。
変数展開の例

記述 内容
${変数名#パターン} 前方一致(最短マッチ)の削除
${変数名##パターン} 前方一致(最長マッチ)の削除 ★今回使用
${変数名%パターン} 後方一致(最短マッチ)の削除
${変数名%%パターン} 後方一致(最長マッチ)の削除

ファイル名(最後のドットより前方全て)を取得する場合は

${SRC%*.}

となる。

コマンド結果を変数に格納

HOGE=`<command>`

のようにバッククオートでコマンド文字列を囲む

文字列の大文字を全て小文字に変換

trコマンドを使って小文字に変換ができる。

tr '[A-Z]' '[a-z]'

このtrコマンドに入力となる文字列をリダイレクトするには<<<を用いて

tr '[A-Z]' '[a-z]' <<< $HOGE

とする。

一時ディレクトリ作成

一時ファイルを作成するコマンドmktempに-dオプションを指定すると一時ディレクトリを作成できる。

mktemp -d <末尾にXXXXXXを指定したパス文字列>

unzipコマンド

unzip <オプション> <zipファイルパス>
オプション 内容
j ディレクトリを作成しないで展開
q 動作メッセージを減らす
d <ディレクトリパス> 展開先の指定

unrarコマンド

ディレクトリ構造を無視して展開(unzipの-jオプションと同様)する場合はeコマンドを指定して

unrar e <オプション> <rarファイルパス> <展開先ディレクトリパス>
オプション 内容
idq 出力メッセージを無しに

画像ファイルをPDFに変換(連結)

ImageMagickのconvertコマンドでできる。

RSS