InDesignのリンクファイルの種類は、imageTypeName、もしくはlinkTypeプロパティから取得することができます。

参照:Graphicオブジェクトの種類

 

もしくは、Graphicオブジェクトのconstructorからも取得することができます。

// 画像がリンクされたグラフィックフレームが選択されてるとして...
var selObj= app.activeDocument.selection[0]; // 選択オブジェクト
var x= selObj.allGraphics[0].constructor.name; // PSD、TIFF、JPEG...

 

しかし、いずれにしてもEPSファイルは「EPS」とわかるだけで、それがPhotoshop EPSなのかIllustrator EPSなのかそれだけでは判断できません。

もっとも「作成アプリケーションに依存しない汎用ページ記述言語がEPSだ」と言われてしまえばそれまでですが、スクリプトでファイルを扱う場合、作成アプリケーションよって挙動を変えたいときはあるものです。

 

<XMPから取得する>

比較的新しいEPSファイルであれば、XMPという汎用メタデータが記録されていますので、itemLinkプロパティからlinkXmpオブジェクトを取得し、その中のcreatorプロパティから取得することができます。

var selObj= app.activeDocument.selection[0]; // 選択オブジェクト
var res= selObj.allGraphics[0].itemLink.linkXmp.creator;
if (res.match(/Photoshop/)){
    alert ('creator: Photoshop')
} else
if (res.match(/Illustrator/)) {
    alert ('creator: Illustrator')
}

 

しかし、XMPに対応しているのはPhotoshopであれば7.0以降(2002年)なので、それよりも古い時代のEPSファイルは判定することが出来ません。

 

<InDesign上のプロパティの差から判別する>

InDesign CS4までは、EPSオブジェクトにactualPpiプロパティが「存在すればPhotoshop」「それ以外はIllustrator」といった判定法が有効でしたが、CS5以降は表面上(リンクパレット)からもEPSの解像度の情報が消え、それはできなくなってしまいました。

現在でもspaceプロパティの有無(あればPhotoshop)で大抵は判定できるのですが、「果たしてすべてのEPSファイルがその範ちゅうに収まるのか」という疑念は消えません。

 

<PS記述を読む>

EPSファイルの仕様はAdobeから公開されていますので、それに従ってファイルを読みにいくのが正攻法で、もっとも確実な方法です。

ただし、独自にドキュメントファイルを読み込むプログラムを作ったことがなければ、ファイル読み込みの基本である「ヘッダを参照して必要なデータにアクセスする」という概念自体にたどり着きません。

もちろん、頭からベタで読み込んでおよその検討をつけるということもできますが、それは冗長的で非効率です。

以下のサンプルは、EPSの仕様に従ってヘッダからPS記述開始位置を取得、その位置から必要な情報だけ読み込んでいます。

