孫まで収集します。

インデザインやイラストレータのパッケージ処理って楽ちんで便利ですよね? しかしながら、この便利な機能にも穴があります。それは孫ファイルまで集めてくれないことです。今回はそんな不満を解消する為に少しひねったものを用意しました。
作りこんでいませんのでほぼ「動作するコンセプトコード」のレベルですが、わたしの作業手順においてはこれで充分に事足ります。まあ、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/&#8221;;
    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;
    }<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));="" (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);" (lk.length="=0)" (j="0;j<lk.length;j++){" (k="0;k<fldrs.length;k++){" tg="File(fldrs[k]" lk[j]);="" (!tg.exists)="" tg.copy(dst="" flg="true;" break;="" (!flg)="" logfile.writeln("collect="" error="" :="" lk[j]="" +"="" not="" found.");="" logfile.writeln("end="" function="" getlinks="" (fls){="" prop="Manifest" ;="" ns="http://ns.adobe.com/xap/1.0/mm/&quot; if(xmplib="=undefined)" xmplib="new" externalobject('lib:adobexmpscript');="" xmpfile="new" xmpfile(fls,="" xmpconst.unknown,="" xmpconst.open_for_read);="" xmppackets="xmpFile.getXMP();" xmp="new" xmpmeta(xmppackets.serialize());="" str="" result="[];" (var="" i="1;i<=xmp.countArrayItems(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/&#8221;;
    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

リンクファイルが見つからない場合は上記のようにログファイルにエラーが記録されます。
ちなみに、jsxファイルは以下からダウンロードできます。

ID_collector.jsx.zip

広告

孫まで収集します。」への1件のフィードバック

  1. 大変参考になりました。
    これを元にリンクファイルの分版チェックを早速作りました。
    小さいオブジェクトや薄い色は目視チェックでは見落としてしまうので…。
    そういえば、この記事とは関係ありませんが、以前、zxpがcs6だと認証できないと
    質問したのですが、素人ながらbundleをcs5のものを見ながら書き換えたら通るように
    なりました。ありがとうございました。

コメントを残す

以下に詳細を記入するか、アイコンをクリックしてログインしてください。

WordPress.com ロゴ

WordPress.com アカウントを使ってコメントしています。 ログアウト /  変更 )

Google フォト

Google アカウントを使ってコメントしています。 ログアウト /  変更 )

Twitter 画像

Twitter アカウントを使ってコメントしています。 ログアウト /  変更 )

Facebook の写真

Facebook アカウントを使ってコメントしています。 ログアウト /  変更 )

%s と連携中