Automatizujte Adobe Acrobat (a Reader) 8 s pomocí JavaScriptu (4): Nabídky a tlačítka - 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

 

Odkud pochází fotografka Anne Erhard?

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



Software

Automatizujte Adobe Acrobat (a Reader) 8 s pomocí JavaScriptu (4): Nabídky a tlačítka

10. srpna 2007, 00.00 | Chcete si změnit nebo rozšířit prostředí Adobe Acrobatu či Readeru podle svých potřeb? V tomto díle našeho seriálu o skriptování daných aplikací se podíváme na základní prostředky, dovolující měnit nabídky a nástrojová tlačítka.

V tomto díle našeho seriálu o skriptování Acrobatu a Readeru se budeme blíže věnovat nastavení nabídek a tlačítek v daných produktech. Zejména v případě nabídek jsou takto možnosti velmi bohaté a tak se zaměříme jen na skutečně základní přiblížení, více informací a příkladů lze najít především v odpovídající referenční a uživatelské příručce.

Přidávání nabídek

Podívejme se nejprve na způsoby, jakými může uživatel přidat do prostředí Acrobatu vlastní nabídky. Připomeňme přitom ve shodě s výkladem uvedeným v minulé části tohoto seriálu, že nejprve je vhodné odpovídající kód odladit pomocí konzoly, permanentní nastavení nabídek pak provedeme tím způsobem, že odladěný kód umístíme do folder level souboru (například s názvem config.js), který se načte při každém spuštění Acrobatu.

Přidávání příkazů do nabídek funguje s pomocí metod addMenuItem (pro nabídky) a addSubMenu (pro podřazené nabídky) objektu app (čili aplikace). addMenuItem má přitom povinné parametry cName (jazykově nezávislý název příkazu v nabídce), cParent (název nabídky, do které příkaz umisťujeme) a cExec (kód, který daný příkaz spouští). Protože cName je primárně určen pro odkazování přidaného příkazu při dalším zpracování, je v případě, že budeme chtít s nabídkami dále pomocí JavaScriptu manipulovat, vhodné pojmenovat jej dobře mnemotechnicky, případně bez diakritiky, mezer a dalších speciálních znaků. Pro samotný název, který se zobrazí v prostředí Acrobatu pak použijeme volitelný parametr cUser - pokud tento vynecháme, použije se nastavení cName.

Výchozí umístění přidaného příkazu je na konec dané skupiny nabídek, obvykle je žádoucí určení jiné pozice, k tomu slouží parametr nPos. Ten může pozici určovat buďto číselnou hodnotou (přičemž -1 zde znamená umístění úplně na začátek, 0 pak za dosud první příkaz v pořadí) nebo (od Acrobatu 6) názvem příkazu, ke kterému má být umístěn - v druhém případě je výchozí umístění za odkazovaný příkaz, další doladění je možné s pomocí volitelného parametru bPrepend (viz referenční příručka, s. 98).

Ukažme si nyní, jak například přidat do prostředí Acrobatu, konkrétně do skupiny příkazů Nápověda, nový příkaz "Referenční příručka", jenž po spuštění otevře soubor js_api_reference.pdf ze složky c:\manualy. Příkaz umístíme na první pozici v seznamu. (Mimochodem, povšimněte si, jakým způsobem musíme psát uvozovky uvnitř výrazu cExec, možné by bylo rovněž použití apostrofů.) O tom, jak zjistit pojmenování příkazů, která se zadávají v případě cParent a případně nPos si více povíme na jiném místě tohoto článku.

app.addMenuItem({cName: "Reference",
    cUser: "Referenční příručka",
    nPos: 0,
    cParent: "Help",
    cExec: "app.openDoc(\"c:/manualy/js_api_reference.pdf\")"
});

Totéž s použitím určení pozice (nPos) pomocí názvu příkazu.

app.addMenuItem({cName: "Reference",
    cUser: "Referenční příručka",
    nPos: "HelpUserGuide",
    cParent: "Help",
    cExec: "app.openDoc(\"c:/manualy/js_api_reference.pdf\")"
});

aa8script4-1f.jpg