// EPSファイルがIllustrator製なのかPhotoshop製なのか
//
function whoseEPS( fObj ) {
    var rData, startPos;
    if ( (fObj !=null) && (fObj.open('r')) ) {
        fObj.encoding= 'binary';
        // header解析
        var h_binaly= String.fromCharCode(0xC5,0xD0,0xD3,0xC6); //C5D0D3C6
        var h_ascii= '%!PS';
        rData= fObj.read(4); // 0-3 byte ファイルタイプ判定部
        switch ( rData ) {
            // PS記述開始位置
            case h_binaly:
                // binaly EPS > 4-7 byte(リトルエディアン)
                rData= fObj.read(4);
                startPos= rData.charCodeAt(0)+rData.charCodeAt(1)*256+rData.charCodeAt(2)*65536+rData.charCodeAt(3)*16777216;
                break;
            case h_ascii:
                // ascii EPS > 先頭から
                startPos= 0;
                break;
            default:
                return;
        }
        // PSコメント解析
        var n= String.fromCharCode(0x0D,0x0A); // 改行コード
        var xBounds, xReso, res= {}, f=0; 
        fObj.seek(startPos,0); // PS記述開始位置にヘッドを移動
        rData= fObj.readln(); // 最初の1行は捨てる(%!PS-Adobe)
        while (!fObj.eof) {
            if (f==15) {break;}
            rData= fObj.readln(); // 1行読み込み
            if ( (rData==n) || (rData.substr(0,1) !='%') ) {continue;} // 調べるまでもない...
            if ( rData.substr(0,9) == '%%Creator' ) {
                if ( rData.indexOf('Photoshop') != -1 ) {
                    res.creator= 'Photoshop';
                } else
                if ( rData.indexOf('Illustrator') != -1 ) {
                    res.creator='Illustrator';
                    f= f | 8; // flag: reso(or 1000) < Illustratorでは解像度(%ImageData)不要
                }
                if ( ! res.creator ) {res.creator= 'unknown'; } // 不明
                rData= rData.substr(10);
                res.creatorFull= rData.replace(/(^\s+)|(\s+$)/g, '');
                f= f | 1; // flag: creator(or 0001)
                continue;
            }
            if ( rData.substr(0,13) == '%%BoundingBox' ) {
                rData= rData.substr(14);
                xBounds= rData.replace(/(^\s+)|(\s+$)/g, '').split(' ');
                res.width= xBounds[2]-xBounds[0];
                res.height= xBounds[3]-xBounds[1];
                f= f | 2; // flag: Size(or 0010)
                continue;
            }
            if ( rData.substr(0,18) == '%%HiResBoundingBox' ) {
                rData= rData.substr(19);
                xBounds= rData.replace(/(^\s+)|(\s+$)/g, '').split(' ');
                res.hiResWidth= xBounds[2]-xBounds[0];
                res.hiResHeight= xBounds[3]-xBounds[1];
                f= f | 2; // flag: Size(or 0010)
                var xxx= (f!=7 || !fObj.eof);
                continue;
            }
            if ( rData.substr(0,13) == '%%EndComments' ) {
                f= f | 4; // flag: comments(or 0100)
            }
            if ( rData.substr(0,10) == '%ImageData' ) {
                xReso= rData.substr(12).split(' ');
                f= f | 8; // flag: reso(or 1000)
                continue;
            }
        }
        fObj.close();
        // 解像度計算(Photoshop)
        if ( res.creator == 'Photoshop' ) {
            res.resoWidth= xReso[0]/res.hiResWidth*72;
            res.resoHeight= xReso[1]/res.hiResHeight*72;
        }
        return res;
    }
}

 

// 呼び出し見本(InDesign)

// EPSがリンクされたグラフィックフレームが選択されてるとして...
var selObj= app.activeDocument.selection[0]; // 選択オブジェクト
if (!selObj) {
    alert('オブジェクトが選択されていません'); exit();
}
if ( (selObj.constructor.name=='Rectangle') && (selObj.allGraphics[0].constructor.name=='EPS') ) {
    var fPath= selObj.allGraphics[0].itemLink.filePath;
    var fObj= new File( fPath );
    var res= whoseEPS(fObj);
} else {
    alert('対象のオブジェクトが選択されていません'); exit();
}
// 書き出し
$.writeln (res.creator); // 作成アプリ
$.writeln (res.creatorFull); // 作成アプリ(詳細)
if (res.hiResWidth) {
    // 基本的にはこちらを参照(単位:point)
    $.writeln ('w: '+res.hiResWidth+' pt'); // 幅
    $.writeln ('h: '+res.hiResHeight+' pt'); // 高さ
} else {
    // 古いAI EPSなど(単位:point)
    $.writeln ('w: '+res.width+' pt'); // 幅
    $.writeln ('h: '+res.height+' pt'); // 高さ
}
if ( res.creator == 'Photoshop' ) {
    $.writeln ('resoW: '+res.resoWidth); // 解像度 ヨコ
    $.writeln ('resoH: '+res.resoHeight); // 解像度 タテ
}

 

<EPSの仕様について>

ヘッダーの頭4バイト(0~3バイト目)を読むことで「バイナリ形式」か「ASCII形式」かが判別できるようになっています。 

バイナリー形式の場合、次の4バイト(4~7バイト目)にPS記述の開始位置が記録されています。

ただし、一番低い位から記録されていることに留意します(=リトルエディアン)。

あとはそこへファイルの読み込み開始位置を移動し、ループで一行ずつ読んで諸々を判定しています。 

 

特に必然性はないのですが、必要な項目を取得し終わったか否かを、ビットフラグで判定しています。

こうすることで、複数項目のフラグがひとつの変数にまとめられます。メモリーも豊富な昨今では最近あまり見かけなくなった手法ですが、AND や OR の挙動を使った判定手法は時として有用です。 

※今回、実は甘いフラグの立て方をしています。まぁ、概ね大丈夫です。

↑丁寧なものに修正しました。

 

 

Joomla templates by a4joomla