リンクをクリップボードにコピー
コピー完了
InDesign のスクリプトで、image.place("画像ファイル名") で image オブジェクトを作成できることは承知していますが、
Base64 文字列化された画像情報から image オブジェクトを作りたいと思っています。
ネット検索はしてみましたが分からないので、ご助言頂ければ嬉しいです。
リンクをクリップボードにコピー
コピー完了
Base64はバイナリデータのASCII化ですからまずはデコードして本来のバイナリデータを取得する必要があります。
function decB64(str) {
var e = {};
var i,k;
var v = new Array();
var r = '';
var w = String.fromCharCode;
var n = [[65,91],[97,123],[48,58],[43,44],[47,48]];
for (z in n){
for(i=n[z][0];i<n[z][1];i++){
v.push(w(i));
}
}
for(i=0;i<64;i++) e[v[i]]=i;
for(i=0;i<str.length;i+=72){
var b=0,c,x,l=0,o=str.substring(i,i+72);
for(x=0;x<o.length;x++){
c = e[o.charAt(x)];
b = (b << 6) + c;
l += 6;
while(l>=8) r += w((b >>> (l -= 8)) % 256);
}
}
return r;
}
Base64文字列をこのような処理でバイナリに戻しファイルとして書き出します。書き出されたデータはオリジナルの画像データとなりますからそれをInDesignに配置処理すればよいでしょう。
リンクをクリップボードにコピー
コピー完了
やはり、ファイルに書き出してから、それを InDesigen のスクリプトで読み込むしかない、ということですね。
idml に埋め込まれた画像は Base64 なので、ファイルに書き出すことなく、直接渡せるといいなと思ったのですが。
ありがとうございました。
リンクをクリップボードにコピー
コピー完了
一回デコードしてみればわかることですが、IDMLに埋め込まれた状態の画像のBase64部分というのはオリジナルの画像データそのものです。これをマークアップしてパースしドキュメント上のインスタンスとするのがIDMLの処理になります。
IDMLはドキュメントを構築するための構造ですからJavaScriptのDOMとは異なります。IDMLを手動でパースする事は可能ですが、IDMLに従ってDOM上でトレースする形になり直接インスタンスを抜き出すのではありません。
https://wwwimages.adobe.com/content/dam/acom/en/devnet/indesign/sdk/cs6/idml/idml-specification.pdf
リンクをクリップボードにコピー
コピー完了
ご丁寧な回答、ありがとうございます。
place() の代わりのような関数で、ファイル名でなく、Base64文字列(バイナリ化したもの)で、image オブジェクトを作る方法を知りたい、というのが質問の趣旨でした。
もちろん、idml を直接いじるつもりはなく、InDesign に用意さえれいる Script でです。
そのようなものはない、ということを承知しました。