Zajímavý je volitelný parametr - výraz cEnable, dovolující použít podmínku, určující, kdy se příkaz dá či nedá provést. S použitím tohoto parametru lze tedy příkaz nabídnout pouze v relevantním kontextu. K deaktivaci příkazu je takto zapotřebí v rámci cEnable+nastavit hodnotu +event.rc na false. Použití ukazuje následující příklad, ve kterém je příkaz pro vypsání tvůrce dokumentu (metadatové pole Tvůrce PDF/Producer) aktivní pouze v případě, je-li nějaký dokument v prostředí Acrobatu otevřen. (Dokument je zde odkazován jako event.target, více k danému tématu viz s. 232 referenční příručky nebo náš výklad v příštím díle tohoto seriálu)

app.addMenuItem({cName: "Tvůrce dokumentu", cParent: "File",
              cExec: "app.alert(event.target.info.producer);",
              cEnable: "event.rc=(event.target!=null);",
              nPos: 0
});

aa8script4-2f.jpg

Možné je samozřejmě i přidávání podnabídek, a to s pomocí metody app.addSubMenu. Její parametry cName, cUser, cParent a nPos mají obdobný význam jako v případě metody addMenuItem. Zařazení příkazů do takto vytvořené podnabídky provedeme jednoduše odpovídajícím přiřazením názvu dané podnabídky parametru cParent. Více ukazuje náš příklad, ve kterém si v nabídce Nápověda vytvoříme podnabídku Web, dovolující otvírat přímo z prostředí Acrobatu webové odkazy.

app.addSubMenu({cName: "Odkazy", cParent: "Help", nPos: 0 })
app.addMenuItem({
             cName: "Adobe", cUser: "Domovské stránky Adobe",
             cParent: "Odkazy",
             cExec: "app.launchURL('www.adobe.com');",
             nPos: 0
});
app.addMenuItem({
             cName: "Grafika", cUser: "Server Grafika Online",
             cParent: "Odkazy",
             cExec: "app.launchURL('www.grafika.cz');",
             nPos: 0
});

aa8script4-3f.jpg

Ve výše uvedených příkladech jsme v rámci přiřazení parametrů eExec či cEnable ukázali použití pouze krátkých úseků kódu. Nic nicméně nebrání spouštění komplexních skriptů daným způsobem: pro přehlednost je takto příslušný kód lepší definovat mimo samotné nastavení parametru v podobě samostatné funkce, a tuto pak volat z eExec či cEnable.

Zjištění interního označení příkazu

Je samozřejmě otázkou, jak zjistit interní označení Acrobatu pro název nabídky, který se stanovuje v cParent. Pomůže zde metoda app.listMenuItems, která v Acrobatu 6 a vyšším vypíše pole všech TreeItem objektů, tj. objektů, jenž reprezentují hierarchii nabídek. (V nižší podobě Acrobatu to je pouze seznam příkazů bez zachycení hierarchie.) Každý takovýto objekt má přitom vlastnost cName obsahující jazykově nezávislý název nabídky (viz popis výše) a případně též vlastnost oChildren, vracející pole podnabídek.

Výpis údajů o nabídkách lze v neuspořádané podobě zajistit například takto:

var menuItems = app.listMenuItems();
for(var i in menuItems)
    {console.println(menuItems[i]+"\n");}

aa8script4-4f.jpg

V uspořádanější podobě, vhodné třeba i ke zkopírování do textového dokumentu a vytištění pro pozdější pohodlné vyhledání požadovaného příkazu pak takto:

function FancyMenuList(m, nLevel){
    var s = "";

    //Základní vpis
    for(var i=0;i<nLevel;i++){s += " "};
    console.println(s+"+-"+m.cName);

    //Výpis případných podnabídek
    if(m.oChildren!= null){
        for (var i=0;i<m.oChildren.length;i++)
            {FancyMenuList(m.oChildren[i], nLevel + 1)}
    }
}

var m=app.listMenuItems();
for (var i=0;i<m.length;i++)
    {FancyMenuList(m[i],0)};

aa8script4-5f.jpg

Odstranění příkazu

K dispozici je pak i příkaz hideMenuItem pro odstranění příkazu z nabídky. Ten lze použít nejen při konfiguraci nabídek pro konkrétního uživatele, ale též v případě, že testujeme přidávání nabídek pomocí konzoly: po každém spuštění odpovídajícího kódu se totiž přidá vždy nová položka nabídky, takto můžeme tedy vždy po otestování daný příkaz odstranit (jinak lze odstranění provést restartem Acrobatu). Příkaz má jediný parametr, kterým je cName, tedy jazykově nezávislé označení nabídky.

Příklad:

app.hideMenuItem({cName: "Název dokumentu"});

Tlačítka

Skriptování dovoluje prostředí Acrobatu rozšířit rovněž o nástrojová tlačítka. Možnosti jsou v daném směru ale výrazně omezené, neboť tato tlačítka lze přidávat pouze na pruh nástrojů Přídavné nástroje/Add-on (mnohem lepší možnosti tvorby vlastních tlačítek a pruhů nástrojů spojených s JavaScripty v daném směru poskytuje plugin AcroButtons společnosti WindJack Solutions v ceně 99 USD). Navíc jsou zde komplikace s bezpečnostními restrikcemi, od Acrobatu 7 je možné bezproblémové provedení příslušných příkazů pouze z konzoly, pokud chceme tlačítka přidávat pomocí folder level skriptu, musíme použít odpovídající nastavení privilegií (viz referenční příručka).

K vytvoření tlačítka slouží metoda app.addToolButton. Jejími povinnými parametry jsou cName (jazykově nezávislé označení tlačítka, obdobný význam jako v případě příkazů nabídek), oIcon (ikona tlačítka mající podobu tzv. Icon Stream objektu; jedná se o obrázek, který může mít rozměr maximálně 20 x 20 px; volitelný parametr od Acrobatu 7, kdy lze ikonku nahradit textem s pomocí parametru cToolText - viz dále) a eExec (obdobně jako u příkazů v nabídkách se zde určuje kód, jež se má provést po stisknutí daného tlačítka). Volitelnými parametry pak jsou cEnable (aktivace/deaktivace tlačítka - funguje opět obdobně jako u nabídek), cMarked (tlačítko je/není vybráno), cToolText (kontextová nápověda tlačítka), nPos (umístění tlačítka) a cLabel (textový popisek tlačítka - lze použít namísto ikonky).

Příslušný postup pro přidání tlačítek se pokusíme naznačit následujícím příkladem, ve kterém přidáme do prostředí Acrobatu tři tlačítka.

//První tlačítko
//Vytvoříme dokument
var myDoc = app.newDoc();
//Importujeme ikonku
myDoc.importIcon("myIcon", "/C/ikonky/ikonkaacrobatu.jpg", 0);
//Konvertujeme ikonku na stream
oIcon = util.iconStreamFromIcon(myDoc.getIcon("myIcon"));
//Uzavřeme dokument, který jsme použili k tvorbě streamu ikonky
myDoc.closeDoc(true);
//Přidáme tlačítko
app.addToolButton({
    cName: "myToolButton",
    oIcon: oIcon,
    cExec: "app.alert('Tohle je ikonka s logem Acrobatu')",
    cTooltext: "Klikni na mě!",
    cEnable: true,
    nPos: 0
});

//Druhé tlačítko
//Vytvoříme dokument
var myDoc = app.newDoc();
//Importujeme ikonku
myDoc.importIcon("myIcon", "/C/ikonky/ikonkaadobe.jpg", 0);
//Konvertujeme ikonku na stream
oIcon = util.iconStreamFromIcon(myDoc.getIcon("myIcon"));
//Uzavřeme dokument, který jsme použili k tvorbě streamu ikonky
myDoc.closeDoc(true);
//Přidáme tlačítko
app.addToolButton({
    cName: "myToolButton2",
    oIcon: oIcon,
    cExec: "app.alert('Tohle je ikonka s logem Adobe')",
    cTooltext: "Klikni na mě!",
    cEnable: true,
    nPos: 0
});

//Třetí tlačítko (pouze textové, bez ikonky)
//Přidáme tlačítko
app.addToolButton({
    cName: "myToolButton3",
    cExec: "app.alert('Tohle je ikonka bez loga')",
    cTooltext: "Klikni na mě!",
    cEnable: true,
    nPos: 0
});

aa8script4-6f.jpg

Pokud je addToolButton použit ve chvíli, kdy je v Acrobatu aktivní PDF dokument, je vytvořené tlačítko spojeno s tímto dokumentem: tj. zobrazuje se pouze pokud daný dokument aktivujeme. K odstranění tlačítka pak slouží příkaz app.removeToolButton s jediným parametrem cName.

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

Tématické zařazení:

 » Rubriky  » VSE  

 » Rubriky  » Go verze  

 » Rubriky  » Webdesign  

 » Rubriky  » Polygrafie  

 » Rubriky  » PDF - Adobe Acrobat  

 » Rubriky  » Software  

 

 

 

Poptávka bazar

 

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

Uživatelské jméno:

Heslo: