複数の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のほうが速いとは…