Skriptujeme InDesign (29): Metadata podruhé - Grafika.cz - vše o počítačové grafice

Odběr fotomagazínu

Fotografický magazín "iZIN IDIF" každý týden ve Vašem e-mailu.
Co nového ve světě fotografie!

 

Zadejte Vaši e-mailovou adresu:

Kamarád fotí rád?

Přihlas ho k odběru fotomagazínu!

 

Zadejte e-mailovou adresu kamaráda:



VSE

Skriptujeme InDesign (29): Metadata podruhé

Adobe InDesign sazba

6. listopadu 2006, 00.00 | Tento díl našeho pravidelného seriálu bude patřit zpracování na základě XMP metadat.
Ukážeme si několik jednodušších i složitějších workflow scénářů, při kterých může
nasazení metadat a skriptů ušetřit opravdu mnoho práce.

Poté, co jsme si v minulé části ukázali, jak v dokumentech InDesignu načítat a editovat XMP metadata, dostáváme se nyní k praktickým ukázkám toho, jak metadata využít v rámci workflow.

Hromadné nastavení metadat

Naše ukázky začneme nejprve u hromadného nastavování metadat dokumentů. Jistě, jedná se zde o jakousi aplikaci ve stylu "metadata pro metadata", nastavení daným způsobem mohou být každopádně velmi důležitá nejen proto, že ušetří mnoho práce. Zásadní jsou zde rovněž třeba skutečnosti, že daným způsobem můžeme garantovat bezchybnost takovéhoto zpracování či s vkládáním metadat spojit různé další úpravy dokumentů atp.

Příklad, který na tomto místě uvedeme, ukazuje, jak automaticky nastavit metadata u všech dokumentů InDesignu umístěných v dané složce. Indikace dokumentu je zde zajištěna s pomocí souborové přípony. Ve skriptu ukazujeme i způsob, jak vypnout interaktivitu s uživatelem během zpracování: takovéto nastavení zamezí problémům, vznikajícím upozorněními InDesignu na různé nestandardní stavy v dokumentu typu chybějících písem, špatných odkazů, nesouladu s nastavenými pravidly color managementu atp.

//Hromadně nastaví metadata v sadě dokumentů z dané složky
//Vypne přitom uživatelskou interakci (a po zpracování ji opět zapne)

//Pro tento skript je lepší na začátku nemít v InDesignu otevřen žádný dokument
if(app.documents.length){alert("Uzavřete všechny dokumenty a spusťte skript znovu");exit()}

//Nastavte složku podle svých požadavků. Zde určujeme napevno:
var myFolder="/c/casopis/";
//šel by rovněž interaktivní výběr, třeba takto
//var myFolder = Folder("c/").selectDlg("Zvolte slozku s dokumenty", Folder("/c/casopis/"));
//if(!myFolder){alert("Nevybrali jste žádnou složku, končím");exit()}

//Vypneme interakci (upozorňování InDesignu na problémy typu nesprávných odkazů, chybějících písem apod.)
//Prevzato od D. Saunderse http://jsid.blogspot.com/2005/11/open-with-no-warnings.html
if (app.version == 3) {
  app.userInteractionLevel = UserInteractionLevels.neverInteract;
} else {
  app.scriptPreferences.userInteractionLevel = UserInteractionLevels.neverInteract;
}

//Metoda getFiles vytvoří pole, do kterého načte všechny dokumenty odpovídající dané souborové masce
var myFiles=Folder(myFolder).getFiles("*.indd");

//Otestujeme, zda pole není prázdné (tj. ve složce není žádný dokument s příponou .indd)
if (myFiles.length != 0)
{
    for (var i=0;i<myFiles.length;i++)  //cyklem zpracujeme jednotlivé prvky pole
    {
        var myDoc=app.open(myFiles[i]);         //otevřeme soubor
        myAddMetadata(myDoc);                   //nastavíme metadata (daná funkce je uvedena níže)
        myDoc.close(SaveOptions.yes);           //změněný dokument uložíme
    }
}
//Upozorníme na absenci dokumentů
else{
    alert("Složka " + myFolder + " neobsahuje žádný dokument InDesignu")
}

