Проверьте ссылки InDesign на отсутствие XMP - DocumentID и InstanceID - PullRequest
1 голос
/ 17 мая 2019

Я использую ExtendScript для работы с информацией метаданных .indd файлов в InDesignCC 2019.

Мое требование заключается в том, что мне нужно получить доступ ко всем метаданным отдельных ссылок, связанных с файлом .indd, и посмотреть, отсутствуют ли какие-либо метаданные ссылок DocumentID и InstanceID. Если какие-либо из метаданных ссылок не имеют значения для свойств DocumentID и / или InstanceID, мне нужно отобразить имя файла, связанного с этой ссылкой, указывая, что в этом конкретном файле отсутствует DocumentID и / или InstanceID.

Я использовал приведенный ниже скрипт для доступа к метаданным файла .indd.

$.level=0

// 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;
 var myXmp = null;

// check library and file
if (loadXMPLibrary() && myFile !== null) {
    xmpFile = new XMPFile(myFile.fsName, XMPConst.FILE_INDESIGN, XMPConst.OPEN_FOR_UPDATE);
    myXmp = xmpFile.getXMP();
     $.writeln(xmpFile.getPacketInfo());
}


if (myXmp){
      $.writeln (myXmp);
    $.writeln (XMPFile.getFormatInfo(XMPConst.FILE_INDESIGN));

}

Может ли кто-нибудь помочь мне, как я могу продолжить в этом?

1 Ответ

1 голос
/ 17 мая 2019

После того, как вы получили XMP по ссылке, т.е. xmpFile.getXMP(), вам необходимо:

  1. Используйте метод getProperty() для получения значения определенного свойства метаданных.

  2. Обычно DocumentID и InstanceID будут связаны с пространством имен схемы NS_XMP_MM, которое описывается как:

    NS_XMP_MM Пространство имен XML для схемы управления цифровыми активами XMP.

    Например, чтобы получить DocumentID, вы должны сделать что-то вроде следующего:

    var documentID = allXMP.getProperty(XMPConst.NS_XMP_MM, 'DocumentID', XMPConst.STRING);
    

Решение:

Суть ниже ( example.jsx ) выполняет следующее:

  1. Проверяет, открыт ли файл .indd, и уведомляет пользователя, если его нет.

  2. Загружает библиотеку AdobeXMPScript XMP

  3. Проверяет, что статус всех ссылок "ОК" , то есть он проверяет, что они не "Изменено" и "Отсутствует" . Если какой-либо статус ссылки не «ОК» , пользователю предлагается обновить свой статус до «ОК» .

  4. Проверяет, есть ли у каждого связанного актива DocumentID и InstanceID, и записывает их значения в Консоль JavaScript .

  5. Для любого связанного актива, который не имеет DocumentID и / или InstanceID, появляется диалоговое окно с указанием имени и пути к связанному активу.

example.jsx

$.level=0;

// Warn if there are no documents open.
if (!app.documents.length) {
  alert('Open a document and try again.', 'Missing Document', false);
  exit();
}

var doc = app.activeDocument;

// load XMP Library
function loadXMPLibrary() {
  if (!ExternalObject.AdobeXMPScript) {
    try {
      ExternalObject.AdobeXMPScript = new ExternalObject('lib:AdobeXMPScript');
    } catch (e) {
      alert('Failed loading AdobeXMPScript library\n' + e.message, 'Error', true);
      return false;
    }
  }
  return true;
}

// Check all link statuses are be ok.
function linksStatusCheck(doc) {
  for (var i = 0, len = doc.links.length; i < len; i++) {
    if (doc.links[i].status !== LinkStatus.NORMAL) {
      alert('The status of all links must be OK \nPlease update link status ' +
          'via the Links panel and try again', 'Link Status', true); 
      exit();
    }
  }
  return true;
}

function checkLinksXMP(doc) {
  for (var i = 0, len = doc.links.length; i < len; i++) {

    var linkFilepath = File(doc.links[i].filePath).fsName;
    var linkFileName = doc.links[i].name;

    var xmpFile = new XMPFile(linkFilepath, XMPConst.FILE_INDESIGN, XMPConst.OPEN_FOR_READ);
    var allXMP = xmpFile.getXMP();

    // Retrieve values from external links XMP.
    var documentID = allXMP.getProperty(XMPConst.NS_XMP_MM, 'DocumentID', XMPConst.STRING);
    var instanceID = allXMP.getProperty(XMPConst.NS_XMP_MM, 'InstanceID', XMPConst.STRING);

    // Useful for testing purposes....
    // Log properties for each link to the console.
    $.writeln('linkName: ' + linkFileName);
    $.writeln('filePath: ' + linkFilepath);
    $.writeln('DocumentID: ' + documentID);
    $.writeln('InstanceID: ' + instanceID);
    $.writeln('-------------------------------------');

    // Notify user when XMP is missing...
    if (!documentID && !instanceID) {
      alert('Link missing DocumentID and InstanceID\n' + 
          'Name: ' + linkFileName + '\n\n' +
          'Path: ' + linkFilepath, 'Missing XMP', true); 
    } else if (!documentID) {
      alert('Link missing DocumentID\n' + 
          'Name: ' + linkFileName + '\n\n' +
          'Path: ' + linkFilepath, 'Missing XMP', true); 
    } else if (!instanceID) {
      alert('Link missing InstanceID\n' + 
          'Name: ' + linkFileName + '\n\n' +
          'Path: ' + linkFilepath, 'Missing XMP', true);
    }
  }
}

if (loadXMPLibrary() && linksStatusCheck(doc)) {
  checkLinksXMP(doc);
}
...