Fórum pro uživatele kancelářského balíku OpenOffice | LibreOffice
 

#1 4. 2. 2020 07:43:36

regine
Člen
Registrace: 11. 1. 2014
Příspěvků: 11

Vložit obrázek na řádek - VYŘEŠENO

Jak vložit malý obrázek (ikona) za písmeno na řádek (kotvit na písmo) v místě kurzoru?
Můj dosavadní postup:
1. Obrázek se mi vloží 'divoce' mimo místo, kde je kurzor.
2. Následně obrázek doslova nahodile se snažím umístit na požadované místo v textu.
3. Provedu ve vlastnostech obrázku:
Typ - Ukotvení - Ke znaku
Možnosti - Zamknout (Umístění a Velikost)
4. Konečně jsem u cíle.
PLS, lze vkládat malé obrázky do textu v místě kurzoru nějak šikovněji (smart)?
__________
Matně si vzpomínám, že na internetu bylo před lety diskutováno (anglické forum) s výsledkem a nějakým řešením, že jsou dvě možnosti:
A. vkládat jako objekt
B. vytvořit makro
Nyní nemohu dohledat.
__________
Že musí být jednodušší možnost, je vidět například na návodech k výrobkům. Nebo užívají placený Adobe Acrobat nebo zadara LaTeX?

Editoval regine (5. 2. 2020 21:11:38)

Offline

#2 4. 2. 2020 09:20:01

neutr
Člen
Registrace: 8. 3. 2007
Příspěvků: 3,023

Re: Vložit obrázek na řádek - VYŘEŠENO

Ano určitě to jde. Viděl jsem podobné udělátko jenom nevím kde. Doplním, že existuje volba ukotvení "ke znaku" a také "jako znak" - to je lepší volba pokud potřebujete dávat místo znaků obrázky (například Captcha code).
     Určitě to bude součástí nějakého rozšíření pro LO, nebo i AOO. Musíte hledat a zkoušet. Některá rozšíření jsou nefunkční z různých důvodů, ale lze je upravit. Pokud byste nenašla nic vhodného popište lépe problém. Problémy se týkají například velikosti obrázku který zvětšuje výšku řádku a celkový dojem je špatný. Častým problémem jsou vzorce vkladané jako obrázky. Jindy může jít o ikony které spustí například makro, nebo film, prezentaci ...


Moje e-mailová adresa
Pokud je Váš problém vyřešen, označte prosím svůj příspěvek za "VYŘEŠENÝ"
Zlepšíte orientaci při vyhledávání řešení JAK OZNAČIT TÉMA ZA VYŘEŠENÉ

Offline

#3 4. 2. 2020 13:18:54

kamlan
Člen
Registrace: 15. 9. 2016
Příspěvků: 138

Re: Vložit obrázek na řádek - VYŘEŠENO

Já na tohle používám makro pro které jsem si udělal ikonku v Nástrojové liště přes Nástroje/ Přizpůsobit. Takže vložím obrázek nebo objekt z Drawu a on se někam vloží ale zůstane označený, kliknu na tu ikonku (nebo zmáčknu klávesovou zkratku kterou pro tohle makro mám), on přemimózní svou polohu většinou ještě někam jinam do textu ale je již ukotven jako znak, pak Ctrl+X a Ctrl+V na požadované místo. Takže v podstatě 3 klávesové zkratky s jedním meziklikem na požadovanou pozici.

Sub objektJakoZnak 'vybraný grafický objekt nebo obrázek ukotví jako znak a vycentruje ho svisle na střed znaku
	on local error resume next
	dim oDoc, obj, sel, pole(), s$, i%
	oDoc=thisComponent
	sel=oDoc.CurrentController.getSelection
	pole=sel.getSupportedServiceNames()
	for i=lbound(pole()) to ubound(pole())
		s=pole(i)
		if s="com.sun.star.text.TextGraphicObject" then 'jde o obrázek
			obj=sel
			goto sem
		end if
	next i
	obj=sel.getByIndex(0) 'jde o křivky
	if isNull(obj) then exit sub
