前の投稿からずいぶんと時間が経ってしまいましたw
今回、画像が配置されていないフレームにマップされているXML属性(href=”〜”)の部分を全て削除するスクリプトを作成したので公開してみます。
ひとつ前の投稿は、InDesignでXML扱うのはデリケートですよねって話だったと思います。
で、その作業中にちょっと躓いてしまいまして。
以下のように画像をリンクしたファイルがあるじゃないですか。

↑XMLの属性にもしっかりと画像のアドレス(href=”~”)が表示されている。
でね。
「画像は消すけど、フレームと構造は残しておきたい」って時があるんです。
XML的にはXML内の要素がからっぽってことで「ここには画像が入らなかった」という意味合いを持たせたいんですね。
そういう訳で、フレームから画像のみを削除するんですが…。
属性の画像のアドレスは消えないんです。

上は、1番3番はフレームから画像を消したものになっています。
2番は画像が残ってます。
構造パネルではどう表示されているかというと…

1番はドキュメント上から画像は消えているのに「属性」の画像アドレスは残ったまま。
2番は、構造パネルから「属性」の画像アドレスだけを消しててみたですが、ひとつ前のキャプチャを見ての通りアドレスがなくても画像は生きている。
3番はこうなって欲しいっていう理想形。フレームから画像を削除、構造パネル上からも「属性」も削除、という風に2工程を踏んだものです。
ドキュメント上から画像を消しても属性が残ったままだと何が怖いかって、XML書き出したものに消したはずの画像アドレスが残ってて、レイアウトで画像を入れていますよって判断されてしまうってことなんです。
後からこのXMLを整形してCSVにし、テキスト納品する立場としては、使われていないはずの画像情報が存在しちゃうのは困ってしまう。
じゃあ画像を消すときは構造パネルから属性も削除するという作業を追加するのかと言えば、確実にひと手間増えるし、オペレータ的にはあまり構造パネルを直接いじるのはデリケートなものなので控えたい、と。
なので、ひとまず組版作業ではフレームから画像を消すという作業だけを行ってもらい、構造パネル内の属性の削除は組版後に一気に自動でやってしまおう、ということでスクリプトを作成したわけです。
/*
画像が配置されていないフレームにマップされているXML属性(href=”〜”)の部分を全て削除するスクリプト
※グループのオブジェクトは、1階層目のグループまでしか見ません。グループ内グループへの適用は不可。
プログレスバーは古籏 一浩さんの
「組版時間を半減する!InDesign自動処理実例集」を参考にしました。
グループ内のフレームを見に行くスクリプトは
http://gyoniso.blogspot.com/2008/05/indesign_26.html
を参考にしました。
2009.04.21 作成 InDesignCS3用
buruge
http://buruge.net
*/
//target CS3_J
#target “InDesign-5.0″
if(app.documents.length == 0){//ドキュメントが開かれているかの判定
alert(”ドキュメントが開かれていません。ドキュメントを開いてから再実行してください”);
exit();
}
deflg = confirm (’画像の配置されていないXML属性(href=”〜”)の部分を全て削除します。\rよろしいですか?’);
if(deflg == true){
pageObj=app.activeDocument.pages;
var pbarWidth = 400;
var max = pageObj.length;
var pbarPanel = createProgressBarPanel(max, pbarWidth,”処理中…”);
pbarPanel.show();
for(i=0;i<max;i++){
pbarPanel.progressBar.value = i;
if(pageObj[i].rectangles.length>0){
var prObj = pageObj[i].rectangles;
XML2path(prObj);
}
if(pageObj[i].groups.length>0){
var grpObj = pageObj[i].groups;
for(k=0;k<grpObj.length;k++){
var gObj = grpObj[k].rectangles;
XML2path(gObj);
}
}
}
pbarPanel.close();
alert(”完了しました。”);
}else{
alert(”中止しました。”);
}
function XML2path(recItm){
for(j=0;j<recItm.length;j++){
if(recItm[j].associatedXMLElement != null&&recItm[j].allGraphics[0]==null){
try{
recItm[j].associatedXMLElement.xmlAttributes.item(0).remove();
}catch(e){
}
}
}
}
//プログレスバー
function createProgressBarPanel(maxValue, pBarWidth, message){
var pBar = new Window (”window”, “画像配置”);
pBar.msg = pBar.add(”statictext”, [12,12,pBarWidth,32], message);
pBar.progressBar = pBar.add(”progressbar”, [12,32,pBarWidth,54], 0, maxValue);
return pBar;
}
以下のような、画像は消したのにXML属性にアドレスが残っているファイル。

これに対してスクリプトを実行すると、、、

属性が削除されます。
これでXMLを書き出しても、存在しない画像アドレスは書き出されない、と。