//Obnovíme interakci (upozorňování InDesignu na problémy typu nesprávných odkazů, chybějících písem apod.)
//Prevzato od D. Saunderse http://jsid.blogspot.com/2005/11/open-with-no-warnings.html
//Více též na http://jsid.blogspot.com/2006/07/sample-scripts-wont-work.html
if (app.version == 3) {
  app.userInteractionLevel = UserInteractionLevels.interactWithAll;
} else {
  app.scriptPreferences.userInteractionLevel = UserInteractionLevels.interactWithAll;
}

//Funkce pro nastavování metadat (pro podrobnosti viz přechozí díl)
//lze samozřejmě použít jakékoli další zpracování
//pro vyplnění je použito šablony pokus2.xmp, která musí existovat
function myAddMetadata(myDoc)
        {myDoc.metadataPreferences.replace(File("/c/casopis/pokus2.xmp"))}

Při vyplňování metadat si zde lze představit různé varianty. Konkrétně můžeme třeba napevno nastavovat pouze vybraná metadatové pole s pomocí následující funkce (jinak je skript identický s tím, který jsme právě uvedli):

//Nastavujeme jen vybrané vlastnosti
function myAddMetadata(myDoc)
    {myDoc.metadataPreferences.properties={author: "Josef Novák",
        copyrightInfoURL: "www.grafika.cz", copyrightNotice: "Chráněno copyrightem", copyrightStatus: CopyrightStatus.yes}
    }

Představit si lze rovněž variantu, kdy hodnotu měníme na základě jejího aktuálního stavu:

//Nastavuje na základě hodnoty metadatového pole
function myAddMetadata(myDoc)
    {if (myDoc.metadataPreferences.author=="RK")
        {myDoc.metadataPreferences.author="Richard K"}
    }

Zpracování na základě metadatových polí

Popis možných workflow scénářů, zahrnující v sobě nasazení metadat, výrazně překračuje rozsah tohoto článku. Na tomto místě tudíž uvedeme pouze několik málo ukázek, které mohou pouze naznačit potenciál a techniku dané metody, více je už na představivosti samotného čtenáře a konkrétních podmínkách jeho workflow.

Ukažme si nejprve skript, který vychází z následujícího (velmi primitivního) workflow scénáře. Uživatelé nahrávají do určené složky (např. na sdíleném síťovém disku) dokumenty InDesignu a před uložením v nich nastaví metadatové pole Urgency na panelu Origin v dialogu File Info na určitou hodnotu. Náš skript "nahlédne" do všech dokumentů dané složky, nalezne dokumenty, mající nastavenu hodnotu Urgency na 1 (resp. "High") a - přeje-li si to uživatel - dané dokumenty zobrazí v InDesignu. Daným způsobem může tedy operátor, manager projektu apod. zpracovávat vždy soubory, které takovéto zpracování v rámci daného workflow nejvíce vyžadují. Ve skriptu, jenž dané zpracování řeší, jsme z didaktických důvodů použili obdobný postup zpracování jako v předchozích příkladech, jádro zpracování je zachyceno ve funkcích (myMetadaProcess, myFilteredFilesProcess) - nikde ale není řečeno, že struktura skriptu nemůže být takto trochu, či výrazně odlišná, jak si ostatně ukážeme v dalším příkladu.

scriptidmetadata2-1f.jpg

//Otevře všechny dokumenty InDesignu z dané složky, mající XMP pole Urgency nastaveno na High
//Vypne přitom uživatelskou interakci (a po zpracování ji opět zapne)

