WEB+DB PRESS 総集編 [Vol.1~60]のPDFサイズがでか過ぎたからAutomatorとAppleScript使って圧縮した

でかすぎる。どうすればいいのかもふもふ調べていたら、

という記事を発見。これは素晴らしい。


MacだとAutomatorなるものを使えばPDFの画像を圧縮することが可能なようです。

で、そのサービスなのですが、上記のURLの文章中にあるんでありがたくダウンロードさせていただきまして。Automatorにサービスを登録します。登録方法については以下のURLをご覧ください。とはいえまあ普通に保存するだけです。

で、サービスを登録するとPDF選択時のコンテキストメニューから利用できるようになります。さっそくコンテキストメニューからサービスを実行してみたところ、

    • webdb_sp_vol01-24.pdf
    • 58.2MB→12.7MB
    • 78%減

よくやった。

で、他のファイルでもいくつかやってみたところだいたい約30〜60%減が最低ラインですね。画像が少ないとこんなもんでしょう。画像部分についてはiPhoneで確認したところ細かい文字も読むことができました。

ちなみにプレビュー.appで保存時にQuartz フィルタのReduce File Typeを使っても圧縮できるようですが、それだとやっぱり細かい文字はつぶれて読めませんでした。圧縮したときのサイズは上と同じファイルで9.7MBでした。


そういうわけでいざ全部圧縮しようと思ったらエラー。何がいけないのか分からんので、先ほどのワークフローを一部引用しつつ自分でアレンジしてみた。

  • 変更箇所
    • 1度に圧縮せずに1つ1つ圧縮するようにした
      • メモリが圧迫されるのでどうにかなるかと思ったらどうにもならずメモリパンパン意味なし。プロセスぷっつんしかないんかな。この辺の知識まったくない
      • 1つ1つの処理はループ使ってる。実はこれはAutomatorだとかなりやり辛い。Automatorのループは終了時の条件は制限があってこちらのタイミングで終わらすことができない。◯◯分後に停止ってのと、◯◯回で停止としてしか決定できない。あらかじめループ回数が決まってないと使えないという...。よって今回はプロセスぷっつんしたというゴリ押し
      • どうやらAutomator RunnerとAutomator Launcherがサービスを実行しているらしい。他にもなんかみかけたけどとりあえずまあいいや
    • オリジナルとサイズ比較して軽い方を残している
      • 圧縮したからといって軽くなるとは限らないので


そんなわけでワークフローは結局書いた意味がほぼなかったので公開しませんが、AppleScriptからシェルスクリプト実行のくだりだけ。

tell application "Finder"
    set len to length of (selection as list)
    if len = 0 then
        delay 3
        display dialog "圧縮作業が終了しました"
        do shell script "pids=(`ps -ef | grep -e'[A]utomator Runner' -e'[A]utomator Launcher'| awk  '{print $2}'`);for pid in ${pids[*]};do kill -9 ${pid};done"
    end if
end tell

こうやって実行できるAppleScriptすばらしい。


そんなわけで最終的にどうなったかというと、

2.85GB→1.97GB

となりました。約30%減。伸び悩んでます。まだ大きいです。テキストだけ抽出するというのはちょっと違いますからね...。このあたりで我慢するしかないかな。

AppleSctipt面白い

AppleScriptシェルスクリプトも実行できるから便利。さらにtell application "System Events"でGUIのアプリも操作できるようで。正規表現が無いのが辛いけどperlrubypythonで扱えるっぽい。詳しくは読んでないけど検索でひっかかってた気がする。

また、AutomatorAppleScriptシェルスクリプトを実行することができる。ループと変数が使いやすくなったら誰でも良いプログラミングできそう。