Skriptujeme InDesign (5): Dokumenty poprvé - 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:

Poptávka práce


Polygrafie

Skriptujeme InDesign (5): Dokumenty poprvé

Adobe InDesign sazba

30. ledna 2006, 00.00 | V této části našeho seriálu se již konečně pustíme do konkrétních aplikací v prostředí InDesignu. Dnes to bude vytváření, otevírání, uzavírání a ukládání dokumentů.

V tomto díle našeho seriálu o skriptování v InDesignu přejdeme od teorie programování k praxi a začneme se zabývat konkrétními aplikacemi v prostředí InDesignu. Tento (a následující) díl bude patřit manipulaci s dokumenty InDesignu i dalšími soubory.

Tvorba dokumentu

Příkaz pro vytvoření dokumentu jsme již zvládli v našem ukázkovém skriptu helloworld, a tak jen připomeňme, že měl podobu

var myDocument=app.documents.add();

Jak jsme se již také zmínili, daný příkaz (resp. metoda add, tedy speciální případ funkce) může mít své volitelné parametry. Pokud nahlédneme do referenční příručky skriptování v InDesignu C2, zjistíme, že úplný tvar příkazu je následující:

app.documents.add(ShowingWindow,DocumentPreset);

Parametr ShowingWindow, který je typu logická hodnota (true či false) určuje, zda má být vytvořený dokument zobrazen či nikoli v okně InDesignu. Vytvoření "skrytého" dokumentu má svůj význam třeba v případě, že chceme s daným dokumentem následně provádět sérii výpočetně náročných operací: skrytí manipulaci urychlí. Zobrazení dokumentu pak zajistíme přidáním nového okna do dokumentu. Příslušný skript by mohl vypadat nějak takhle:

var myDocument=app.documents.add(false);
//další kód
var myWindow= myDocument.windows.add();

Obvykle zajímavější je druhá možnost, kdy dokument vytváříme s použitím připravené sady nastavení, tedy tzv. presetu. Presety si přitom můžeme vytvořit buďto manuálně, s pomocí odpovídajícího dialogu InDesignu nebo opět s pomocí skriptu, jak si ukážeme (spolu s popisem toho, jak měnit vlastnosti vytvářených i stávajících dokumentů) dále.

//Předpokládáme, že existuje preset Brožura
var myDocument=app.documents.add(true,DocumentPreset("Brožura"));

Otevření dokumentu

Častý může být i požadavek na otevření dokumentu stávajícího. Nejjednodušší způsob který nám toto dovolí, má například formu následujícího příkazu (mimochodem, odkaz v příkladu vede na dokument obvykle obsažený v instalaci InDesignu.):

app.open(File("/c/Program Files/Adobe/Adobe InDesign CS2/Samples/Adobe History.indd"));

Jde zde tedy o aplikaci metody open pro objekt aplikace (tedy InDesign), jejímž parametrem je objekt File. Ten (spolu s objektem Folder) vydá na zvláštní výklad, na tomto místě si povšimněme pouze toho, že jako parametr má určen název souboru, který je uzavřen v uvozovkách (název je tedy chápán jako textový řetězec). Co se pak pojmenování souboru týče, v našem příkladu jsme použili na platformě nezávislého odkazování na soubor, známého jako URI (universal resource identifier). Výhoda je zřejmá: skript půjde použít v Macovi i Windows, aniž bychom museli v odkazu cokoli měnit. Jinak je možno použít i odkazů obvyklých pro Windows či Maca, odkazovat lze i na serverové disky a zástupce, k dispozici jsou také relativní odkazy vzhledem k aktuálně použitému adresáři aj. Podrobnější výklad je zde poměrně rozsáhlý a zájemci zde doporučujeme odpovídající úsek referenční příručky skriptování v InDesignu CS2 (s. 535-538). Podrobný popis metod a vlastností objektů File a Folder nalezneme tamtéž na stranách 539-555.

Určení jména souboru "natvrdo" ve skriptu není samozřejmě jedinou možností, jak jméno zadat. Jinou obvyklou formu poskytují uživatelské dialogy. Těm se budeme podrobněji věnovat ve výkladu o objektu Application (app, tedy samotném InDesignu) někdy příště, na tomto místě uveďme alespoň jeden názorný, snadno modifikovatelný příklad, využívající metodu openDialog objektu File (a povšimněte si testu s použitím hodnoty "null", který budeme využívat ještě mnohokrát):

//openDialog zobrazí dialogové okno pro volbu souboru
//má dva (volitelné) parametry
//první uzavřen v uvozovkách zobrazí text, který se vypíše v záhlaví okna
//druhý opět v uvozovkách stanoví souborové masky s popiskem oddělené čárkou pro snazší výběr, mezi kterými se přepíná pomocí seznamu
//"Soubory typu" v dialogovém okně
//RTF jsme uvedli jako příklad nastavení masky, nyní otevřete určitě dokument InDesignu!
var myDoc=File.openDialog("Zvolte soubor:","Dokumenty InDesignu: *.indd, Dokumenty InDesignu začínající na a: a*.indd, Dokumenty RTF: *.rtf");

//následující podmínka (využívající operátoru pro porovnání != čili "nerovná se") testuje, zda náhodou uživatel nezavřel dialog
//tlačítkem Cancel (Zrušit)
//a nevybral tak žádný dokument. Pak openDialog vrací hodnotu "null" čili nic,
//jinak vrací odkaz na soubor pro zpracování
if (myDoc != null)
{
    app.open(myDoc);
}
else
{
    alert("Nezvolili jste žádný dokument");
}

Poznamenejme zde ještě, že daným způsobem lze vybrané soubory nejen přímo otevírat, ale i zpracovávat různými dalšími způsoby, což se přitom týká nejen dokumentů InDesignu.

Dále je zde zajímavá možnost automatického otevírání více dokumentů současně, typicky více dokumentů z téže složky. Skript, který něco takového zajistí, by mohl vypadat třeba takhle:

//Tento skript otevře všechny dokumenty InDesignu ze zadané složky.
//Nastavte složku podle svých požadavků.
var myFolder="/c/Program Files/Adobe/Adobe InDesign CS2/Samples/";

//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
    {
        app.open(myFiles[i]);           //otevřeme jednotlivé soubory
    }
}
//Upozorníme na absenci dokumentů
else{
    alert("Složka " + myFolder + " neobsahuje žádný dokument InDesignu")
}

Zde i jinde je třeba dávat pozor na to, aby InDesign neotevřel tentýž dokument vícekrát: ošetřeními příslušných inkonzistencí ve skriptu se nicméně na tomto místě zabývat nebudeme.

Přístup k dokumentům otevřeným v InDesignu

Dokumenty otevřené v InDesignu lze zpracovávat různým způsobem. K manipulaci je přitom vhodné využít objektu app.documents, což je vlastně pole, přes které přistupujeme k aktuálně otevřeným dokumentům (tedy objektům typu Document). Výpis toho, co je právě otevřeno, zajistíme třeba takto,

//Vytvoříme proměnnou pro textový seznam názvů souborů
var myList="";
//Cyklem projdeme pole dokumentů otevřených v InDesignu
//počet dokumentů je určen vlastností app.documents.length,
//která vrací počet prvků pole
var myDocumentCount=app.documents.length;
for (var i=0;i<myDocumentCount;i++)
//Jména (určená metodou app.documents[i].name) vložíme do proměnné myList po řádcích (oddělovač \n)
{
    myList=myList+app.documents[i].name+"\n";
}
//Vypíšeme seznam
alert(myList);

Je samozřejmě jasné, že mimo metody alert lze použít mnoho dalších, smysluplnějších způsobů zpracování. K dokumentům pak lze přistupovat i s pomocí metody app.documents.item(index_dokumentu). K dokumentu, který je v InDesignu právě v popředí pak přistupujeme s pomocí metody app.activeDocument (který lze adresovat i jako app.documents[0] nebo app.documents.item(0)). Příklad:

Kód


alert("Právě aktivní dokument se jmenuje " +app.activeDocument.name);

má stejný efekt jako

alert("Právě aktivní dokument se jmenuje " +app.documents.item(0).name);

či

alert("Právě aktivní dokument se jmenuje " +app.documents[0].name);

Uzavírání, ukládání a export dokumentů

Prakticky nejobvyklejší operace, které s dokumenty otevřenými v InDesignu provádíme, jsou uzavírání a ukládání. Pro prosté uzavření dokumentu se používá metody close:

//Takhle uzavřeme aktivní dokument
app.activeDocument.close();

Daná metoda má dva volitelné parametry: první může mít hodnotu SaveOptions.ask (zobrazí se dotaz na uložení souboru, pokud jsou v dokumentu neuložené změny - výchozí volba), SaveOptions.no (uzavře dokument bez uložení) nebo SaveOptions.yes (dokument uloží). Druhý parametr pak určuje, kam má být v případě použití SaveOptions.yes uložení provedeno (bez tohoto parametru se zobrazí dialog pro výběr souboru). Příklady:

Tento kód se na uložení zeptá

app.activeDocument.close(SaveOptions.ask);

Tento kód provede uložení dokumentu do souboru určeného proměnnou myFileName

var myFileName="/c/pokus/pokus.indd";
app.activeDocument.close(SaveOptions.yes,myFileName);

Tento kód uzavře všechny otevřené dokumenty a nechá je případně uložit:

//Tenhle cyklus jde pozpátku
//používáme takřka vždy, když v rámci cyklu měníme počet prvků v poli (kolekci)
for (myCounter=app.documents.length;myCounter>0;myCounter--)
{
//Tady jsme k odkazování dokumentů použili metodu item
app.documents.item(myCounter-1).close(SaveOptions.yes);
}

Dokumenty lze samozřejmě ukládat i bez toho, že bychom je uzavírali. K danému účelu slouží metoda save objektu Document. Ta má dva volitelné parametry: první (objekt File) určuje, kam se má dokument uložit, druhý (logická hodnota) pak, zda má být dokument uložen jako šablona (je zapotřebí nastavit na true, výchozí hodnota je false). K tomu, abychom ve skriptech rozhodli, zda má či nemá daný dokument smysl ukládat, slouží pak vlastnosti objektu dokument saved (logická hodnota, true pokud byl dokument vůbec kdy od svého vytvoření uložen) a modified (true pokud byl dokument od posledního uložení modifikován). Příklad:

Uloží aktivní dokument pokud byl modifikován:

if (app.activeDocument.modified == true)
{app.activeDocument.save();}

Závěrem

Tolik zatím co se manipulace s dokumenty týče. Příště se podíváme například na to, jak lze u dokumentů měnit jejich vlastnosti, či jak je tisknout nebo exportovat do různých formátů.

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: