孫まで収集します。

最終更新日

Comment: 1

インデザインやイラストレータのパッケージ処理って楽ちんで便利ですよね? しかしながら、この便利な機能にも穴があります。それは孫ファイルまで集めてくれないことです。今回はそんな不満を解消する為に少しひねったものを用意しました。
作りこんでいませんのでほぼ「動作するコンセプトコード」のレベルですが、わたしの作業手順においてはこれで充分に事足ります。まあ、EPSも孫収集処理対象にすれば大体はカバーできるでしょうが…

トイウコトデ、以下をご覧あそばせ

var lnks = app.activeDocument.links;
var fldrs = [];
var lk = [];
var tg;
var flg = false;
var dst = Folder.selectDialog(“select New Folder”).fsName +”/”;
var fls = Folder(app.activeDocument.filePath).getFiles();
fldrs.push(Folder(app.activeDocument.filePath).fullName);
var logFile = File(dst + “collectocr_log.txt”);

for (var i=0;i<fls.length;i++)
    if (fls[i].type==undefined)
        fldrs.push(fls[i].fullName);
var log = logFile.open(“w”);
logFile.writeln(“Start collect  ” + new Date());
for (i=0;i<lnks.length;i++){
    fileObj = File(app.activeDocument.links[i].filePath);
    fileObj.copy(File(dst + app.activeDocument.links[i].name));
    if (app.activeDocument.links[i].filePath.substr(
        app.activeDocument.links[i].filePath.length-2,
        app.activeDocument.links[i].filePath.length)!=”ai”) {
            continue;
            }
    lk = getLinks(fileObj.fsName);
    if (lk.length==0) continue;
    for (j=0;j<lk.length;j++){
        for (k=0;k<fldrs.length;k++){
            tg = File(fldrs[k] + “/” + lk[j]);
            if (!tg.exists) continue;
            tg.copy(dst + lk[j]);
            flg = true;
            break;
            }
        if (!flg)
            logFile.writeln(“Collect Error : ” + lk[j] +”  not found.”);
        flg = false;
        }
    }
logFile.writeln(“End collect  ” + new Date());

function getLinks (fls){
    var prop = “Manifest”;
    var ns =”http://ns.adobe.com/xap/1.0/mm/”;
    if(xmpLib==undefined)
        var xmpLib = new ExternalObject(‘lib:AdobeXMPScript’);
    var xmpFile = new XMPFile(fls, XMPConst.UNKNOWN, XMPConst.OPEN_FOR_READ);
    var xmpPackets = xmpFile.getXMP();
    var xmp = new XMPMeta(xmpPackets.serialize());
    var str = “”;
    var result = [];
    for (var i=1;i<=xmp.countArrayItems(ns,prop);i++){
        str = xmp.getProperty(ns, prop + “[” + i + “]” + “/stMfs:reference/stRef:filePath”).toString();
        result.push(str.slice(str.lastIndexOf(“/”)+1));
        }
    return result;
    }

ざっくり俯瞰していただけましたでしょうか? コード自体はそう難易度の高い処理をしている部分はございませんです。手順としては、リンクリストを所得しコピー、リンクファイルがイラストレータのものであれば内包するリンクファイルのリストも取得し、ファイルを収集する。というかんじです。
ご注意頂きたいところはリストの取得手段です。インデザインではドキュメンと直下にリンク関連のプロパティが存在します。しかし、そのリンクファイルの内包するものまで見る事のできるものはありません。こういった場合、対象リンクファイル自身から情報を取ってこなければいけません。良くやられる手法はBridgeTalkで対象ファイルを開いて処理する方法ですが、一々パタパタファイルを開くのも無粋なものです。今回のものはスマートにさらりと処理させたかったので、ファイル自身の持つXMPデータより情報を抜き出すことにしました。
以下の部分がそのファンクションです。

function getLinks (fls){
    var prop = "Manifest";
    var ns ="http://ns.adobe.com/xap/1.0/mm/";
    if(xmpLib==undefined) 
        var xmpLib = new ExternalObject('lib:AdobeXMPScript');
    var xmpFile = new XMPFile(fls, XMPConst.UNKNOWN, XMPConst.OPEN_FOR_READ);
    var xmpPackets = xmpFile.getXMP();
    var xmp = new XMPMeta(xmpPackets.serialize());
    var str = "";
    var result = [];
    for (var i=1;i<=xmp.countArrayItems(ns,prop);i++){
        str = xmp.getProperty(ns, prop + "[" + i + "]" + "/stMfs:reference/stRef:filePath").toString();
        result.push(str.slice(str.lastIndexOf("/")+1));
        }
    return result;
    }

受け取ったファイルパスよりメタデータを参照し、リンクリストを返します。まあ、細かいマニピュレーションは以前解説していますので割愛します。
今回のものは特にファイルやフォルダの取り回しを多用しています。ファイルオブジェクトをそのまま使う場合やfullPathなど文字列を抽出してパスを再構成する処理など参考にしていただくとよろしいかと思います。
また、リンクされている孫ファイルはカレントディレクトリ以下に内包することが前提で処理しています。

Start collect Thu Nov 13 2014 10:37:05 GMT+0900
Collect Error : bara.eps not found.
End collect Thu Nov 13 2014 10:37:05 GMT+0900

リンクファイルが見つからない場合は上記のようにログファイルにエラーが記録されます。

ten_a

Graphic Designer, Scripter and Coder. Adobe Community Professional.

シェアする