職業プログラマの休日出勤

職業プログラマによる日曜自宅プログラミングや思考実験の成果たち。リアル休日出勤が発生すると更新が滞りがちになる。記事の内容は個人の意見であり、所属している(いた)組織の意見ではない。

アンケートのマスキング

先日開催された所属バンドの演奏会は大盛況のうちに終了し、数多くのアンケートが寄せられた。
アンケートの項目には「次回の演奏会のご案内をご希望の方は住所などをご記入下さい」といった項目があり、それなりの数のお客さんがそこに記入してくれる。「それなりの数」とは言っても個人情報保護法が定める一定数(5000)には満たないため、法に沿わなくとも刑事罰を課せられることはない(たぶん)。だが、倫理上、もちろん適切な管理が必要だ。
管理の上で最も効果的で重要なのは、「限られた人しか個人情報にアクセスできない状態」を構築することだ。しかし、こういったアンケートはバンドメンバーに読んでもらうことにも大きな意味がある。この記事では、この2つを両立させる方法として、大量のページのPDFを一括でマスキング(覆い隠す/墨消し)する方法を探る。

PDF化

まずは、アンケート用紙をスキャンしてPDFにする(当然か)。ここでは自炊用に購入したScanSnapS1500が大活躍する。ほぼスペック通りのスピードでスキャンしてくれるS1500タソには惚れ惚れだ。
まあ、スキャンの方法はここで見るよりも自炊系のサイトで見た方が良いだろうから割愛〜。

JPEG化

「なぜ最初にスキャンする時にJPEGで取り込まない?」と突っ込まれそうであるが、マスキングしないオリジナルのバージョンはPDFで保存しておく方が都合が良いから最初にPDFを作成したのである。状況によってはこの工程はすっ飛ばすことができるだろう。

言うまでもなくPDFはマルチ(複数)ページ対応のフォーマットで、JPEGはシングル(単一)ページのみ対応のフォーマットであるが、さて、PDFをJPEG化するにはどうすれば良いだろうか?
ここではMacOSX付属の Automator でどうにか頑張ってみる。
こんなワークフローを作ると幸せになれる。
f:id:t_motooka:20111027225850j:image
1ステップ目。これは対象のPDFファイル(Automator的な言い方をするとFinder項目)を取得してくるアクションで、ワークフローの実行時にファイルを選択することになる(ダイアログが出てくる)。「開始場所」で使用するフォルダを指定しておくと便利!
2ステップ目の「PDFページをイメージとしてレンダリング」これがこのワークフローの中心部分。直前のアクションから渡されたPDFファイルを1ページ1枚のJPEG画像に変換してくれるのだ。ただし、作成されたJPEGファイルはランダムに決められたフォルダにごそっと格納されるので注意。
3ステップ目の「Finder項目を移動」は、前ステップの出力ファイルを、予め指定しておいたフォルダに移動してくるためのアクションだ。使わなくても何とかなるけど、使った方が楽ちん。

一括マスキング

これがこの記事の主題になるかな?
大量のJPEG画像を一気にマスキングする方法としては、筆者は Graphic Converter のバッチ処理を採用した。Graphic Converter と言えば筆者がMacに触り始めた頃(15年前くらい?)には既に普及していた有名な画像処理シェアウェアで、今ではMacAppStoreで手に入る。価格は現時点では3400円もするけど、値段に見合った価値はあると思う。

Graphic Converter を起動すると↓のような画面が出てくるので
f:id:t_motooka:20111027225851j:image
「バッチ変換を実行」を選択すると…
f:id:t_motooka:20111027225852j:image
こんな画面が出てきた。ここで…

  1. 左上の方にあるアクションは「変換」を選択する。これは単にファイルフォーマットを変換するためのアクションだと思うけど、ここではその下にある「バッチテーブル」が大事。
  2. 保存フォーマットはJPEGを選択しよう。
  3. バッチテーブルには一括で実施する処理の内容を定義する。下の「+」ボタンを押すとダイアログが出てくるので詳細を指定する。ここでは日本語化されていない項目も散見されるけど、特に問題は無いだろう。マスキングの目的で使用できそうなのは「範囲を切り取る」って奴と「Fill Rectangle」くらいかな。ここでは筆者はFill Rectangleを選択。Rectangleってのは「矩形」(くけい)で、長方形のこと。FillRectangleだと長方形を塗り潰すってところかな。
  4. 画面真ん中の「コピー元」で、処理対象のファイルを選択する。Finderのカラム表示が出来たら最高なのに。。。
  5. 画面右側の「コピー先」で、処理したファイルの出力先フォルダを選択する。
  6. 最後、画面左下の「開く」を押したらバッチ処理が開始される。間違えて右上の「完了」を押すとウィンドウが閉じられてしまうので注意(笑)

「開く」を押す直前の画面がこちら。
f:id:t_motooka:20111027225853j:image
あとはCPU君に頑張ってもらいましょうか〜。

再PDF化

GraphicConverterで一括処理が終わったら、最後の仕上げで再PDF化。これもAutomatorを使うのが良いだろう。
こんな感じ。
f:id:t_motooka:20111027225854j:image
説明は、もういいよね?(←ここまで書いてきて面倒くさがりになってきている)
一応、「イメージから新規PDFを作成」ってのがメインってところかな。で、これだけだとPDFのサイズがめちゃくちゃ大きくなっちゃうので「PDF書類内のイメージを圧縮」というAutomatorアクションを使うと良いかもしれない。
ここまで出来たら作業終了!

改善計画

上記の手順では、いくつかの問題点がある。

  1. 「JPEG化」で生成されるファイルのファイル名は、筆者の環境では [4桁の連番(ページ番号)][2桁のランダムな英数字].jpeg となった。通常は特に問題無いのだが、「2桁のランダムな英数字」の1文字目が数字だった場合、Finderやその他のツールでのソートが意図しないものになってしまうので、アンケートでもページ順が何らかの意味を持つ場合は要注意だ。改善するにはやはりシェルスクリプトとかAppleScriptとか書かないといけない、かな?
  2. GraphicConverterはもっと楽な使い方があるかもしれない。
  3. GraphicConverterを使わないでこの目的を達成するにはどうしたら良いだろう?というのも少し考えた。真っ先に頭に浮かぶのは、MacOSXやiOSの開発ツールXcodeに付属している「Quartz Composer」とAutomatorの組み合わせだが、これはもう少し色々慣れてからじゃないと難しそう。

検証環境

MacBook Pro (Early 2011)
MacOS X 10.6.8 (Snow Leopard)
Graphic Converter X 7.3(222)
Scan Snap S1500