sem:
	obj.AnchorType=1 'ukotvit jako znak
	obj.VertOrient=5 'svisle na střed znaku
End Sub

Offline

#4 4. 2. 2020 19:41:33

regine
Člen
Registrace: 11. 1. 2014
Příspěvků: 11

Re: Vložit obrázek na řádek - VYŘEŠENO

To: kamlan
Díky. Částečně ulehčí vkládání.
Pro INFO: Pokud vložit na řádek, parametr:

obj.VertOrient=1

Offline

#5 4. 2. 2020 21:47:47

kamlan
Člen
Registrace: 15. 9. 2016
Příspěvků: 138

Re: Vložit obrázek na řádek - VYŘEŠENO

Číslo pro to svislé umístění obrázku (obj.VertOrient) se dá zjistit z nějakého pokusného obrázku kterému se nastaví ve vlastnostech požadované svislé umístění, nechá se označený a spustí se toto makro.

Sub svisleUmisteniObrazku 'vypíše číslo pro svislé umístění obrázku
	dim oDoc, oSel
	oDoc=thisComponent
	oSel=oDoc.CurrentController.getSelection 'aktuální výběr
	if oSel.supportsService("com.sun.star.text.TextGraphicObject")=true then 'jde o obrázek
		msgbox oSel.VertOrient
	else
		msgbox "Výběr není obrázek"
	end if	
End Sub

Ještě můžete zkusit toto makro pro vkládání obrázku na tu danou pozici, otevře se vám rovnou dialog pro výběr souboru a měl by se vložit obrázek s ukotvením nastaveným v proceduře objektJakoZnak2 na danou pozici aniž byste musela cokoliv jiného udělat.
Jen je to taková směs uno:příkazů a API příkazů, že to nemusí vždy vyjít, ale pro malé obrázky kterým netrvá dlouho se načíst by snad neměl být problém

Sub vlozObrazekjakoZnak
	dim oDoc, fSoub, sUrl, oVCur, oPos, document, dispatcher, oSel, bZnova, obj, oImg
	oDoc=thisComponent
	oVCur=oDoc.CurrentController.getViewCursor() 'viditelný kurzor
	oPos=oVCur.getStart()
	fSoub=CreateUnoService("com.sun.star.ui.dialogs.FilePicker") 'služba pro otevírací dialog souboru
	if fSoub.execute()=1 then 'je-li vybrán soubor
		sUrl=fSoub.files(0) 'cesta k vybranému souboru
	end if
	fSoub.dispose() 'ukončit otevírací službu
	if sUrl="" then exit sub 'nebyl vybrán soubor
	rem vložení obrázku
	document=oDoc.CurrentController.Frame
	dispatcher=createUnoService("com.sun.star.frame.DispatchHelper")
	dim args1(1) as new com.sun.star.beans.PropertyValue
	args1(0).Name="AsLink" : args1(0).Value=false
	args1(1).Name="FileName" : args1(1).Value=cstr(sUrl)
	dispatcher.executeDispatch(document, ".uno:InsertGraphic", "", 0, args1())
	wait 50 'raději malou pauzu aby se stihl vložit obrázek
	objektJakoZnak2 'nastavit kotvu a svislé umístění
	dispatcher.executeDispatch(document, ".uno:Cut", "", 0, array()) 'Ctrl+X
	oVCur.goToRange(oPos,false) 'viditelný kurzor na předchozí vybranou pozici
	dispatcher.executeDispatch(document, ".uno:Paste", "", 0, array()) 'Ctrl+V
	dispatcher.executeDispatch(document, ".uno:Escape", "", 0, array()) 'Esc
	oVCur.goRight(1,false) 'viditelný kurzor za obrázek
End Sub


