XMPデータまにぴゅれーしょん
水回り、要は台所・洗面・お風呂なのですが、きれいに見せるコツをひとつ。カランとか鏡とかぴっかぴかなものが水回りには沢山あります。このメッキされたものとか鏡というのはことの外汚れが目立つ物です。ですからこれらを重点的に磨きます。特に鏡とかに水跡とかを残すのはNGです。逆を言えばこの汚れの目立ちやすい物を押さえておけばそれなりに見えると言う事です。
欲を言えばお風呂も入浴後毎回床を拭って水分を取ってしまいましょう。食器を洗ったら拭きますよね?それと同じです。水分が残ったままだと水垢が付いたりミネラル分が付着して落としがたい汚れになってしまいます。
と、こんな事を書きたかったわけではありません。いや、書きたかったけど…本日はXMPデータの取り回しについて解説します。それでは続きをどうぞ。
まず見本を。
<?xpacket begin="" id="W5M0MpCehiHzreSzNTczkc9d"?> <x:xmpmeta xmlns:x="adobe:ns:meta/" x:xmptk="Adobe XMP Core 5.5-c021 79.154911, 2013/10/29-11:47:16 "> <rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"> <rdf:Description rdf:about="" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:xmp="http://ns.adobe.com/xap/1.0/" xmlns:xmpTPg="http://ns.adobe.com/xap/1.0/t/pg/" xmlns:xmpGImg="http://ns.adobe.com/xap/1.0/g/img/" xmlns:xmpMM="http://ns.adobe.com/xap/1.0/mm/" xmlns:stEvt="http://ns.adobe.com/xap/1.0/sType/ResourceEvent#" xmlns:idPriv="http://ns.adobe.com/xmp/InDesign/private" xmlns:xmpG="http://ns.adobe.com/xap/1.0/g/" xmlns:stFnt="http://ns.adobe.com/xap/1.0/sType/Font#"> <dc:format>application/x-indesign</dc:format> <xmp:CreateDate>2014-05-30T10:18:51+09:00</xmp:CreateDate> <xmp:MetadataDate>2014-05-30T10:23:39+09:00</xmp:MetadataDate> <xmp:ModifyDate>2014-05-30T10:23:39+09:00</xmp:ModifyDate> <xmp:CreatorTool>Adobe InDesign CC (Macintosh)</xmp:CreatorTool> <xmp:PageInfo> <rdf:Seq> <rdf:li rdf:parseType="Resource"> <xmpTPg:PageNumber>1</xmpTPg:PageNumber> <xmpGImg:format>JPEG</xmpGImg:format> <xmpGImg:width>256</xmpGImg:width> <xmpGImg:height>256</xmpGImg:height> <xmpGImg:image>/9j/4AAQSk・・・UkpSSn//Z</xmpGImg:image> </rdf:li> </rdf:Seq> </xmp:PageInfo> <xmpMM:InstanceID>xmp.iid:76c16fdc-12e1-45d6-b9ec-139175019196</xmpMM:InstanceID> <xmpMM:DocumentID>xmp.did:6f85e6ea-4903-49cb-8883-f40e0c875246</xmpMM:DocumentID> <xmpMM:OriginalDocumentID>xmp.did:6f85e6ea-4903-49cb-8883-f40e0c875246</xmpMM:OriginalDocumentID> <xmpMM:RenditionClass>default</xmpMM:RenditionClass> <xmpMM:History> <rdf:Seq> <rdf:li rdf:parseType="Resource"> <stEvt:action>created</stEvt:action> <stEvt:instanceID>xmp.iid:6f85e6ea-4903-49cb-8883-f40e0c875246</stEvt:instanceID> <stEvt:when>2014-05-30T10:18:51+09:00</stEvt:when> <stEvt:softwareAgent>Adobe InDesign CC (Macintosh)</stEvt:softwareAgent> </rdf:li> <rdf:li rdf:parseType="Resource"> <stEvt:action>saved</stEvt:action> <stEvt:instanceID>xmp.iid:eb0367ed-857e-43e4-9e2f-638a5070c3c3</stEvt:instanceID> <stEvt:when>2014-05-30T10:19:16+09:00</stEvt:when> <stEvt:softwareAgent>Adobe InDesign CC (Macintosh)</stEvt:softwareAgent> <stEvt:changed>/</stEvt:changed> </rdf:li> <rdf:li rdf:parseType="Resource"> <stEvt:action>saved</stEvt:action> <stEvt:instanceID>xmp.iid:edbdc381-c072-4227-be94-f156605b7e60</stEvt:instanceID> <stEvt:when>2014-05-30T10:19:16+09:00</stEvt:when> <stEvt:softwareAgent>Adobe InDesign CC (Macintosh)</stEvt:softwareAgent> <stEvt:changed>/metadata</stEvt:changed> </rdf:li> <rdf:li rdf:parseType="Resource"> <stEvt:action>saved</stEvt:action> <stEvt:instanceID>xmp.iid:76c16fdc-12e1-45d6-b9ec-139175019196</stEvt:instanceID> <stEvt:when>2014-05-30T10:23:39+09:00</stEvt:when> <stEvt :softwareAgent>Adobe InDesign CC (Macintosh)</stEvt:softwareAgent> <stEvt:changed>/</stEvt:changed> </rdf:li> </rdf:Seq> </xmpMM:History> <idPriv:DocChangeCount>5</idPriv:DocChangeCount> <idPriv:keyStampMp>AAAAAA==</idPriv:keyStampMp> <xmpTPg:Colorants> <rdf:Seq> <rdf:li rdf:parseType="Resource"> <xmpG:swatchName>黒</xmpG:swatchName> <xmpG:mode>CMYK</xmpG:mode> <xmpG:type>Process</xmpG:type> <xmpG:cyan>0</xmpG:cyan> <xmpG:magenta>0</xmpG:magenta> <xmpG:yellow>0</xmpG:yellow> <xmpG:black>100</xmpG:black> </rdf:li> <rdf:li rdf:parseType="Resource"> <xmpG:swatchName>紙色</xmpG:swatchName> <xmpG:mode>CMYK</xmpG:mode> <xmpG:type>Process</xmpG:type> <xmpG:cyan>0</xmpG:cyan> <xmpG:magenta>0</xmpG:magenta> <xmpG:yellow>0</xmpG:yellow> <xmpG:black>0</xmpG:black> </rdf:li> <rdf:li rdf:parseType="Resource"> <xmpG:swatchName>レジストレーション</xmpG:swatchName> <xmpG:mode>CMYK</xmpG:mode> <xmpG:type>Process</xmpG:type> <xmpG:cyan>100</xmpG:cyan> <xmpG:magenta>100</xmpG:magenta> <xmpG:yellow>100</xmpG:yellow> <xmpG:black>100</xmpG:black> </rdf:li> </rdf:Seq> </xmpTPg:Colorants> <xmpTPg:Fonts> <rdf:Bag> <rdf:li rdf:parseType="Resource"> <stFnt:fontName>KozMinPr6N-ExtraLight</stFnt:fontName> <stFnt:fontFamily>Kozuka Mincho Pr6N</stFnt:fontFamily> <stFnt:fontFace>EL</stFnt:fontFace> <stFnt:fontType>OpenTypeCID</stFnt:fontType> <stFnt:versionString>KozMinPr6N-ExtraLightVersion 6.017;PS 6.004;hotconv 1.0.70;makeotf.lib2.5.5900</stFnt:versionString> <stFnt:composite>false</stFnt:composite> <stFnt:fontFileName>KozMinPr6N-ExtraLight.otf</stFnt:fontFileName> </rdf:li> <rdf:li rdf:parseType="Resource"> <stFnt:fontName>KozMinPr6N-Light</stFnt:fontName> <stFnt:fontFamily>Kozuka Mincho Pr6N</stFnt:fontFamily> <stFnt:fontFace>L</stFnt:fontFace> <stFnt:fontType>OpenTypeCID</stFnt:fontType> <stFnt:versionString>KozMinPr6N-LightVersion 6.017;PS 6.004;hotconv 1.0.70;makeotf.lib2.5.5900</stFnt:versionString> <stFnt:composite>false</stFnt:composite> <stFnt:fontFileName>KozMinPr6N-Light.otf</stFnt:fontFileName> </rdf:li> &nbs p; <rdf:li rdf:parseType="Resource"> <stFnt:fontName>KozMinPr6N-Regular</stFnt:fontName> <stFnt:fontFamily>Kozuka Mincho Pr6N</stFnt:fontFamily> <stFnt:fontFace>R</stFnt:fontFace> <stFnt:fontType>OpenTypeCID</stFnt:fontType> <stFnt:versionString>KozMinPr6N-RegularVersion 6.017;PS 6.004;hotconv 1.0.70;makeotf.lib2.5.5900</stFnt:versionString> <stFnt:composite>false</stFnt:composite> <stFnt:fontFileName>KozMinPr6N-Regular.otf</stFnt:fontFileName> </rdf:li> <rdf:li rdf:parseType="Resource"> <stFnt:fontName>KozMinPr6N-Medium</stFnt:fontName> <stFnt:fontFamily>Kozuka Mincho Pr6N</stFnt:fontFamily> <stFnt:fontFace>M</stFnt:fontFace> <stFnt:fontType>OpenTypeCID</stFnt:fontType> <stFnt:versionString>KozMinPr6N-MediumVersion 6.017;PS 6.004;hotconv 1.0.70;makeotf.lib2.5.5900</stFnt:versionString> <stFnt:composite>false</stFnt:composite> <stFnt:fontFileName>KozMinPr6N-Medium.otf</stFnt:fontFileName> </rdf:li> <rdf:li rdf:parseType="Resource"> <stFnt:fontName>KozMinPr6N-Bold</stFnt:fontName> <stFnt:fontFamily>Kozuka Mincho Pr6N</stFnt:fontFamily> <stFnt:fontFace>B</stFnt:fontFace> <stFnt:fontType>OpenTypeCID</stFnt:fontType> <stFnt:versionString>KozMinPr6N-BoldVersion 6.017;PS 6.004;hotconv 1.0.70;makeotf.lib2.5.5900</stFnt:versionString> <stFnt:composite>false</stFnt:composite> <stFnt:fontFileName>KozMinPr6N-Bold.otf</stFnt:fontFileName> </rdf:li> <rdf:li rdf:parseType="Resource"> <stFnt:fontName>KozMinPr6N-Heavy</stFnt:fontName> <stFnt:fontFamily>Kozuka Mincho Pr6N</stFnt:fontFamily> <stFnt:fontFace>H</stFnt:fontFace> <stFnt:fontType>OpenTypeCID</stFnt:fontType> <stFnt:versionString>KozMinPr6N-HeavyVersion 6.017;PS 6.004;hotconv 1.0.70;makeotf.lib2.5.5900</stFnt:versionString> <stFnt:composite>false</stFnt:composite> <stFnt:fontFileName>KozMinPr6N-Heavy.otf</stFnt:fontFileName> </rdf:li> </rdf:Bag> </xmpTPg:Fonts> </rdf:Description> </rdf:RDF> </x:xmpmeta> ・ ・ ・ <?xpacket end="w"?>
ここに示したのは.inddファイルのXMPメタデータです。Indesignに限らずAdobe社のアプリケーションの多くはこのメタデータを持ちます。このXMPを扱うには色々な方法があるのですが、今回は純正のExternalObjectを利用する手順を解説します。
まず、必要なライブラリを読み込みます。
if(xmpLib==undefined) var xmpLib = new ExternalObject('lib:AdobeXMPScript');
var xmpFile = new XMPFile(fls, XMPConst.UNKNOWN, XMPConst.OPEN_FOR_READ);
このライブラリに限らず、ExternalObjectの類いは複数のインスタンスを読み込むとアプリケーションの安定性に影響を及ぼします。ですから、インスタンスが存在するかどうかをまずチェックしてからライブラリを読み込みます。2行目はXMPを含むファイルを第1引数に指定してXMPファイルオブジェクトを生成します。この時のインスタンスの生成は目的によって違いがあります。今回の物は読み出しを目的にしますので第3引数にOPEN_FOR_READを割り当てます。
続いてもほぼ定型となる部分です。
var xmpPackets = xmpFile.getXMP();
var xmp = new XMPMeta(xmpPackets.serialize());
XMPファイルオブジェクトからパケットを抽出します。続いてメタデータのシリアライズ処理を行ないます。ここまでの処理は定型だと考えて良いでしょう。メタデータ全体がシリアライズされて読み出す準備が整いました。
プロパティを読み出してみましょう。
alert(xmp.getProperty(XMPConst.NS_XMP_MM, "InstanceID").toString());
これはAIでの結果です。この系統のスクリプトはライブラリを内包するアプリケーション全てで動作するのが良い所でもあります。ちなみに使えるアプリケーションはAE、AI、BR、IC、ID、PSとなっています。ESTKは含まれていませんのでテストが面倒なのは今後考慮してほしい所でもあります。
今回利用するのは「http://ns.adobe.com/xap/1.0/mm/」の「History」プロパティです。以下をご覧下さい。
<xmpMM:InstanceID>xmp.iid:76c16fdc-12e1-45d6-b9ec-139175019196</xmpMM:InstanceID> <xmpMM:DocumentID>xmp.did:6f85e6ea-4903-49cb-8883-f40e0c875246</xmpMM:DocumentID> <xmpMM:OriginalDocumentID>xmp.did:6f85e6ea-4903-49cb-8883-f40e0c875246</xmpMM:OriginalDocumentID> <xmpMM:RenditionClass>default</xmpMM:RenditionClass> <xmpMM:History> <rdf:Seq> <rdf:li rdf:parseType="Resource"> <stEvt:action>created</stEvt:action> <stEvt:instanceID>xmp.iid:6f85e6ea-4903-49cb-8883-f40e0c875246</stEvt:instanceID> <stEvt:when>2014-05-30T10:18:51+09:00</stEvt:when> <stEvt:softwareAgent>Adobe InDesign CC (Macintosh)</stEvt:softwareAgent> </rdf:li> <rdf:li rdf:parseType="Resource"> <stEvt:action>saved</stEvt:action> <stEvt:instanceID>xmp.iid:eb0367ed-857e-43e4-9e2f-638a5070c3c3</stEvt:instanceID> <stEvt:when>2014-05-30T10:19:16+09:00</stEvt:when> <stEvt:softwareAgent>Adobe InDesign CC (Macintosh)</stEvt:softwareAgent> <stEvt:changed>/</stEvt:changed> </rdf:li> <rdf:li rdf:parseType="Resource"> <stEvt:action>saved</stEvt:action> <stEvt:instanceID>xmp.iid:edbdc381-c072-4227-be94-f156605b7e60</stEvt:instanceID> <stEvt:when>2014-05-30T10:19:16+09:00</stEvt:when> <stEvt:softwareAgent>Adobe InDesign CC (Macintosh)</stEvt:softwareAgent> <stEvt:changed>/metadata</stEvt:changed> </rdf:li> <rdf:li rdf:parseType="Resource"> <stEvt:action>saved</stEvt:action> <stEvt:instanceID>xmp.iid:76c16fdc-12e1-45d6-b9ec-139175019196</stEvt:instanceID> <stEvt:when>2014-05-30T10:23:39+09:00</stEvt:when> <stEvt:softwareAgent>Adobe InDesign CC (Macintosh)</stEvt:softwareAgent> <stEvt:changed>/</stEvt:changed> </rdf:li> </rdf:Seq> </xmpMM:History>
ご覧の様にHistoryプロパティはaction、instanceID、when、softwareAgent、changedで構成されるSeqとなっています。このシーケンスは配列と同様のものと考えて良いでしょう。
ここで1番目のデータを抽出する場合は以下の様に記述します。
xmp.getProperty(XMPConst.NS_XMP_MM, "History[1]/stEvt:when");
第2引数にあてたプロパティ名がシーケンス項目の一番目を指定しているのが分かります。ここで注意して頂きたいのがXMPのSeqのインデックスは1から始まる事です。Javascriptのように0からカウントするとエラーが返されるので注意が必要です。Javascriptでの扱いはArrayそのものです。そして、プロパティに続く「/」以下の記述が子要素へのアクセスを可能とします。この辺りが以前解説していなかった部分です。
ではこのHistoryをJavascriptで読み出してみます。
function read (fls){
var prop = "History";
var ns ="http://ns.adobe.com/xap/1.0/mm/";
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 history = "";
for (var i=1;i<=xmp.countArrayItems(ns,prop);i++){
history += xmp.getProperty(ns, prop + "[" + i + "]" + "/stEvt:when").toString() + " "
+ xmp.getProperty(ns, prop + "[" + i + "]" + "/stEvt:action").toString() + " "
+ xmp.getProperty(ns, prop + "[" + i + "]" + "/stEvt:softwareAgent").toString() + "\r";
}
return history;
}
var f = app.activeDocument.fullName.fsName;
//var f = File.openDialog().fsName;
var w = new Window('dialog',"History Reader");
var tx = w.add("edittext",undefined,"",{multiline:true});
tx.size = [540,400];
tx.text = read(f);
var bt = w.add("button",undefined,"Cancel");
w.show();
コード全体はこのようになります。わりと素直な流れですので詳細な解説は省きます。
結果は、
この様にUIのedittextの方に返してみました。
ついでなのでBridgeでも読める様にしてみましょう。
addMenu = {
menuCommandID : "showHistory",
run : function() {
if ($._metaPg==undefined) defineMetaPg();
var menuItem = new MenuElement("command", "History",
"before Thumbnail/Open", this.menuCommandID);
menuItem.onSelect = function () {
if(app.documents.length>0) $._metaHistory.read();
}
}
}
function defineMetaPg() {
$._metaHistory ={
ns : "http://ns.adobe.com/xap/1.0/mm/",
prop : "History",
read : function(){
var ns = "http://ns.chuwa.sytes.net/idcomment/1.0/";
if(xmpLib==undefined) var xmpLib = new ExternalObject('lib:AdobeXMPScript');
var xmpFile = new XMPFile(app.document.selections[0].path, XMPConst.UNKNOWN, XMPConst.OPEN_FOR_READ);
var xmpPackets = xmpFile.getXMP();
var xmp = new XMPMeta(xmpPackets.serialize());
var history = "";
for (var i=1;i<=xmp.countArrayItems(this.ns,this.prop);i++){
history += xmp.getProperty(this.ns, this.prop + "[" + i + "]" + "/stEvt:when").toString() + " "
+ xmp.getProperty(this.ns, this.prop + "[" + i + "]" + "/stEvt:action").toString() + " "
+ xmp.getProperty(this.ns, this.prop + "[" + i + "]" + "/stEvt:softwareAgent").toString() + "\r";
}
xmpLib.unload();
var w = new Window('dialog',"History Reader");
var tx = w.add("edittext",undefined,"",{multiline:true});
tx.size = [540,400];
tx.text = history;
var bt = w.add("button",undefined,"close");
bt.onClick = function (){w.close();};
w.show();
}
}
}
addMenu.run();
menuElementオブジェクトの操作はおなじみの物です。Thumbnail/Openの上に追加する形で処理しています。わたしもそうなのですが、他に同様の処理をするスタートアップがあると読み出し時のタイミングで前後する場合があります。順番を固定したい場合はこのスタートアップエクステンションを一つにまとめて処理すると良いでしょう。
スクリプト本体は以下からダウンロードしてください。
historyViewer.jsx.zip
historyViewerBridge.jsx.zip
ID版は
Mac:
/Applications/Adobe InDesign XXX/Scripts/Startup Scripts
Win:
C:\Program Files\Adobe\Adobe InDesign XXX\Scripts\Startup Scripts
(XXXはアプリケーションのバージョン(CS5とかCC))
この辺りに放り込んで下さい。
Bridge版のインストールは以前の記事(http://chuwa.iobb.net/tech/archive/2014/02/bridgememo.html)をお読みください。ブリッジの設定画面からアクセス出来ます。
1件のコメント