PDFをSWFに変換するPerlスクリプト
PDFをページ毎に別々のFlashムービー(SWF)に
ある仕事でPDFをページ毎に別々のFlashムービー(SWF)に変換する必要があって以下のようなスクリプトを作りました。
AjaxとFlashの連携技になるため、最終的にはできあがったswfファイルの情報を格納したXMLを出力したり、まだまだ実装が必要な機能はありますが、とりあえずswfへの変換はできているようなので今日はここまで。
日本語のフォントはPDF側に埋め込むことで解決
日本語のフォントもどうにか処理しようとxpdf-japaneseなんかもインストールしてテストしたのですが、なぜかうまくいかなかったのと無料のPDF作成ツールでもフォントの埋め込みが可能な製品が多いことが分かったので、全てのフォントがPDFに埋め込まれていないとエラーが出るようにしました。
こんなものを誰が使うの?と思いますが、せっかく紹介するので一応動作条件を。
動作環境
- XPDF
- SWFTools
- Perl
変換可能なPDFは全てのフォントが埋め込まれていて、暗号化やパスワード制限がかかっていないものです。
#!/usr/bin/perl -wT
undef %ENV;
use strict;
my $pdfinfo = '/usr/bin/pdfinfo';
my $pdffonts = '/usr/bin/pdffonts';
my $pdf2swf = '/usr/bin/pdf2swf';
my $in = shift @ARGV;
my $file;
if ($in =~ /^(.+)$/ && -f $in) {
$file = $1;
} else {
die('file does not exists');
}
my($sec, $min, $hour, $mday, $mon, $year, $wday, $yday, $isdst) = localtime();
my $time = sprintf("%04d/%02d/%02d $hour:$min:$sec", $year + 1900, $mon +1, $mday);
print "***\n";
print $time." ".$file."\n";
print "***\n";
# fontが全て埋め込まれているかをチェック
{
my $result = `$pdffonts $file`;
if($?){
die('not PDF');
}
my @res = split(/\n/, $result);
foreach (@res) {
if ($_ =~ /^.+(no)\s+(yes|no)\s+(yes|no)\s+[0-9]+\s+[0-9]$/) {
die('not embeded fonts');
}
}
}
# ページ数を取得
my $page; # ページ数
{
my $result = `$pdfinfo $file`;
if($?){
die('not PDF');
}
my @res = split(/\n/, $result);
foreach (@res) {
if ($_ =~ /^Pages:\s+([0-9]+)$/) {
$page = $1;
} elsif ($_ =~ /^Encrypted:\s+yes/) {
die('encrypted PDF');
}
}
}
# swfを作成
for (my $i=0; $i<$page; $i++) {
my $p = $i + 1;
`$pdf2swf -z -p $p -o $p.swf $file`;
if ($?) {
die('Error!!');
}
}
ちなみに、PDFを単純にひとつのSWFに変換するだけならSWFToolsだけで十分です。




最近のコメント