Skriptujeme InDesign (21): Obrázky 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:

Soutěž

Sponzorem soutěže je:

IDIF

 

Kde se koná výstava fotografií Luďka Vojtěchovského?

V dnešní soutěži hrajeme o:



Software

Skriptujeme InDesign (21): Obrázky podruhé

Adobe InDesign sazba

7. srpna 2006, 00.00 | V tomto díle se budeme věnovat způsobům přístupu k obrázkům ve skriptech a dále práci s
vazbami obrázků. Zejména v druhém případě jsme pro vás připravili řadu zajímavých ukázek
kódu, které vám, věříme, usnadní práci s daným typem obsahu.

V tomto díle se budeme věnovat způsobům přístupu k obrázkům ve skriptech a dále práci s vazbami obrázků. Zejména v druhém případě jsme pro vás připravili řadu zajímavých ukázek kódu, které vám, věříme, usnadní práci s daným typem obsahu.

Jak se na obrázky odkazovat?

K obsahu obrázků se lze s pomocí skriptů dostat různými způsoby. Univerzální přístup zde poskytuje kolekce allGraphics (pro document, page, spread, layer, pageItem - tedy různé typy rámečků). Výraz:

app.activeDocument.allGraphics

takto vrací pole veškeré grafiky v dokumentu,

app.activeDocument.pages[0].allGraphics

všechnu grafiku na dané stránce atd. Do seznamu je zahrnuta i uvolněná (overriden) grafika ze vzorové stránky a to pro každý svůj výskyt, stejně tak zde nalezneme i vloženou (inline) grafiku. Položky kolekce allGraphics jsou typu Image (bitmapová grafika vložená - Photoshop, TIFF, JPEG, PICT aj., a dále i inline), PDF a EPS.

Další univerzální možnost představuje kolekce links, obsahující seznam všech odkazů (vazeb) na soubory vložené do dokumentu. V této kolekci nicméně najdeme i linkované textové soubory a nemusíme najít některou vloženou grafiku, na to je třeba při případném hromadném zpracování občas třeba dávat pozor. K některému zpracování se tedy více hodí allGraphics, k jinému zase links, často přijdou vhod oba přístupy.

Obrázek je spojen se svým rámečkem, tedy objektem typu rectangle, oval či polygon. Na danou skutečnost je třeba myslet zejména pokud chceme pracovat s obrázky adresovanými pomocí výběru. Pokud totiž zadáme příkaz jako je třeba

var myImage=app.selection[0];

vloží se do proměnné myImage odkaz buďto na rámeček obrázku (v případě že je daný rámeček vybrán pomocí nástroje Výběr-Selection) nebo obrázek vložený do daného rámečku (pokud je obrázek vybrán nástrojem Přímý výběr-Direct Selection). Pokud chceme i v prvním případě získat odkaz na obrázek (obrázky) v daném rámečku, můžeme použít následující adresování

var myImage=app.selection[0].allGraphics[0];

Daným způsobem lze mimochodem získat korektní odkazy i na obrázky vložené do políček tabulky v určitém textovém rámečku. K bližší identifikaci typu vložené grafiky slouží vlastnost imageTypeName - ta může nabývat hodnot TIFF, JPEG, Photoshop, EPS, Adobe Portable Document Format (PDF) apod. Pomůže nám aplikovat operace pouze na určitý typ grafiky - viz výklad v příští části. Otestovat typ grafiky ve výběru lze třeba s pomocí následujícího kódu (samozřejmě by mohl být použit i jednodušší kód v případě, že víme, že je určitě vybrán obrázek):

//Zjistí typ právě vybrané grafiky
//Kontroluje, aby byl nástrojem výběr či přímý výběr vybrán jediný obrázek

function myAlert(){alert("Vyberte obrázek (jako jediný objekt) a spusťte tento skript znovu");exit();}

var mySel=app.selection[0];

if((mySel==undefined)||(app.selection.length>1)){myAlert()};