//Pro tento skript je lepší na začátku nemít v InDesignu otevřen žádný dokument
if(app.documents.length){alert("Uzavřete všechny dokumenty a spusťte skript znovu");exit()}

//Nastavte složku podle svých požadavků. Zde určujeme napevno:
var myFolder="/c/casopis/";
//šel by rovněž interaktivní výběr, třeba takto
//var myFolder = Folder("c/").selectDlg("Zvolte slozku s dokumenty", Folder("/c/casopis/"));
//if(!myFolder){alert("Nevybrali jste žádnou složku, končím");exit()}


//Vypneme interakci (upozorňování InDesignu na problémy typu nesprávných odkazů, chybějících písem apod.)
//Prevzato od D. Saunderse http://jsid.blogspot.com/2005/11/open-with-no-warnings.html
if (app.version == 3) {
  app.userInteractionLevel = UserInteractionLevels.neverInteract;
} else {
  app.scriptPreferences.userInteractionLevel = UserInteractionLevels.neverInteract;
}

//Metoda getFiles vytvoří pole, do kterého načte všechny dokumenty odpovídající dané souborové masce
var myFiles=Folder(myFolder).getFiles("*.indd");

//Pole, do kterého se budou ukládat názvy dokumentů, vyhovujících zadané podmínce
var myFilteredFiles=new Array;

//Otestujeme, zda pole není prázdné (tj. ve složce není žádný dokument s příponou .indd)
if (myFiles.length != 0)
{
    for (var i=0;i<myFiles.length;i++)  //cyklem zpracujeme jednotlivé prvky pole
    {
    var myFile=app.open(myFiles[i]);
    myMetadaProcess(myFile);            //metadata každého dokumentu zpracujeme funkcí myMetadataProcess (viz níže)
    myFile.close(SaveOptions.no);       //dokument uzavřeme
    }

myFilteredFilesProcess();       //dokumenty vyhovující podmínce z myMetadataProcess zpracujeme

}
//Upozorníme na absenci dokumentů
else{
    alert("Složka " + myFolder + " neobsahuje žádný dokument InDesignu")
}

//Obnovíme interakci (upozorňování InDesignu na problémy typu nesprávných odkazů, chybějících písem apod.)
//Prevzato od D. Saunderse http://jsid.blogspot.com/2005/11/open-with-no-warnings.html
//Více též na http://jsid.blogspot.com/2006/07/sample-scripts-wont-work.html
if (app.version == 3) {
  app.userInteractionLevel = UserInteractionLevels.interactWithAll;
} else {
  app.scriptPreferences.userInteractionLevel = UserInteractionLevels.interactWithAll;
}

//Funkce pro zpracování metadat jednotlivých dokumentů
//V našem případě vkládá do pole myFilteredFiles názvy dokumentů,
//jež mají hodnotu XMP pole Urgency nastavenu na 1
function myMetadaProcess (myDoc)
    {var myStatus=myDoc.metadataPreferences.getProperty("http://ns.adobe.com/photoshop/1.0/","Urgency");
    if (myStatus==1){myFilteredFiles.push(myDoc.fullName)}
    }


//Zpracuje pole myFilteredFiles
function myFilteredFilesProcess ()
    {if(myFilteredFiles.length==0){alert("Urgenci 'High' nemá žádný z dokumentů dané složky")}
    else{if(confirm("Počet dokumentů se statusem High: "+myFilteredFiles.length+"\nOtevřít je v InDesignu?")){
            for(i=0;i<myFilteredFiles.length;i++){app.open(myFilteredFiles[i])}
        }
    }
    }

Metadata a uživatelský XMP panel

Pokusme se nyní ukázat celou problematiku na trochu komplexnějším workflow scénáři. Jeho základem je uživatelský panel pro XMP metadata Output, který jsme vytvořili s pomocí bezplatného nástroje Metasampler společnosti Pound Hill Software. Daný panel dovoluje zaškrtnutím určit, zda se má pro daný dokument provést výstup na tiskárně a do PDF. Uživatel dále určuje, podle jakého presetu se má výstup provést.

scriptidmetadata2-2f.jpg

scriptidmetadata2-3f.jpg

Poté, co je panel instalován na příslušné počítače (náš panel lze stáhnout zde, instaluje se do C:\Program Files\Common Files\Adobe\XMP\Custom File Info Panels), dovoluje uživatelům v InDesignu přes dialog File Info určovat dané výstupní podmínky. Dokumenty s těmito nastaveními jsou odesílány do výstupní složky, ve které dále uvedený skript provede příslušný výstup dokumentu a zpracované dokumenty odsune do podsložky Out. Více již text samotného skriptu, ke kterému ještě chceme poznamenat, že způsob jak zjistit odpovídající hodnoty pro funkci getProperty jsme popsali v minulé části tohoto seriálu, nastaveními výstupu jsme se pak zabývali před nějakým časem:

//Provede výstup dokumentů InDesignu se zadané složky na základě XMP metadat z uživatelského pole Output
//Pro tento skript je lepší na začátku nemít v InDesignu otevřen žádný dokument
if(app.documents.length){alert("Uzavřete všechny dokumenty a spusťte skript znovu");exit()}

//Nastavte složku podle svých požadavků. Zde určujeme napevno:
var myFolder="/c/casopis/";
//šel by rovněž interaktivní výběr, třeba takto
//var myFolder = Folder("c/").selectDlg("Zvolte slozku s dokumenty", Folder("/c/casopis/"));
//if(!myFolder){alert("Nevybrali jste žádnou složku, končím");exit()}


//Vypneme interakci (upozorňování InDesignu na problémy typu nesprávných odkazů, chybějících písem apod.)
//Prevzato od D. Saunderse http://jsid.blogspot.com/2005/11/open-with-no-warnings.html
if (app.version == 3) {
  app.userInteractionLevel = UserInteractionLevels.neverInteract;
} else {
  app.scriptPreferences.userInteractionLevel = UserInteractionLevels.neverInteract;
}

//Metoda getFiles vytvoří pole, do kterého načte všechny dokumenty odpovídající dané souborové masce
var myFiles=Folder(myFolder).getFiles("*.indd");


//Otestujeme, zda pole není prázdné (tj. ve složce není žádný dokument s příponou .indd)
if (myFiles.length != 0)
{
    for (var i=0;i<myFiles.length;i++)  //cyklem zpracujeme jednotlivé prvky pole
    {
    var myFile=app.open(myFiles[i]);
    myMetadataProcess(myFile);                                  //robustnější alternativa by byla třeba s try-catch
    myFile.close(SaveOptions.no);                               //dokument uzavřeme a neukládáme
    myFiles[i].rename(myFolder+"/Out/"+myFiles[i].name);        //soubor dokumentu přesuneme do složky Out
    }
}
//Upozorníme na absenci dokumentů
else{
    alert("Složka " + myFolder + " neobsahuje žádný dokument InDesignu")
}

//Obnovíme interakci (upozorňování InDesignu na problémy typu nesprávných odkazů, chybějících písem apod.)
//Prevzato od D. Saunderse http://jsid.blogspot.com/2005/11/open-with-no-warnings.html
//Více též na http://jsid.blogspot.com/2006/07/sample-scripts-wont-work.html
if (app.version == 3) {
  app.userInteractionLevel = UserInteractionLevels.interactWithAll;
} else {
  app.scriptPreferences.userInteractionLevel = UserInteractionLevels.interactWithAll;
}

