07 December 2010

(Perl) jpegからpdfを作成。Image::MagickとPDF::Createの速度比較

複数のjpegファイルより1個のpdfファイルを作成する場合、どの方法が速いのかのベンチマーク

まず、オーソドックスな Imagemagick を用いた方法

#!/usr/bin/perl use strict; use warnings; use Image::Magick; use Time::HiRes; my $strInputScanPath = './*.jpg'; # 入力ファイルの検索パス my $strOutputFilename = './out.pdf'; # 出力 PDF my @arrFiles = (); # 画像ファイルの配列 # 入力ファイルを検索して、配列に格納する。 @arrFiles = glob('./*.jpg'); @arrFiles = sort(@arrFiles); if($#arrFiles < 0){ die("対象ファイルが見つからない\n"); } printf("対象ファイル数:%d個\n", $#arrFiles+1); my $timeStart = Time::HiRes::time; my $pdf = Image::Magick->new(); foreach(@arrFiles){ print($_."\n"); my $img = Image::Magick->new(); my $image_check = $img->Read($_); if($image_check){ print("$@\n"); next; } push @$pdf, $img; } print("ページを結合中...\n"); $pdf->[0]->Coalesce(); $pdf->Write($strOutputFilename); my $timeEnd = Time::HiRes::time; print "lapse=".($timeEnd - $timeStart)."\n";


次に、PDF::Create を用いた方法

#!/usr/bin/perl use strict; use warnings; use PDF::Create; use Image::Size; use Time::HiRes; my $strInputScanPath = './*.jpg'; # 入力ファイルの検索パス my $strOutputFilename = './out2.pdf'; # 出力 PDF my @arrFiles = (); # 画像ファイルの配列 # 入力ファイルを検索して、配列に格納する。 @arrFiles = glob('./*.jpg'); @arrFiles = sort(@arrFiles); if($#arrFiles < 0){ die("対象ファイルが見つからない\n"); } printf("対象ファイル数:%d個\n", $#arrFiles+1); my $timeStart = Time::HiRes::time; my $pdf = new PDF::Create('filename' => $strOutputFilename, 'Author' => 'No Author', 'Title' => 'Test Document', 'CreationDate' => [ localtime ], ); my $width_a4 = $pdf->get_page_size('A4')->[2]; # A4 横サイズ foreach(@arrFiles){ my $strImageFIle = $_; my ($width, $height) = imgsize($strImageFIle); if($width<=0 || $height<=0){print("$strImageFIle error\n"); next; } print($strImageFIle."\n"); my $nRatio = $width_a4 / $width; # ページ幅をA4サイズに合わせるための比率 # 新しいページを追加 my $container = $pdf->new_page('MediaBox' => [0, 0, $width_a4, (int($height*$nRatio))]); my $page = $container->new_page(); # 画像を読み込んで貼りつけ my $image = $pdf->image($strImageFIle); $page->image('image' => $image, 'xpos' => 0, 'ypos' => 0, 'xscale' => $nRatio, 'yscale' => $nRatio); } $pdf->close; my $timeEnd = Time::HiRes::time; print "lapse=".($timeEnd - $timeStart)."\n";

適当なPDFファイル12個を用いてベンチマークを取ったところ

Image::Magick → 4.53251695632935 秒
PDF::Create → 0.198483943939209 秒

ダントツでPDF::Createが速い。(pdf作成機能として)高機能のPDF::Createのほうが速いとは…