JavaScriptで孫以下までパッケージ
- September 3, 2024
- 4 replies
- 2985 views
作業環境:Mac OS X 12.7.1_InDesign CC2023
【概要】
InDesignCCから搭載されているパッケージ機能では孫画像(AIやPSD等のリンクにリンクされているデータ)が収集出来ないという問題があります。これを回避する為にJavaScriptでデータを集められないか試しているところです。
【問題点】
データを移動させる時に更新日時が「移動した日」になってしまう。
【改善したい点】
・更新日時を変更せずに移動させたい
・コピーが出来たら完璧
【現状】
添付してあるテキストが「.jsx」の全文となりますが、問題となっている部分を此処に記述していきます。(実際のスクリプトではスプレッドを細切れに分けたりなどの作業が入りますのであくまでパッケージのみの範囲をピックアップしています)
// フォントのコピー関数
function copyFonts(sourceFontsFolder, saveFolder) {
var fontsFiles = sourceFontsFolder.getFiles();
if (fontsFiles.length === 0) return;
var fontsFolder = new Folder(saveFolder + "/Document fonts");
if (!fontsFolder.exists) fontsFolder.create();
for (var i = 0; i < fontsFiles.length; i++) {
var fontFile = fontsFiles[i];
if (fontFile instanceof File) {
try {
fontFile.copy(new File(fontsFolder + "/" + fontFile.name));
} catch (e) {
errorLog.writeln("フォントのコピー中にエラーが発生しました: " + fontFile.name + " - エラー: " + e.message);
}
}
}
}
// リンクの収集関数
function collectLinks(docFile, saveFolder) {
var doc;
try {
doc = app.open(docFile);
} catch (e) {
errorLog.writeln("リンク収集ドキュメントのオープン中にエラーが発生しました: " + docFile.name + " - エラー: " + e.message);
return;
}
var links = doc.links;
if (links.length === 0) {
doc.close(SaveOptions.NO);
return;
}
var linksFolder = new Folder(saveFolder + "/Links");
if (!linksFolder.exists) linksFolder.create();
var collectedLinks = {};
for (var i = 0; i < links.length; i++) {
var link = links[i];
var sourceFile = new File(link.filePath);
if (sourceFile.exists) {
processLink(sourceFile, link.name, linksFolder, collectedLinks);
} else {
errorLog.writeln("リンクが見つかりません: " + link.filePath);
}
}
doc.close(SaveOptions.NO);
}
function processLink(fileObj, linkName, linksFolder, collectedLinks) {
if (collectedLinks[linkName]) return;
collectedLinks[linkName] = true;
var originalDate = fileObj.modified;
var destFile = new File(linksFolder + "/" + linkName);
try {
fileObj.copy(destFile);
collectedLinks[linkName] = true;
var subLinks = getLinks(destFile.fsName);
for (var j = 0; j < subLinks.length; j++) {
var subLinkName = subLinks[j];
if (!collectedLinks[subLinkName]) {
var subLinkFile = new File(fileObj.path + "/" + subLinkName);
if (subLinkFile.exists) {
processLink(subLinkFile, subLinkName, linksFolder, collectedLinks);
}
}
}
updateLinkPath(fileObj, destFile.fsName);
destFile.modified = originalDate;
} catch (e) {
$.writeln("リンクの処理エラー: " + e.message);
}
}
// 無駄な抵抗_リンクの更新
function updateLinkPath(fileObj, newPath) {
try {
var doc = app.activeDocument;
var links = doc.links;
for (var i = 0; i < links.length; i++) {
if (links[i].filePath === fileObj.fsName) {
links[i].relink(new File(newPath));
links[i].update();
}
}
} catch (e) {
$.writeln("リンクパスの更新エラー: " + e.message);
}
}
function getLinks(fls) {
var prop = "Manifest";
var ns = "http://ns.adobe.com/xap/1.0/mm/";
if (typeof 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;
}
【現実的な解決案の候補】
1:JavaScriptのpackageforprint にてまるごとパッケージ、データのxmpを参照して孫以降のデータのみを移動(更新日時が最新になってしまう事には目をつむる)
2:AppleScriptにてBridgeTalk を経由して移動させる(corecaraさん のdtp helper 参考)
3:xmpより更新日時情報を得て、移動先で更新日時の情報を変更させる
4:孫以下の一覧を出して手動で移動
現状BridgeTalkでしか更新日時を変更せずに移動できなさそう(そもそも移動やコピーという行為自体が変更日時に引っ掛かるのでどうにもならなさそう)ではないかと思っております。
もし、どなたかBridgeTalkなしに移動させる方法などを知っている方がいたら教えていただきたいと思い書かせていただきました。kekaなどの解凍アプリだと更新日時をそのままに移動(?)出来るのでその応用が出来たら一番なのですが…ここの更新日時周りの記述に悩みます。
最有力候補はBridgeTalkなのですが…勉強出来る場所や情報などが載っているサイトなどをご存じの方がいらっしゃれば教えていただけると幸いです。