Sub objektJakoZnak2 'vybraný grafický objekt ukotví jako znak, nastaví svislé umístění a pak ho označí
	on local error resume next
	dim oDoc, obj, oSel
	oDoc=thisComponent
	oSel=oDoc.CurrentController.getSelection 'aktuální výběr
	if oSel.supportsService("com.sun.star.text.TextGraphicObject")=true then 'jde o obrázek
		obj=oSel
		obj.AnchorType=1 'ukotvit jako znak
		obj.VertOrient=5 'svisle na střed znaku
		oDoc.currentController.select(obj) 'označit obrázek
		wait 50 'raději chvíli počkat
	end if
End Sub

Offline

#6 4. 2. 2020 22:28:36

kamlan
Člen
Registrace: 15. 9. 2016
Příspěvků: 138

Re: Vložit obrázek na řádek - VYŘEŠENO

Tak přeci jen by to mělo jít naprosto jednoduše :-)

Sub vlozObr2 'vloží obrázek na danou pozici viditelného kurzoru
	dim oDoc, fSoub, sUrl, oVCur, oPos, oImg
	oDoc=thisComponent
	oVCur=oDoc.CurrentController.getViewCursor() 'viditelný kurzor
	oPos=oVCur.getStart()
	fSoub=CreateUnoService("com.sun.star.ui.dialogs.FilePicker") 'služba pro otevírací dialog souboru
	if fSoub.execute()=1 then 'je-li vybrán soubor
		sUrl=fSoub.files(0) 'cesta k vybranému souboru
	end if
	fSoub.dispose() 'ukončit otevírací službu
	if sUrl="" then exit sub 'nebyl vybrán soubor
	rem vložení obrázku
	oImg=oDoc.createInstance("com.sun.star.text.TextGraphicObject") 'objekt obrázku
	oImg.graphicUrl=sUrl 'url
	oImg.anchorType=1 'ukotvit jako znak
	oImg.VertOrient=5 'svisle na střed znaku
	oImg.attach(oPos) 'vložit obrázek
End Sub

Offline

#7 5. 2. 2020 21:09:32

regine
Člen
Registrace: 11. 1. 2014
Příspěvků: 11

Re: Vložit obrázek na řádek - VYŘEŠENO

Skvělé!!! big_smile Až dnes náhodou shlédnuto. FUNGUJE! Díky.

Editoval regine (8. 2. 2020 08:06:47)

Offline

#8 7. 2. 2020 11:58:01

kamlan
Člen
Registrace: 15. 9. 2016
Příspěvků: 138

Re: Vložit obrázek na řádek - VYŘEŠENO

Ještě v tom byla chyba, vložil se objekt pro prázdný obrázek když se soubor nevybral, tudíž makro níže by mělo fungovat snad již stopro :-).


Sub vlozObr2 'vloží obrázek na pozici viditelného kurzoru s přednastaveným ukotvením a svislým zarovnáním
	dim oDoc, fSoub, sUrl, oVCur, oPos, oImg
	oDoc=thisComponent
	oVCur=oDoc.CurrentController.getViewCursor() 'viditelný kurzor
	oPos=oVCur.getStart() 'pozice viditelného kurzoru
	rem výběr souboru
	fSoub=CreateUnoService("com.sun.star.ui.dialogs.FilePicker") 'služba pro otevírací dialog souboru
	if fSoub.execute()=1 then 'je-li vybrán soubor
		sUrl=fSoub.files(0) 'cesta k vybranému souboru
	else 'nebyl vybrán soubor
		goto konec		
	end if
	rem vložení obrázku
	oImg=oDoc.createInstance("com.sun.star.text.TextGraphicObject") 'objekt obrázku
	oImg.graphicUrl=sUrl 'url
	oImg.AnchorType=1 'UKOTVIT JAKO ZNAK =com.sun.star.text.TextContentAnchorType.AS_CHARACTER
	oImg.VertOrient=5 'SVISLE NA STŘED ZNAKU =com.sun.star.text.VertOrientation.CHAR_CENTER
	oImg.attach(oPos) 'vložit obrázek na pozici
konec:
	fSoub.dispose() 'uvolnit otevírací službu
End Sub

Editoval kamlan (7. 2. 2020 15:53:05)

Offline

#9 7. 2. 2020 12:43:33

neutr
Člen
Registrace: 8. 3. 2007
Příspěvků: 3,023

Re: Vložit obrázek na řádek - VYŘEŠENO

Já bych doporučil lepší ukončení asi takto :

else 'nebyl vybrán soubor
   MsgBox("Nebyl vybrán žádný obrázek, program skončí - akci opakujte",48,"Chybný výběr obrázku")	
Exit Sub 'nebo stop
end if

Když člověk ztratí přehled, tak nejednou neví co se děje - takhle je to fakt lepší.

Editoval neutr (7. 2. 2020 12:45:12)


Moje e-mailová adresa
Pokud je Váš problém vyřešen, označte prosím svůj příspěvek za "VYŘEŠENÝ"
Zlepšíte orientaci při vyhledávání řešení JAK OZNAČIT TÉMA ZA VYŘEŠENÉ

Offline

#10 7. 2. 2020 15:08:03

regine
Člen
Registrace: 11. 1. 2014
Příspěvků: 11

Re: Vložit obrázek na řádek - VYŘEŠENO

Nová verze OK! smile
Ale... náhodou ponechán vložený obrázek označený při úpravě velikostí a dán pokyn k vložení dalšího obrázku, což vyvolalo chybu.

Editoval regine (8. 2. 2020 08:05:55)

Offline

#11 7. 2. 2020 15:55:20

kamlan
Člen
Registrace: 15. 9. 2016
Příspěvků: 138

Re: Vložit obrázek na řádek - VYŘEŠENO

Do makra jsem tedy přidal uno příkaz na zmáčknutí Escapu který odznačí případný výběr. Když nic nebude označeno tak stisk Esc nic nedělá, tudíž to není nijak podmínkováno.
Libre má tendence změnit poněkud velikost vloženého obrázku, takže poslední řádek nastaví původní velikost, byť tedy za cenu překreslení již vloženého obrázku.


Ukázka s jednotlivými polohami obrázku v řádku zde https://uloz.to/file/ipMpW8y0oHvi/libre … o-znak-pdf


Sub vlozObr2 'vloží obrázek na pozici viditelného kurzoru s přednastaveným ukotvením a svislým zarovnáním
	dim oDoc, fSoub, sUrl, oVCur, oPos, oImg, oSel, oCur, document, dispatcher
	oDoc=thisComponent
	document=oDoc.CurrentController.Frame : dispatcher=createUnoService("com.sun.star.frame.DispatchHelper")
	dispatcher.executeDispatch(document, ".uno:Escape", "", 0, array()) 'je-li něco označeno tak odznačit
	oVCur=oDoc.CurrentController.getViewCursor() 'viditelný kurzor(po odznačení je na konci bývalého výběru)
	oPos=oVCur.getStart() 'pozice viditelného kurzoru
	rem výběr souboru
	fSoub=CreateUnoService("com.sun.star.ui.dialogs.FilePicker") 'služba pro otevírací dialog souboru
	if fSoub.execute()=1 then 'je-li vybrán soubor
		sUrl=fSoub.files(0) 'cesta k vybranému souboru
	else 'nebyl vybrán soubor
		msgbox("Nebyl vybrán žádný obrázek",48,"Chybný výběr obrázku")
		exit sub	
	end if
	fSoub.dispose() 'uvolnit otevírací službu
	rem vložení obrázku
	oImg=oDoc.createInstance("com.sun.star.text.TextGraphicObject") 'objekt obrázku
	oImg.graphicUrl=sUrl 'url
	oImg.AnchorType=1 'UKOTVIT JAKO ZNAK =com.sun.star.text.TextContentAnchorType.AS_CHARACTER
	oImg.VertOrient=5 'SVISLE NA STŘED ZNAKU =com.sun.star.text.VertOrientation.CHAR_CENTER
	oImg.attach(oPos) 'vložit obrázek na pozici
	oImg.Size=oImg.ActualSize 'nastavit původní velikost obrázku (nelakat se když obrázek problikne)
End Sub

Detekce toho je-li před vložením obrázku něco vybráno vůbec není snadná. Když je vybrán text tak objekt výběru je jiný než když je vybrána třeba tabulka nebo křivky nebo obrázek atd. Další makro je na to otipování co že je případně vlastně vybráno, ale musí se u výběru testovat buď rozhraní (hasUnoInterfaces) nebo služba (supportsService).

Třeba v Pitonyakově bibli (a nejen tam) je pro testování označenosti použita primárně vlastnost oSel.Count, jenže ta v případě označeného obrázku neexistuje, což pak hází chyby, tudíž přes ty rozhraní a služby je to lepší, byť jich na testování bude nejspíš mnohem víc.

Je to spíše takový pokus, při vybraném obrázku to nabídne jeho zvětšení, to už bylo v ukázce na En fóru :-) https://ask.libreoffice.org/en/question … selection/

Sub jeNecoVybrano 'zkusí trefit a vypsat co že je vybráno
	Rem převážně z https://ask.libreoffice.org/en/question/144907/libreoffice-basic-iterate-through-all-images-in-a-selection/
	Dim oDoc, oSel, s$, IsSelectionEmpty As Boolean
	oDoc=ThisComponent
	oSel=oDoc.currentController.getSelection() 'aktuální výběr
	Rem co je vybráno
	IsSelectionEmpty = False
	If (IsNull(oSel)) Then 'objekt oSel je null
		IsSelectionEmpty = True
	Rem obsahuje-li výběr rozhraní
	ElseIf (HasUnoInterfaces(oSel, "com.sun.star.drawing.XShape")) Then
		s="Obrázek, nebo snad něco z Drawu? Nebo něco dalšího?" 'nefachá zrovna moc přesně, zahrne i tabulku Calcu vloženou jako Sešit LibreOffice 6.2
		Rem obsahuje-li výběr službu
		If oSel.supportsService( "com.sun.star.text.TextGraphicObject" ) Then 'vybrán obrázek
			if msgbox("Jde o obrázek, zvětšit ho 2x?",4)=6 then
				Rem třeba zvětšit rozměry obrázku
				Dim aNewSize As New com.sun.star.awt.Size
				aNewSize.Width = oSel.Size.Width * 2
				aNewSize.Height = oSel.Size.Height * 2
				oSel.setSize( aNewSize)
			end if
			exit sub
		End If		
	ElseIf (HasUnoInterfaces(oSel, "com.sun.star.sheet.XSheetCellRange")) Then
		s="SheetCellRange - nevím na co je"
	ElseIf (HasUnoInterfaces(oSel, "com.sun.star.text.XTextTableCursor")) Then
		s="Tabulka ve Writeru nebo některé její buňky"
	ElseIf (oSel.Count = 0) Then
		IsSelectionEmpty = True
	Rem obsahuje-li výběr službu
	ElseIf ((oSel.Count = 1) AND oSel.supportsService("com.sun.star.text.TextRanges")) Then
		With oSel(0)
			If (.text.compareRegionStarts(.getStart, .getEnd)=0) Then
				IsSelectionEmpty = True
			Else
				s="Vybrán text"
			End If
		End With
	End If
	MsgBox IIf(IsSelectionEmpty = True,"NIC NEVYBRÁNO",IIf(s<>"",s,"Vybráno NĚCO JINÉHO než na co byly podmínky")
End Sub

Editoval kamlan (7. 2. 2020 18:54:44)

Offline

#12 7. 2. 2020 20:31:34

neutr
Člen
Registrace: 8. 3. 2007
Příspěvků: 3,023

Re: Vložit obrázek na řádek - VYŘEŠENO

Já si myslím, že se musí začít u samotných obrázků. Měly by být uloženy stejně jako ikony (požadavek autorky) - tedy tak aby se shodovala načtená velikost. Takže u ikon se řeší problém několika velikostí 100%. Potom se nemůže projevit problém "původní velikosti".
     Obrázky, nebo jiné grafické záležitosti by měly mít také alternativní (vnitřní název), správnou koncovku formátu (bmp, jpeg, ...). Když by se i přes to obrázek nějak zvětšil, či zmenšil, tak stačí pod pravým tlačítkem vybrat "původní velikost". Obrázky (ikony) by měly být bitmapové (Draw je vektorový) takže by se měly dělat v externím nástroji (ve Windows mám oblíbený IrfanWiev) který má možnost plno rozšíření, ale když bych dělal něco takového, tak bych obrázek odněkud sejmul screenem (je jedno jaký měl zdroj formát) a uložit ve správné velikosti i formátu. Dá se tak udělat rychle stejný obrázek v několika velikostech a ve stejném formátu.
     Pokud si správně postavíte knihovnu, není třeba vybírat (selectovat), ale stačí volat vnitřní název. Volá se to jako odkaz, ale uděláme z toho embedding (makrem). Zase určitě takové makra existují. Kamlan toho ví asi víc než já o vkládání obrázků do Writeru, ale dá se to dohledat a myslím že něco takového i mám. Nejspíš po vybudování správných zdrojů ty zákeřné projevy skončí.


Moje e-mailová adresa
Pokud je Váš problém vyřešen, označte prosím svůj příspěvek za "VYŘEŠENÝ"
Zlepšíte orientaci při vyhledávání řešení JAK OZNAČIT TÉMA ZA VYŘEŠENÉ

Offline

#13 8. 2. 2020 12:07:07

kamlan
Člen
Registrace: 15. 9. 2016
Příspěvků: 138

Re: Vložit obrázek na řádek - VYŘEŠENO

neutr: to co jste popsal přesahuje mé současné znalosti o vkládání obrázků :-). Já než začal řešit tento příspěvek tak jsem uměl vkládat obrázek jen pomocí uno příkazu dispatcher.executeDispatch(document, ".uno:InsertGraphic", "", 0, args1()).

No a při řešení jsem v podružné Pitonyakově bibli (o něco menší s více příklady) našel to vkládání přes oImg.attach(). Z čehož jsem měl tak ohromnou radost - neb je to zatím co nyní vím poslední algoritmus do mé arabské transkripce který jsem neuměl - že jsem si k tomu udělal rovnou i pořádné ukázky jak se to k těm řádkům přichytává.


No a při té ukázce jsem dále narazil na další možnosti třeba s těmi velikostmi, nebo jste zmínil třeba i ten problém s tím že je něco označeno, takže i obyčejné vkládání obrázku makrem může být docela šichta - a při vkládání různě velkých obrázků se člověk ruční korekci asi nevyhne.

Offline

#14 14. 2. 2020 15:05:17

hdplot
Člen
Registrace: 18. 2. 2015
Příspěvků: 90

Re: Vložit obrázek na řádek - VYŘEŠENO

Možná trochu opožděně, ale zašlu svůj postup. V podstatě se shoduje s tím, jak postupuje tazatelka s malým rozdílem. Tedy:

1) Vložím obrázek - umístí se nahodile
2) Edituji vlastnosti vložení - dám umístit jako znak - na dříve nahodilém umístění se zarovná do pozice k nejbižšímu znaku
3) Znovu obrázek vyberu a dám vyjmout (CTRL+X)
4) Posunu kurzor na místo, kde chci obrázek mít a vložím (CTRL+V) - vloží se zpět, ale už s nastaveným umístěním jako znak, takže zůstane na místě kurzoru.

Není to tak moc práce a obejdu se bez makra - tedy univerzální použití kdykoliv

Offline

Zápatí