Skip to main content
Participant
November 25, 2021
Question

Base64 文字列から Image を作成できませんか?

  • November 25, 2021
  • 2 replies
  • 525 views

InDesign のスクリプトで、image.place("画像ファイル名") で image オブジェクトを作成できることは承知していますが、
Base64 文字列化された画像情報から image オブジェクトを作りたいと思っています。
ネット検索はしてみましたが分からないので、ご助言頂ければ嬉しいです。

This topic has been closed for replies.

2 replies

Ten A
Community Expert
Community Expert
November 25, 2021

一回デコードしてみればわかることですが、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

Sakai0D4CAuthor
Participant
November 26, 2021

ご丁寧な回答、ありがとうございます。
place() の代わりのような関数で、ファイル名でなく、Base64文字列(バイナリ化したもの)で、image オブジェクトを作る方法を知りたい、というのが質問の趣旨でした。
もちろん、idml を直接いじるつもりはなく、InDesign に用意さえれいる Script でです。
そのようなものはない、ということを承知しました。

Ten A
Community Expert
Community Expert
November 25, 2021

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に配置処理すればよいでしょう。

Sakai0D4CAuthor
Participant
November 25, 2021

やはり、ファイルに書き出してから、それを InDesigen のスクリプトで読み込むしかない、ということですね。
idml に埋め込まれた画像は Base64 なので、ファイルに書き出すことなく、直接渡せるといいなと思ったのですが。
ありがとうございました。