2010-12-17(金) [長年日記]
■ 自炊PDF制作をrake化してみた(途中)
目的と手段が入れ替わってる自炊本シリーズ第N段。
自炊本制作はこないだベストプラクティスとか書いた以上、セッティングはだいたい詰められたんだけど、まだ作業が最適化されてないのが気に食わない。具体的には余白をきれいに除去するためにpdf2kindleを何度も実行してパラメタを詰めるところね。PGM→PNG化の処理を繰り返すために、スクリプトの特定の関数だけを実行したいわけだ。
そのためにいちいちスクリプトをいじるのはアホらしいし、そもそも複数の工程が含まれているんだからここはRakeの出番だろ。というわけでRake化してみているのだが、白状すると自分でRakefile書くの始めてなんだよな、今ごろ何言ってんだという話だけど*1。まぁ、いい練習台を見つけたということで。
で、それっぽく動くようなものはできたものの、依存関係がまだうまく解決できないんだよなぁ。ソースが1個しかないけど、途中の生成物が複数できる(しかも個数未定)場合のうまい指定方法がわからん。
Kindle最適化PDF生成の工程がどうなってるかというと、こんな感じ:
- ScanSnapでスキャンしたPDFから、1ページ単位の画像(pgmフォーマット)を切り出す。スクリプト実行前には何個のpgmファイルができるかわからない。
- pgmファイルから余白を削除したpngファイルを作る。ここは1対1の関係なのでまさにRakeの面目躍如。ちなみに何度も実行してチューニングしたいのはこの工程。
- 元PDFのメタデータを別途抽出する。
- pngファイル群を結合し、メタデータを設定して、最終的なPDFファイルを生成する。
問題は途中の工程で生成される画像ファイルの数がわからないことで、ファイルリストが作れない。結果として最初のタスクの依存関係がうまく書けない。たぶんRakeマスターなら知ってるうまい技があると思うんだけどなー。
なお、工程1をやめて、最初から(PDFではなく)画像としてスキャンするというソリューションもあるにはある。これは最終手段。
*1 コンパイル不要な言語で簡単なスクリプトを書く程度の日常だと、Make/Rakeが必要になる機会はあんまりない。もちろん探せばいくらでもあるんだけど。
処理を単なるメソッドにしてタスクから呼び出すのでもいいのかなと思いました。(どんなものかよく分かってませんが)
むむむ、意味がよくわからない。メソッドにできる処理ならタスクの中にも書けるんだから、本質的には何も変わらないような……?
ようするにタスク4の依存関係の記述の仕方がわからないのよ。「すべてのpngファイル」が揃わないと最後のpdf化タスクが走れないように条件をつけたい。でも「すべて」がいくつかのかは実行前にはわからないという。
で、実行中にファイルリストを生成すればいいかと思うんだけど、それを知るにはタスク1を実行しなくてはいけなくて、でもその依存関係をファイルタスクでうまく書けない。
Rakeの依存関係は面倒なので、単なるメソッドを呼び出して判定すればいいんじゃないですか?ってことでした。ソースを!
「Rakeを頼るな」という意味だとは思いもしなかったw そうかー、なにかと不便なのだな。
ソースはちょっと待ってね……あまりにぐちゃぐちゃすぎて自分でもよくわからなくなってるので。
PDFのページ数であれば、pdfinfoコマンドで取得できます。元PDFからpdfinfoでページ数を取っておいて、pngの数が一致したら、みたいな引っ掛け方?
そうするしかない感じですよねぇ、めんどいなぁ > pdfinfo
でもどっちにしろRakefileを生成するコマンドは必要だから、その時にやっちゃえばいいのかな。