//Funkce pro zpracování metadat jednotlivých dokumentů
//V tomto případě zařídí automatizovaný výstup na základě metadat
function myMetadataProcess (myDoc)
    {//Tisk
    var myPrintStatus=myDoc.metadataPreferences.getProperty("http://ns.poundhill.com/phsa/1.0/","phsprop0");
    if(myPrintStatus){var myPrintPreset=myDoc.metadataPreferences.getProperty("http://ns.poundhill.com/phsa/1.0/","phsprop1");
        myDoc.print(false,myPrintPreset)}
    //PDF export
    var myPDFStatus=myDoc.metadataPreferences.getProperty("http://ns.poundhill.com/phsa/1.0/","phsprop2");
    if(myPDFStatus){var myPDFPreset=myDoc.metadataPreferences.getProperty("http://ns.poundhill.com/phsa/1.0/","phsprop3");
        myDoc.exportFile(ExportFormat.pdfType, File(myFolder+myDoc.name.slice(0,-5)+".pdf"),false,myPDFPreset);}
    }

Naznačené možnosti zpracování lze samozřejmě v případě panelu Output dále rozšířit (nastavení výstupních podmínek pro další formáty, zápis data provedení posledního výstupu, určení osoby která výstup schválila apod.). Problémem ovšem je, že Metasampler je jen velmi omezenou ukázkovou aplikací, v případě komplikovanějších panelů je buď třeba zakoupit komerční prostředky Pound Hill Software, nebo provést ruční editaci panelů. Je tedy otázkou, zda by nebylo jednodušší k vyplňování metadatových polí takto použít spíše odpovídajícího skriptu s příslušným dialogem (jeho vytvoření necháváme v tuto chvíli na čtenáři, v případě zájmu se k němu můžeme vrátit někdy příště), jenž by se distribuoval na jednotlivé počítače. Odpověď zde závisí na podmínkách daného worklow, uživatelské panely každopádně dokáží daná XMP metadata zobrazit například i v prostředí Acrobatu u PDF dokumentu, do něhož byla přenesena.

Samotný výše uvedený skript by také zasluhoval i ve stávající formě dopracování. Týká se to třeba větší robustnosti zpracování (ošetření krizových stavů jako je třeba neexistence daného presetu apod.), přidání protokolovací funkce apod. To už je ale na požadavcích čtenáře. Na tomto místě si ještě ukažme variantu daného skriptu fungující s aktivním dokumentem:

//Provede výstup aktivního dokumentu InDesignu na základě XMP metadat z uživatelského pole Output

//Pokud není otevřen žádný dokument, tak skončíme
if(app.documents.length==0){alert("Není otevřen žádný dokument");exit()}

//Nastavíme dokument ke zpracování
var myDoc=app.activeDocument;

myMetadataProcess(myDoc);

//Funkce pro zpracování metadat jednotlivých dokumentů
//V tomto případě zařídí automatizovaný výstup na základě metadat
function myMetadataProcess (myDoc)
    {//Tisk
    var myPrintStatus=myDoc.metadataPreferences.getProperty("http://ns.poundhill.com/phsa/1.0/","phsprop0");
    if(myPrintStatus){var myPrintPreset=myDoc.metadataPreferences.getProperty("http://ns.poundhill.com/phsa/1.0/","phsprop1");
        myDoc.print(false,myPrintPreset)}
    //PDF export
    var myPDFStatus=myDoc.metadataPreferences.getProperty("http://ns.poundhill.com/phsa/1.0/","phsprop2");
    if(myPDFStatus){var myPDFPreset=myDoc.metadataPreferences.getProperty("http://ns.poundhill.com/phsa/1.0/","phsprop3");
        myDoc.exportFile(ExportFormat.pdfType, File(myDoc.fullName.toString().slice(0,-5)+".pdf"),false,myPDFPreset);}
    }

Obsah seriálu (více o seriálu):

Tématické zařazení:

 » Rubriky  » VSE  

 » Rubriky  » Go verze  

 » Rubriky  » Sazba  

 » Rubriky  » Polygrafie  

 » Rubriky  » Software  

 

 

 

 

Přihlášení k mému účtu

Uživatelské jméno:

Heslo: