PDFを連番画像ファイルを含むZIP圧縮ファイルに変換

安価な Android 端末が出回っています。
Amazon キンドルが発売されて、投げ売り状態だった楽天の Kobo が、新品でも3000円程度で流通するようになりました。
ようやく、電子書籍を読むというライフスタイルが日本にも定着するんでしょうか。今後が楽しみです。

さて、私が持っている Huawei の IDEOS のような低スペックな端末では、PDF の文書を読むのにもひと苦労です。
低スペックな環境では、ファイルサイズが小さく高圧縮&レンダリングにマシンパワーが必要なものより、ファイルサイズが大きく冗長でも負荷をかけずに表示できるものの方が重宝される場合があります。

特にほとんどが文字の場合、ページをめくるたびに何秒も待たされるより、少々画質が荒くても(もちろん、文字が読める程度に、です)サクサクとページをめくれる方が良い事もあります。

という事で、既存の PDF ファイルの各ページを連番の JPEG ファイルにして、ZIP 形式で圧縮するスクリプトを書いてみましょう。

1. まず基本的な事

ImageMagick の convert コマンドで、次のようにタイプすると PDF のページを JPEG ファイルとして保存することができます。

convert src.pdf[1] dst1.jpg

鉤括弧の中は、ページ番号を指定します。0 ページ目から開始します。存在しないページを指定すると

convert src.pdf[999] dst999.jpg</p>

<p>Requested FirstPage is greater than the number of pages in the file: 645
   No pages will be processed (FirstPage &gt; LastPage).

とエラーになります。

2. シェルのブラケット展開で繰りかえす

エラーが出るまで繰替えせばいいので、

for n in {0..999}; do convert src.pdf[$n] dst$n.jpg || break; done

と書く事ができます。0から999ページまで指定して変換を試みて、失敗したら break で抜ける、という動作をします。

3. 圧縮ファイルにつっこむ

変換し終わったファイルから ZIP ファイルに追加していくには

for n in {0..999}; do convert src.pdf[$n] dst$n.jpg || break; zip target.zip dst$n.jpg; done

という風に、そのまま zip コマンドに投げてやれば良いです。

for n in {0..999}; do convert src.pdf[$n] dst$n.jpg || break; zip target.zip dst$n.jpg && rm dst$n.jpg; done

ZIP ファイルへの追加に成功した後、JPEG ファイルは不要ですので、削除しておきましょう。

4. 変換オプションを指定する

必須ではありませんが、convert のオプションを利用する事によって、画像サイズの指定、グレースケール化、フォントの指定など様々なことができます。詳しくは

convert --help

をご覧ください。

5. スクリプト化

以上の事を踏まえて、スクリプトにしてみます。

</p>

<h1>/!usr/bin/env bash</h1>

<p>src=$1
dst=$2</p>

<p>opt='-density 600 -resize 640 -font kochigothic'</p>

<p>dir=/tmp/$$</p>

<p>(test ! -d $dir &amp;&amp; mkdir $dir) || exit 1
test ! -f $src &amp;&amp; exit 1</p>

<p>tmp=<code>basename $dst</code></p>

<p>for n in {0..999}
do
    pict=<code>printf '%04d.jpg' $n</code>
    convert $opt $src[$n] $dir/$pict 2&gt;/dev/null || break
    pushd $dir &gt;/dev/null
    zip $tmp $pict &amp;&amp; rm $pict
    popd &gt;/dev/null
done</p>

<p>mv $dir/$tmp $dst
rmdir $dir

このスクリプトは、/tmp 以下に一時ディレクトリを作成し、そこに画像ファイルとZIPファイルを貯め込むようにしています。
実行は、以下のように使います。

pdf2cbz src.pdf dst.zip

dst.zip の名前を自動生成するようにすれば、複数ファイルの一括処理や Nautilus などのファイラから右クリックで変換、など、さらに便利に使えそうですね。

投稿者:

dyama

佐世保のシステムエンジニアです。詳しいプロフィールやこのブログについてはこちらをご覧ください。

コメントを残す

メールアドレスが公開されることはありません。

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください