Skip to main content
emiliep89320758
Inspiring
June 29, 2018
Answered

Update metadata on active document

  • June 29, 2018
  • 1 reply
  • 1947 views

Hi,

I'm trying to add new XMP metadata on active document in InDesign CC2018 and it doesn't work.

If I run my code on a closed indesign file, it works.

What's wrong ? We could update metadata on active document, couldn't we  ?

Here is my code :

// load XMP Library

function loadXMPLibrary(){

    if ( ExternalObject.AdobeXMPScript){

        try{ExternalObject.AdobeXMPScript = new ExternalObject('lib:AdobeXMPScript');}

        catch (e){alert('Unable to load the AdobeXMPScript library!'); return false;}

    }

    return true;

}

var myFile= app.activeDocument.fullName;

// check library and file

if(loadXMPLibrary() && myFile != null){

   xmpFile = new XMPFile(myFile.fsName, XMPConst.FILE_INDESIGN, XMPConst.OPEN_FOR_UPDATE); 

   var myXmp = xmpFile.getXMP();

}

if(myXmp){

    var destNamespace = "myNamespace";

    // define new namespace

    XMPMeta.registerNamespace(destNamespace,"ns2");

    // insert nodes

    myXmp.setProperty(destNamespace,"creator","creator1");

    [...]

    // put XMP into file

    if (xmpFile.canPutXMP(myXmp)){xmpFile.putXMP(myXmp);}else{alert("Error storing XMP");}

    // close file

    xmpFile.closeFile(XMPConst.CLOSE_UPDATE_SAFELY);

}

Got this exception :

XMP Exception : Open, other failure

Thanks

Correct answer emiliep89320758

Thanks for your answer.

I don't know how to add metadata with custom namespace working on the InDesign document's MetadataPreference object.
In documentation (if I read well), it is written that document.metadataPreferences is a read-only property.

I tried to do it thanks to that :

var doc = app.activeDocument;

var metadataPreferences = doc.metadataPreferences;

metadataPreferences.setProperty("myNamespace", "myProperty", "myValue");

It doesn't work, even if I save document after that.

But, it seems to work with a known namespace like in this example :

var myDocXMP = app.activeDocument.metadataPreferences;

var destNamespace = "http://ns.adobe.com/xap/1.0/";

var destNodeName = "MyTesting";

var nodeValue = "test value";

myDocXMP.setProperty(destNamespace, destNodeName, nodeValue);

It seems like if I want to use custom namespace, I have to use this method :

var myXML = new XML("<x:xmpmeta xmlns:x=\"adobe:ns:meta/\"><rdf:RDF xmlns:rdf=\"http://www.w3.org/1999/02/22-rdf-syntax-ns#\"><rdf:Description xmlns:TestXMP=\"https://test.wordpress.com/\"></rdf:Description></rdf:RDF></x:xmpmeta>");

var myXMLfile = File('C:/Users/myUser/Desktop/myTestXMP.xml');

if ( myXMLfile.open('e') ){

   myXMLfile.write(myXML);

   myXMLfile.close();

   app.activeDocument.metadataPreferences.append(myXMLfile);

   myXMLfile.remove();

}

var myDocXMP = app.activeDocument.metadataPreferences;

var destNamespace = "https://test.wordpress.com/";

var destNodeName = "MyTestingNode2";

var nodeValue = " test value";

myDocXMP.setProperty(destNamespace, destNodeName, nodeValue);

It seems to work on active document.


Reference :

Storing custom data into InDesign file via XMP | IndiSnip [InDesign® Snippets]

1 reply

Legend
July 1, 2018

Document file locking might have improved, if it previously worked I would consider that a bug.

Instead of ExtendScript's XMP library you could work straight on the InDesign document's MetadataPreference object ...

emiliep89320758
emiliep89320758AuthorCorrect answer
Inspiring
July 2, 2018

Thanks for your answer.

I don't know how to add metadata with custom namespace working on the InDesign document's MetadataPreference object.
In documentation (if I read well), it is written that document.metadataPreferences is a read-only property.

I tried to do it thanks to that :

var doc = app.activeDocument;

var metadataPreferences = doc.metadataPreferences;

metadataPreferences.setProperty("myNamespace", "myProperty", "myValue");

It doesn't work, even if I save document after that.

But, it seems to work with a known namespace like in this example :

var myDocXMP = app.activeDocument.metadataPreferences;

var destNamespace = "http://ns.adobe.com/xap/1.0/";

var destNodeName = "MyTesting";

var nodeValue = "test value";

myDocXMP.setProperty(destNamespace, destNodeName, nodeValue);

It seems like if I want to use custom namespace, I have to use this method :

var myXML = new XML("<x:xmpmeta xmlns:x=\"adobe:ns:meta/\"><rdf:RDF xmlns:rdf=\"http://www.w3.org/1999/02/22-rdf-syntax-ns#\"><rdf:Description xmlns:TestXMP=\"https://test.wordpress.com/\"></rdf:Description></rdf:RDF></x:xmpmeta>");

var myXMLfile = File('C:/Users/myUser/Desktop/myTestXMP.xml');

if ( myXMLfile.open('e') ){

   myXMLfile.write(myXML);

   myXMLfile.close();

   app.activeDocument.metadataPreferences.append(myXMLfile);

   myXMLfile.remove();

}

var myDocXMP = app.activeDocument.metadataPreferences;

var destNamespace = "https://test.wordpress.com/";

var destNodeName = "MyTestingNode2";

var nodeValue = " test value";

myDocXMP.setProperty(destNamespace, destNodeName, nodeValue);

It seems to work on active document.


Reference :

Storing custom data into InDesign file via XMP | IndiSnip [InDesign® Snippets]

Inspiring
August 5, 2025

`var myXML = new XML("<x:xmpmeta xmlns:x=\"adobe:ns:meta/\"><rdf:RDF xmlns:rdf=\"http://www.w3.org/1999/02/22-rdf-syntax-ns#\"><rdf:Description xmlns:TestXMP=\"https://test.wordpress.com/\"></rdf:Description></rdf:RDF></x:xmpmeta>");

var myXMLfile = File('C:/Users/myUser/Desktop/myTestXMP.xml');

if ( myXMLfile.open('e') ){

   myXMLfile.write(myXML);

   myXMLfile.close();

   app.activeDocument.metadataPreferences.append(myXMLfile);

   myXMLfile.remove();`

}

 

This code does not work in InDesign version 20.5 using UXP.
It uses XML() and File() which are not supported in UXP.
can you give any suggestion How to create a custom namespace indesign uxp??