Lightweight Language Lovers
火事場のCPAN 〜 偉大なるLLの"おかん"Perl 〜
- 最近、1つのPDFファイルを切り分けて複数のファイルに分割する必要に迫られました。
- Windows用のフリーソフトがいくつかあるようですが、自動化を考えるとLLで処理したいものです。
ただ、今回は急で時間がほとんどありません。こんな時、火事場の○○力になってくれるのがPerlのCPANです。
PDF::API2というモジュールを使うと、本当に簡単に実現できてしまいました。CPANについてはあちこちで説明されていると思いますので、ここではポイントだけ書いておきます。
まず、CPANを使うための準備ですが、# perl -MCPAN -e shell
として、基本的にはデフォルトですすめていくのですが、proxy の設定でちょっとつまずいてしまいました。あわてていたので、そのページに出ていたとおり、Your ftp_proxy? [http://proxy:8000/]
と"[""]"(ブラケット)まで入れて答えてしまいました。(愚か・・・) 今、冷静に考えるとこれはデフォルト値が表示されている例だったのですね・・・ 普通にURLだけ入れれば良かったのです。アドレスだけ入れたり、IPアドレスで入れてみたりしてもつながらなかった訳です。
- 小一時間ほど損をしてしまいましたが、設定さえ出来ればモジュールのインストールそのものは
> install PDF::API2
で一発です。他に必要となるモジュールも自動的にインストールしてくれました。 PDF-API2-0.59.002.tar.gzの中には、サンプルと思われるプログラムがいくつか入っています。この中のpdf-merge.plが雛型として使えそうです。
CPANシェルから install コマンドでインストールした場合、どこに入ったのかがわかりませんでしたが、
今探してみると、.cpan/build/PDF-API2-0.59.002/contribにありました。- このプログラムは複数のPDFファイルをマージして1つのPDFファイルにする例です。今したいのは逆のことですが、プログラムを見ると、ページ毎に取り込んでいるようです。ということは、ここでページを指定すれば欲しいページだけに限定できそうです。
1 use PDF::API2; 2 3 if(2 > scalar @ARGV) { 4 print <<"EOT"; 5 #Usage: $0 <outfile> <infile1> ... <infileN> 6 Usage: $0 <outfile> <infile1,from,to> ... <infileN> 7 8 9 merges serveral pdf files into on ;-) 10 11 cheers, 12 fredo 13 EOT 14 } 15 16 my $outfile=shift @ARGV; 17 18 my $pdf=PDF::API2->new; 19 20 foreach my $in (@ARGV) { 21 (my $infile, my $page_from, my $page_to) = split /,/, $in; 22 # insert 23 # print STDERR 'loading file $in .'; 24 print STDERR "loading file $in ."; 25 # my $inpdf=PDF::API2->open($in); 26 my $inpdf=PDF::API2->open($infile); 27 my $pages=scalar @{$inpdf->{pagestack}}; 28 # foreach my $page (1..$pages) { 29 foreach my $page ($page_from..$page_to) { 30 print STDERR "$page."; 31 $pdf->importpage($inpdf,$page); 32 } 33 $inpdf->end(); 34 print STDERR " done.\n"; 35 } 36 37 $pdf->saveas($outfile); 38 39 __END__
このサンプルプログラム、改行がDOS形式なのはいいのですが、なぜか最終行だけ改行がありません。
perl -e '$/="\r\n";while (<>) {chomp;print "$_\n"}' pdf-merge.pl > pdf-merge2.pl
で変換しました。
- サンプルプログラムをほんの数行を直すだけで実現出来てしまいました。やっぱりPerlはストリートファイトでは最強なのかも知れません。最初、この記事のサブタイトルを、Perlの成功が数々のLLの発展の基礎になったという意味で、「LLの母」と考えていたのですが、「おかん」のほうがぴったりなのに気づきました。