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