M.C.P.C.

―むり・くり―プラスコミュニケーション(更新終了)


| トップページ |

2005年7月 2日 00:00

PDFのページサイズとかCreator、Producer別にフォルダを作ってより分けるスクリプト(未完成、キケン)

このエントリーをはてなブックマークに追加 mixiチェック

PDF ワークフローとかを1年くらい前真面目に研究したところ、PDF ワークフローに必要なツールがまるでないことに気付きました。というわけで、PDF ワークフローなんてまともにできるわけねーと適当にレポート出しておいて、FACILIS X-Plate PDF でお茶を濁していたのですが、そんなわけにはいかなくなりました。

何が問題かって、ページ物の単ページ PDF を面付けするとき、それらがはたしてすべて同じ大きさになっているかどうか、調べるツールがねえじゃん、ていうことです。やり方にもよりますが、大きさ依存で基準点を取ると、変な大きさの PDF が混ざっているとアウトだったりセーフだったりします。

というわけで、ページサイズによって単ページ PDF をより分ける仕組みを作らなければならなくなりました。

~~~

例えば、下の図のような PDF 群を、ページサイズによってより分けるにはどうすればいいのでしょうか。

pdfclass-1
▲いちいち開かなくてもページサイズが分かればなあ。

というわけで、以下のようなスクリプトを作りましたので、ご査収ください。Win32 ActivePerl 用、UTF-8 で。ちなみにバグ付きなので、安易に使って PDF がなくなったり、変なフォルダを勝手に掘られたりしても知りません。当方で実際に起きているので。あと、今回のやつは、Xpdf を使います。Xpdf については、

にてほとんど触れていないような状態で触れています。Xpdf といえば、Namazu 検索サーバを立てた人ならおなじみっぽいですが。

#!/usr/bin/perl -w
 
# Filename: PDFclassi.pl
#           ActivePerl 5.8.6 (Win32) で確認したよ。
# Usage: ドラドロしてください。
#        (要ドラドロできるようになるソフト)
#        もしくはコマンドライン
#        C:\> perl PPFclass.pl 20050701ほげ.pdf
#
# オプションで指定できるとカッコイいけどめんどくさそうなので、
# じか指定です。分類したい Key を $key に設定してください。
#
# [key]           [凡例]
# Title          ill8-offset.ai
# Creator        Adobe Illustrator 8.0
# Producer       Adobe PDF Library 4.0
# CreationDate   05/21/05 13:25:45
# ModDate        06/21/05 13:25:46
# Tagged         no
# Pages          1
# Encrypted      no
# Page size      595 x 842 pts (A4)
# MediaBox           0.00     0.00   595.00   842.00
# CropBox            0.00     0.00   595.00   842.00
# BleedBox           0.00     0.00   595.00   842.00
# TrimBox            0.00     0.00   595.00   842.00
# ArtBox             0.00     0.00   595.00   842.00
# File size      2163 bytes
# Optimized      no
# PDF version    1.3
#
# 【バグ情報】
# 現時点で、0x5C 問題があるので、
#「表」「ソ」「十」など使っているとダメ。
# ファイル名が変更されてしまったり、
# 行方不明になったり。マジヤバいから。
# Windows 以外 ならいいカモ。
 
use strict;
use File::Basename;
use File::Copy;
use utf8;
#use Encode;
 
# key はここでセット。
 
my $key = 'Page size';
 
# ARGVが有るだけループ回す
 
foreach my $argv (@ARGV) {
 
    my $fullpath = $argv;
 
    #    ( my $filename, my $dir )
    #    = fileparse( Encode::decode('cp932',$fullpath));
    ( my $filename, my $dir ) = fileparse($fullpath);
 
    #    $dir = Encode::encode('cp932', $dir);
    #    $filename = Encode::encode('cp932', $filename);
 
    my %property;
    my @data = `"C:\\Program Files\\Xpdf\\pdfinfo" -box "$fullpath"`;
 
    foreach (@data) {
        ( my $key, my $val ) = split(/: +/);
        chomp $val;
        $property{$key} = $val;
    }
 
    # 特定のキーの値と同じ名前のディレクトリを作って、
    # そこに移動させる。
 
    ( my $newdir = $property{$key} ) =~ s/ //g;
    $newdir =~ s/[^\w-\.\(\)]//g;
    $newdir = $dir . "\\" . $newdir;
    mkdir $newdir or die unless ( -e $newdir );
    move $fullpath, $newdir or die $!;
}
 

で、実行すると、こんな感じでフォルダごとに分類がされます。

pdfclass-2
▲ページサイズ別

pdfclass-3
▲Producer 別

~~~

Adobe Bridge って、こういう分類ってできるんでしょうか。これができないとなると、僕の認識は、アドビの人も重い点は全くアグリーですと認めている○○○ソフトとなってしまうんですが。

投稿 大野 義貴 [Script] | |

トラックバック(0)

トラックバックURL: http://blog.dtpwiki.jp/MTOS/mt-tb.cgi/1184

コメントする