Perlでpdfをjpgに変換してzipにする

ComicGlass|ComicReaderなるものがある。
zip圧縮したjpg(or png)を読めるアプリで、ちょっと試したくなったのでやってみた。

まず、下準備。

pdfをjpgに変換するのに一番簡単なのは、ImageMagickを使うこと。ImageMagickはpdfを読める。テキストとか日本語フォントとか面倒なことを考えなければ全く簡単。そしてImageMagickにはGhostscriptが必要。GhostscriptにはGSviewが必要。
そういう訳で、GSview→Ghostscript→ImageMagickの順にインストールする。
GSviewとGhostscriptは、http://auemath.aichi-edu.ac.jp/~khotta/ghost/からダウンロードできる。
ImageMagickググるべし。
普通にインストールしたらパスが通る(DOSプロンプトでpathと打ち込んだら、ImageMagickディレクトリが出てくる)ので、これで下準備は終了

pdfをjpgに変換する

DOSプロンプトでコマンドラインからこう入れる。

convert -density 200x200 temp.pdf temp.jpg

densityは作成されるjpgの解像度。数値の単位はdpi。縦と横でdpiを変えられるのだろうか。昔の国産PCみたいだな。
続けて変換元ファイル名と変換後ファイル名をおいて実行。

jpgをzipに圧縮する。

ここは純粋にPerlで。

use Archive::Zip;
my $zip = Archive::Zip->new(); # 書庫を一つ作る。
$zip->addFile('temp.jpg'); # ファイルを追加する。好きなだけ繰り返す。追加の順番に注意。
$zip->writeToFileNamed('out.zip'); # out.zipの名前で保存する。

一つにまとめてみた。

なお、このスクリプトは、ScanSnap付属の楽2ライブラリパーソナルでの使用を想定している。
上記アプリケーションで取り込んだ画像は、1ページが1pdfファイルになって、バインダと言う単位でまとめられる。バインダにまとめられたファイルは、一つのバインダに対応したディレクトリに保存される。以下のスクリプトをバインダフォルダに置いて実行すると、そのフォルダに自動的にout.zipを作成する。
なお、モジュールが足りないと言われた時は、cpanで入れてください。今のActivePerlならDOSプロンプトからcpan打ってinstall モジュール名で済むので大変楽。

use strict;
use warnings;
use File::Copy;
use Cwd qw(cwd abs_path);
use Archive::Zip;

my $file = (split /\//, cwd())[-1];
print "$file\n";
my $ext = '.pdf';
my $count = 1;
my $temp = 'temp.pdf';
my $zip = Archive::Zip->new();

my @temps = ();

while ( 1 ) {
	my $filename = $file.$count.$ext;
	$count == 1 and $filename = $file.$ext;
	-e $filename or last;
	copy($filename, $temp);
	my $outfile = $count.'.jpg';
	my $cm = "convert -density 200x200 $temp $outfile";
	system($cm);
	++ $count;
	$zip->addFile($outfile);
	push @temps, $outfile;
	print "$outfile ";
}
$zip->writeToFileNamed('out.zip'); # 保存する。
unlink @temps; # 作ったjpgは始末しておく。
unlink $temp;

こうしてできたout.zipを転送するなり一旦Webにあげるなりしてから、Comic Glassアプリに渡すと、本が読めると言う寸法だ。
ちなみに、B6漫画単行本1冊を試しにやってみたら55メガバイト程度になった。1ギガあれば18冊くらいか。ページで言うと約3,500ページ。
花より男子カバチタレ!天使な小生意気天使禁猟区、アリーズ、鉄腕バーディー、バナナフィッシュ、彼氏彼女の事情BLACK CAT、これぐらいは1ギガで入るんじゃなかろうか。こち亀ゴルゴ13パタリロはメモリ全部を使い潰す気にならないと無理かなあ。まあ、圧縮次第だろうけど。