if((mySel.constructor.name=="Rectangle")||(mySel.constructor.name=="Oval")||(mySel.constructor.name=="Polygon"))
    {if(mySel.allGraphics.length==1){var myImage=mySel.allGraphics[0]}else{myAlert()}}
    else{if(((mySel.constructor.name=="Image")||(mySel.constructor.name=="EPS")||(mySel.constructor.name=="PDF")))
        {var myImage=mySel}
        else{myAlert()}
        }

if(myImage.imageTypeName){alert("Obrázek je typu "+myImage.imageTypeName)}else{alert("Vložená grafika?")};

Zajímat nás samozřejmě mohou vlastnosti jako je název či plné souborové jméno obrázku, je-li tento odkazován. K tomu i dalším účelům slouží kolekce links pro práci s vazbami (dále též odkazy). O té si nyní povíme něco více.

Vazby obrázků

Kolekce links obsahuje všechny odkazy na externí soubory spojené s dokumentem. Ještě jednou přitom připomeňme, že mimo importované grafiky lze zde najít i textové soubory či dokumentů tabulkových procesorů, došlo-li k vložení daného typu obsahu se zapnutou odpovídající předvolbou InDesignu. Všechny odkazy v dokumentu adresujeme například takto:

app.activeDocument.links

K identifikaci typu odkazovaného obrázku slouží metoda linkType. Ověření, zda dokument obsahuje linkované Photoshop, PDF a JPEG soubory lze provést třeba takto:

var myLi=app.activeDocument.links;
var myPhC=0;
var myPDFC=0;
var myJPEGC=0;


for (i=0;i<myLi.length;i++)
    {if(myLi[i].linkType=="Photoshop"){myPhC=myPhC+1;}
    if(myLi[i].linkType=="Adobe Portable Document Format (PDF)"){myPDFC=myPDFC+1;}
    if(myLi[i].linkType=="JPEG"){myJPEGC=myJPEGC+1;}}

alert("Dokument obsahuje\n"+myPhC+" odkazovaných Photoshop souborů\n"+myPDFC+" odkazovaných PDF souborů\n"+myJPEGC+" odkazovaných JPEG souborů\n"+"Celkem je v dokumentu "+myLi.length+" odkazů na soubory");

Mimochodem, k rychlé informaci o všech typech odkazů použitých v dokumentu stačí jednořádkový příkaz:

alert(app.activeDocument.links.everyItem().linkType);

Link lze použít v kombinaci s allGraphics a to třeba následujícím způsobem:

//Vrací informaci o typu první odkazované grafiky vložené na stránku
app.activeDocument.pages[0].allGraphics[0].itemLink.linkType

Přes link lze také zjistit jméno (základní i úplné) souboru obrázku:

//Předpokládáme, že je vybrán obrázek, nikoli jeho rámeček
var myImg=app.selection[0];

if(myImg.itemLink!=null){alert(myImg.itemLink.name+"\n"+myImg.itemLink.filePath)}else{alert("Vložená grafika?")};

Objekt link je díky nabízeným vlastnostem a metodám hodně silným prostředkem při řešení různých úkonů s odkazovanou grafikou, ke které se jinak využívá odpovídající paleta InDesignu. Zcela zásadní je v jeho případě vlastnost status, dovolující zjistit nastavení jednotlivých odkazů, ke změnám pak lze použít příslušných metod (viz referenční příručka s. 871-873). Obdobným způsobem lze používat v prostředí InDesignu paletku Links, skriptování nicméně přináší větší flexibilitu. Řešit lze v daném případě například problémy s vloženou grafikou, kterou chceme zpětně linkovat (metoda unembed), grafikou, která je neaktuální (metoda update) či grafikou, u které jsou chybné odkazy (oprava metodou relink). Při takovémto i jiném zpracování odkazů přijde často vhod metoda show, která dovoluje zobrazit obrázek, jehož se týká nalezený problém. Přehled ilustračních příkladů lze začít následujícími jednoduchými diagnostikami a opravami:

//Zobrazí první grafiku v dokumentu která chybí a zobrazí její stávající náhled
var myDoc=app.activeDocument;
var myLi=myDoc.links;
for(i=0;i<myLi.length;i++){
    if(myLi[i].status==LinkStatus.linkMissing){myLi[i].show()}
    }


