V minulom dieli sme stručne predstavili problematiku práce s obrázkami a uviedli sme makrá pre prácu s dialógom pre vkladanie či hromadnú zmenu ukotvenia a priehľadnosti obrázkov. V dnešnom pokračovaní nám preto nezostáva nič iné, ako uviesť vlastné makrá pre nastavenie ukotvenia a priehľadnosti obrázkov. Samozrejme, nesmieme zabudnúť ani na sériu funkcií, pomocou ktorých prevedieme hromadné embedovanie externých obrázkov (s výpisom počtu vložených obrázkov).

REM Procedúra pre vloženie obrázku do textového dokumentu
REM Pozor, obrázok sa vkladá ako odkaz!
sub Vloz_obrazok(sNazov, iUkotvenie, iPriehladnost)
dim dokument, kurzor, obrazok as object
dokument = ThisComponent.getText()
kurzor = ThisComponent.CurrentController.GetViewCursor() ' Obrázok vkladáme na polohe aktuálneho kurzora
kurzor.collapseToend()
obrazok = ThisComponent.createInstance("com.sun.star.text.GraphicObject")
obrazok.GraphicURL = sNazov ' Cesta k obrázku
obrazok.AnchorType = iUkotvenie ' Ukotvenie obrázku
obrazok.Transparency=iPriehladnost
dokument.insertTextContent( kurzor, obrazok, False) 'Vloženie obrázku
end sub
REM Procedúra pre nastavenie ukotvenia všetkých obrázkov v textovom dokumente
sub Zmen_ukotvenie(iUkotvenie)
dim obrazky, obrazok as object
dim kolko, i, pocet as long
obrazky = ThisComponent.getDrawPage() ' Všetky obrázky
kolko=obrazky.getCount()-1 ' Celkový počet obrázkov
REM Z neznámych dúvodov neprebehne na jeden cyklus – pri testovaní na totožné ukotvenie sa zobrazila rovnosť, hoci nebola!
REM V ďalšom cykle sa zmenili nastavenia aj tých obrázkov, ktoré v prvom cykle "blbli", preto opakujeme, kým je nejaká zmena
do '
pocet=0 ' Počet zmien v jednom cykle
for i=0 to kolko ' Pre všetky obrázky
obrazok=obrazky.getByIndex(i) ' Výber i-teho obrázku
if obrazok.supportsService("com.sun.star.text.TextGraphicObject") then ' Ak obrázok je v textovom dokumente
if obrazok.AnchorType<>iUkotvenie then ' Pri testovaní (bolo ukotvenie na odsek) sa zobrazila rovnosť (menené na ukotvenie ako znak)!
obrazok.AnchorType=iUkotvenie ' Zmena ukotvenia
pocet=pocet+1 ' Ak sme niečo menili, musíme opakovať cyklus
end if
end if
next i
loop until pocet=0
end sub
REM Procedúra pre nastavenie rovnakej priehľadnosti všetkých obrázkov v textovom dokumente
sub Zmen_priehladnost(iPriehladnost)
dim obrazky, obrazok as object
dim i, kolko as long
if iPriehladnost>=0 and iPriehladnost<=100 then ' Priehľadnosť môže byť 0-100%
obrazky = ThisComponent.getDrawPage() ' Všetky obrázky
kolko=obrazky.getCount()-1 ' Celkový počet obrázkov
for i=0 to kolko ' Pre všetky obrázky
obrazok=obrazky.getByIndex(i) ' Výber i-teho obrázku
if obrazok.supportsService("com.sun.star.text.TextGraphicObject") then obrazok.Transparency=iPriehladnost ' Ak obrázok je v textovom dokumente tak nastavenie priehladnosti
next i
end if
end sub
Rem Makro pre embedovanie všetkých vložených obrázkov
dim Zmenenych, Nezmenenych, Obrazkov as string
sub Nastav_jazyk_text
dim kde, nazov as string
dim rovna as integer
dim riadok, premenna, definicia as string
dim sf, inStream, inFile ' Pre čítanie z lokalizačného súboru
Zmenenych="Zmenených "
Nezmenenych="; nezmenených "
Obrazkov=" obrázkov"
kde=basiclibraries.getLibraryLinkURL("JP_ukotvi_obrazok") ' Adresár, kde je rozšírenie nainštalované
nazov=left(kde,len(kde)-10)+"jp_ukotvi_obrazok_"+Jazyk_OOo+".txt" ' Súbor s jazykovou lokalizáciou
if fileexists(nazov) then ' Ak lokalizačný súbor existuje, tak načítame definície do premenných
sf = createUnoService("com.sun.star.ucb.SimpleFileAccess")
inStream = sf.openFileRead(nazov)
inFile = createUnoService("com.sun.star.io.TextInputStream")
inFile.InputStream = inStream
inFile.Encoding = "UTF-8" ' lokalizačný súbor musí byť v UTF-8, inak nebude dobrá diakritika
Do While not inFile.IsEOF
riadok = inFile.readLine ' namiesto Line Input #subor, riadok
rovna=instr(riadok,"=")
if rovna<>0 then
premenna=trim(left(riadok,rovna-1)) ' Budeme ignorovať medzery
definicia=trim(right(riadok,len(riadok)-rovna))
select case premenna
case "Zmenenych"
Zmenenych=definicia+" "
case "Nezmenenych"
Nezmenenych="; "+definicia+" "
case "Obrazkov"
Obrazkov=" "+definicia
end select
end if
loop
' Zatvorenie definičného súboru – namiesto close #subor
inStream.closeInput
inFile.closeInput
end if
end sub
REM Procedúra pre prechádzanie všetkých obrázkov
Sub Embeduj_externe_obrazky
dim dokument, obrazky, obrazok as object
dim i, pocet_odkazov, pocet_zmenenych as long
dokument = ThisComponent
pocet_zmenenych = 0
pocet_odkazov = 0
obrazky = dokument.getDrawPage()
for i=0 To obrazky.getCount()-1 ' Pre všetky obrázky
obrazok = obrazky.getByIndex(i)
on error goto pokracuj ' Ošetrenie chýb – niekedy je v dokumente (typu ".doc") "prázdny" obrázok, ktorý spôsobuje chybu
if InStr(obrazok.GraphicURL, "vnd.sun") = 0 Then ' Ak nie je obrázok vnútorný
if Embeduj_obrazok(obrazok, dokument) Then ' Ak sa ho podarilo zmeniť na vnútorný
pocet_zmenenych = pocet_zmenenych + 1
else
pocet_odkazov = pocet_odkazov + 1
end if
end if
pokracuj:
next i
Nastav_jazyk_text
msgbox Zmenenych+str(pocet_zmenenych)+Obrazkov+Nezmenenych+str(pocet_odkazov)+Obrazkov+"."
end Sub
REM Funkcia, ktorá embeduje obrázok (vložený ako odkaz) do vnútra dokumentu
Function Embeduj_obrazok(obrazok, dokument) As Boolean
dim bitmapa as object
dim nova_URL, nazov as string
nazov=obrazok.LinkDisplayName
bitmapa=dokument.createInstance("com.sun.star.drawing.BitmapTable")
if bitmapa.hasByName(nazov) Then ' Obrázok s príslušným menom už existuje – nie je možný prevod
Embeduj_obrazok = False
exit function
end if
bitmapa.insertByName(nazov, obrazok.GraphicURL) ' Vloženie obrázku ako vnútorného
nova_URL=bitmapa.getByName(nazov) ' Vnútorná cesta k obrázku
obrazok.GraphicURL=nova_URL ' Zmena cesty na vnútornú
Embeduj_obrazok=True
end Function