第1回 フォルダー内のJPEGファイルを連番でリネームする 第2回 他の画像形式をJPEG形式に変更する 第3回 ピクセルサイズに応じて画像ファイルをリサイズする 第4回 実行先のフォルダーを引数で指定する 第5回 case文でスクリプト内容を整理する
第6回Webページの情報をシェルスクリプトで取得する 第7回取得結果をCSVファイルやテキストファイルに出力する 第8回インターネットショートカットファイルを作成する 第9回散らかったデスクトップを片付ける 第10回時間軸でデスクトップを片付ける
第11回BashからExcelブックにアクセスする 第12回フォルダーの中のエクセル請求書ファイルを合計する 第13回フォルダの中のファイルを一括でPDFにするには 第14回整理整頓!空のフォルダを一括でデスクトップに移送する 第15回ファイル名ではなく内容判断で重複ファイルを削除するには?
第16回文章をMarkdown記法で整える 第17回複数PDFファイルから一括テキスト抽出 第18回PDFファイルから一括で大量の画像を抽出

Windows 10 Anniversary UpdateからサポートしたWindows Subsystem for Linux(WSL)。その結果としてWindows 10上でもBashを始めとするLinuxコマンドが利用可能になった。本連載ではWSLに関する情報や、Bashから実行するシェルスクリプトを紹介する。

環境変数PATHの設定を変更する

ようやく筆者の環境にもWindows 10 Insider Preview ビルド14955が配信されたため、Bash上からWin32コマンドを実行する動作を検証してみたが、確かにMicrosoftの説明どおりだ。Bashから各種コマンドが実行可能になり、BUW(Bash on Ubuntu on Windows)独自のシェルスクリプトを記述できそうである。

BUW利用者であれば、常にBash上からWin32コマンドを実行可能にするため、Bashの設定用シェルスクリプトである.bashrcで環境変数PATHの設定を変更しておくべきだ。基本的には.bashrcに「export PATH=$PATH:/mnt/c/Windows/System32」の記述を追加すればよい。その際は末尾に記述した方がシェルスクリプトの動作を妨げることがないので安全だ。

まずは環境変数PATHの現状を確認。「set | grep ^PATH」と実行すれば、環境変数PATHの内容が示される。この状態ではWin32コマンドは実行できない

「vim ~/.bashrc」などお好みテキストエディタで.bashrcを開き、末尾などに「export PATH=$PATH:/mnt/c/Windows/System32」を追加する

なお、Win32コマンドの実行はコマンドプロンプトと異なり、拡張子まで指定しなければならない。コマンドプロンプトと同じ感覚で「findstr」と実行してもエラーになり、「findstr.exe」と入力することで正しく入力できる。また、Bashの補完機能も有効になるため、[Tab]キーを押せばWin32コマンドの補完も可能だ。

.bashrcの内容を再読み込みするため、「source ~/.bashrc」を実行。先ほどの確認方法を使えば、環境変数PATHの末尾に記述した内容が加わったことを確認できる。この状態になればWin32コマンドは実行可能だ

PDFファイルを画像ファイル化する

さて、前回前々回とPDFファイルからテキストや画像を抽出するシェルスクリプトを紹介してきたが、PDF描画ライブラリ「Poppler」のパッケージには、「pdftocairo」というコマンドが用意されている。

読者諸氏としては、"cairoではなくgraphicでは?"と思われるかもしれないが、pdftocairoは2DライブラリであるCairo Graphics Libraryをバックエンドで利用しているため、この名称が用いられたようだ。

pdftocairoはPDFファイルをPNG(Portable Network Graphics)やJPEG(JPEG Interchange Format)、TIFF(Tagged Image File Format)、PostScript、EPS(Encapsulated PostScript)、SVG(Scalable Vector Graphics)といった画像形式に変換できる。さらにPDFファイルの出力やWindowsのプリンターにも対応しているが、今回はこのあたりの機能は不要だろう。

オプション内容を確認すると、変換した画像ファイルのPPI(Pixel Per Inch)を指定する「-r」など数多く存在するが、すべてを書き連ねると本稿がそれだけで終わってしまうため、「man pdftocairo」で内容を確認してほしい。

PDFファイルの活用方法はビジネスの種類によって異なるが、筆者の場合は発表会で使用されたスライドをPDFファイルで頂き、記事に用いることが多い。以前はAdobe Acrobatから出力していたが、pdftocairoを使えば面倒なメニュー操作も必要なく、コマンド一発で実行できる。いつもと同じくお使いの環境に合わせて変数の値を変更し、シェルスクリプトに実行権限を与えてからお試し頂きたい。

 #!/bin/bash

 IFS=$'\n'
 BaseDir=/mnt/c/Users/kaz/Desktop
 InputDir=$BaseDir/Input
 Format=-jpeg

 cd $InputDir
 for File in *; do
    case ${File##*.} in
        pdf|PDF )
            echo "Extracting PDF:" ${File}
            if [ ! -d ${File%.*} ]; then
                mkdir ${File%.*}
            fi
            pushd ${File%.*} >/dev/null 2>&1
                pdftocairo $Format -q ../${File} ${File%.*}
            popd >/dev/null 2>&1
            ;;
        *) ;;
    esac
 done

今回も前回紹介したシェルスクリプトを数行書き換えたに過ぎない。6行目に変数Formatを新たに追加し、17行目の実行内容を書き換えている。まず変数Formatは、そのままpdftocairoのオプションを記述している。PNG形式ならば「-png」、TIFF形式なら「-tiff」に変更すればよい。なお、TIFFの場合は圧縮形式をオプション「-tiffcompression」で指定できる。無圧縮の場合は「-tiffcompression none」、LZW圧縮の場合は「-tiffcompression lzw」と指定すればよい。この他にも「packbits」「jpeg」「deflate」が指定可能だ。

シェルスクリプトを実行すると、PDFファイルと同じフォルダーを作成し、そこに変換した画像ファイルを保存している

17行目のpdftocairoの実行も基本的には前回と同じ。メッセージの出力を抑止するオプション「-q」を指定したに過ぎない。前述のとおり、PDFファイルを画像ファイルに変換する必要性は場面に応じて異なるので、今回紹介したシェルスクリプトをベースに自分の仕事向けにカスタマイズしてほしい。

こちらは変換した画像ファイルの一覧。PDFファイルのページ数に応じて所要時間などは変化する

阿久津良和(Cactus)