//Vyhledá vloženou grafiku a dovolí ji případně znovu linkovat
var myDoc=app.activeDocument;
var myLi=myDoc.links;
for(i=myLi.length-1;i>=0;i--){
    if(myLi[i].status==LinkStatus.linkEmbedded){myLi[i].show();
        if(confirm("Unembed?")){myLi[i].unembed()}}
    }

Ve výše uvedeném příkladu si povšimněte zpracování pozpátku

for(i=myLi.length-1;i>=0;i--)

To je v daném (a mnoha obdobných případech) potřeba, neboť oprava odkazu může jako jiné podobné manipulace měnit stav dané kolekce během zpracování.

Opravu všech neaktuálních odkazů v dokumentu je možno zajistit třeba takto:

var myDoc=app.activeDocument;
var myLi=myDoc.links;
for(i=myLi.length-1;i>=0;i--){if(myLi[i].status==LinkStatus.linkOutOfDate){myLi[i].update()}}

Dále je možné použít například interaktivní procházení a opravování vadných odkazů.

//Zobrazí vždy chybějící grafiku v dokumentu, zobrazí její náhled
//a dovolí opravu výběrem souboru
var myDoc=app.activeDocument
var myLi=myDoc.links;

//Zde si nastavte vlastní cestu podle potřeb
var myFile=File("/c/clanky/skriptid/obrazky/pod/");
for(i=myLi.length-1;i>=0;i--){
    if(myLi[i].status==LinkStatus.linkMissing)
    {myLi[i].show();
        try{myLi[i].relink(myFile.openDlg("Zvolte soubor",": *.*"));}
        catch(e){if(confirm("Skončit hned?")){exit()}}}
    }

Poslední uvedený příklad pak samozřejmě ještě pořád asi není to pravé pro ty, kdo chtějí naráz například opravit odkazy pro několik tisíc vložených grafik. Hodně jednoduchá varianta skriptu, který něco takového dokáže vypadá asi takto:

//Skript který změní všechny chybějící odkazy určením nové složky
var myDoc=app.activeDocument
var myLi=myDoc.links;

//Zde si nastavte vlastní cestu (ve které jsou obrázky) podle potřeb
var newPath="/c/clanky/skriptid/obrazky/pod/";
//Případně by šlo použít něco jako je toto
//var newPath=Folder.selectDialog().toString()+"/";


for(i=myLi.length-1;i>=0;i--){
    if(myLi[i].status==LinkStatus.linkMissing){myLi[i].relink(File(newPath+myLi[i].name));myLi[i].update();}
    }

Kouzlení s řetězci vyjadřujícími jména souborů pomocí odpovídajících funkcí JavaScriptu (v předchozím příkladu jsme použili hodně triviální "výrobu" nového souborového názvu výrazem newPath+myLi[i].name) dovoluje provádět i mnohem sofistikovanější záměny. Dave Saunders například na svém blogu zveřejnil skript, který umožňuje přelinkovat skupinu barevných obrázků (u kterých je název ukončen řetězcem _cp) skupinou obrázků v odstínech šedi (stejné názvy jako u předchozí skupiny, ale ukončené řetězcem _bw). (Nemusí zde jít jen o barevný mód obrázku, v podstatě se jen jedná o skript dovolující vyměnit jednu skupinu odkazů druhými.)

//DESCRIPTION: Replace color linked images with BW alternates

 /*
   Color images have "_cp" in their names; BW have "_bw"
 */

myDoc = app.activeDocument;
myLinks = myDoc.links;
for (j = myLinks.length - 1; j >= 0; j--) {
  myName = myLinks[j].filePath;
  myNewName = myName.split("_cp").join("_bw");
  if (myName != myNewName) {
    // Original link includes "-cp" in name
    myNewImageFile = File(myNewName);
    if (!myNewImageFile.exists) {
     alert ("Can't find file: " + myNewName);
      continue;
    }
    myLinks[j].relink(myNewImageFile);
    myLinks[j].update();
  }
}

Závěrem

Náš výklad o obrázcích tímto nekončí. V příštím díle si povíme ještě něco více o dalších možnostech zpracování a správy daného typu obsahu.

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: