[gelöst] Bilder bearbeiten

Programmierung unter AOO/LO (StarBasic, Python, Java, ...)

Moderator: Moderatoren

Philipp_19
****
Beiträge: 115
Registriert: Mo, 29.08.2011 09:01
Wohnort: Duisburg

[gelöst] Bilder bearbeiten

Beitrag von Philipp_19 »

Ich habe vor einigen Tagen ein Makro geschrieben das mir Bilder aus einem Verzeichnis hochlädt.
Klappt auch alles wunderbar, nur stehe ich jetzt vor einem Problem:
Die Bilder werden einfach nur eingebunden, bisher habe ich keinerlei Bearbeitungen vorgenommen an den Bildern (Größe, Position, etc.)

Nun die Fragestellung: Ist es möglich über ein Makro die Position, Größe, etc. zu verändern? Das Dokument dient als Vorlage für Kunden unserer Firma, ich kann dem Kunden also schlecht sagen: "Entschuldigung, aber Sie müssen jedes Bild immer wieder manuell anpassen."
Die Bilder sollen, nach Vorgabe des Kunden, im Verhältnis 2:1 sein (Verzerrung ist komischer Weise uninteressant), sollen an einer bestimmten Position im Dokument sein und eine vorgegebene Größe haben.

Sowohl im Internet, als auch in den guten Dokus (Andrew Pitonyak und andere) finde ich keine Infos dadrüber, ob und wie man Grafiken im Dokument anspricht bzw. wie ich die entsprechenden Attribute einstelle.
Mir würde schon reichen, die entsprechenden Codeschnipsel zu erhalten, also wie ich die Grafiken anspreche und welche Attribute es gibt. Den Rest bastel ich mir dann selber zusammen.

Danke für die Hilfe schonmal

Grüße
Philipp
Zuletzt geändert von Philipp_19 am Mo, 12.09.2011 14:44, insgesamt 1-mal geändert.
Windows XP, OOo 3.3.0
oder
Windows 7, OOo 3.3.0
Benutzeravatar
komma4
********
Beiträge: 5332
Registriert: Mi, 03.05.2006 23:29
Wohnort: Chon Buri Thailand Asia
Kontaktdaten:

Re: Bilder bearbeiten

Beitrag von komma4 »

Philipp_19 hat geschrieben:Mir würde schon reichen, die entsprechenden Codeschnipsel zu erhalten, also wie ich die Grafiken anspreche und welche Attribute es gibt. Den Rest bastel ich mir dann selber zusammen.
Kapitel 5.9 Loading/Inserting a graphic into your document in Andrews Dokument
Cheers
Winfried
aktuell: LO 5.3.5.2 30m0(Build:2) SUSE rpm, unter Linux openSuSE Leap 42.3 x86_64/KDE5
DateTime2 Einfügen von Datum/Zeit/Zeitstempel (als OOo Extension)
Philipp_19
****
Beiträge: 115
Registriert: Mo, 29.08.2011 09:01
Wohnort: Duisburg

Re: Bilder bearbeiten

Beitrag von Philipp_19 »

Okay, habe die ersten 200 Seiten auf deutsch geladen, war wohl ein Fehler. Geht nur bis 5.6...ich schau mal, danke^^
Windows XP, OOo 3.3.0
oder
Windows 7, OOo 3.3.0
Benutzeravatar
komma4
********
Beiträge: 5332
Registriert: Mi, 03.05.2006 23:29
Wohnort: Chon Buri Thailand Asia
Kontaktdaten:

Re: Bilder bearbeiten

Beitrag von komma4 »

Hat sich Deine Frage im libreoffice-forum damit auch erledigt?


Du weisst: Crossposting ohne Referenz ist unhöflich!
Cheers
Winfried
aktuell: LO 5.3.5.2 30m0(Build:2) SUSE rpm, unter Linux openSuSE Leap 42.3 x86_64/KDE5
DateTime2 Einfügen von Datum/Zeit/Zeitstempel (als OOo Extension)
Philipp_19
****
Beiträge: 115
Registriert: Mo, 29.08.2011 09:01
Wohnort: Duisburg

Re: Bilder bearbeiten

Beitrag von Philipp_19 »

Naja im LibreOffice-Forum hatte sich bisher keiner gemeldet. Hab dann einfach weiter gesucht, aber ja, ich denke das hat sich damit wohl auch erledigt.
Entschuldige das :)
Windows XP, OOo 3.3.0
oder
Windows 7, OOo 3.3.0
Philipp_19
****
Beiträge: 115
Registriert: Mo, 29.08.2011 09:01
Wohnort: Duisburg

Re: Bilder bearbeiten

Beitrag von Philipp_19 »

Okay, das Kapitel in Andrews Doku hat mir nicht weitergeholfen, habe im Internet aber zwei Makros gefunden, die zwar genau das machen sollen was ich will, aber ich bekomme immer Fehlermeldungen zurück.

Code: Alles auswählen

Sub ResizeEmbeddedPictureInWriter
   oDesktop = createUnoService("com.sun.star.frame.Desktop")
   oDocument = ThisComponent
   oSelection = oDocument.CurrentSelection
   If oSelection.ImplementationName <> "SwXTextGraphicObject" Then
      MsgBox "Select image first..."
      Exit Sub
   End If
   nFactor = InputBox("Resize factor in %:","Resizing picture...",50)
   If Not(IsNumeric(nFactor)) Then Exit Sub
   nFactor = Val(nFactor)/100
   Dim oSize as new com.sun.star.awt.Size
   oSize.Width = Int(oSelection.Width * nFactor)
   oSize.Height = Int(oSelection.Height * nFactor)
   oSelection.setSize(oSize)
End Sub
Das ist das eine Makro, crasht bei mir aber schon in der Zeile:

Code: Alles auswählen

   oSelection = oDocument.CurrentSelection
.CurrentSelection ist unbekannt, und ich weiß inzwischen auch nicht weiter. Hab einiges versucht, aber ich komme nicht an meine Grafik dran. (Name ist Grafik1), dran kommen kann man mit GetByName("Grafik1"), aber alles davor will er nicht annehmen.
Also wenn jemand mir hier zeigen kann wie ich die Grafik anspreche, wäre mir sehr weitergeholfen.
Windows XP, OOo 3.3.0
oder
Windows 7, OOo 3.3.0
Philipp_19
****
Beiträge: 115
Registriert: Mo, 29.08.2011 09:01
Wohnort: Duisburg

Re: Bilder bearbeiten

Beitrag von Philipp_19 »

Gast hat geschrieben:Winfried ist keiner?
Oder geht es nicht um diesen Beitrag?
Es geht um diesen Beitrag, aber hat sich dennoch niemand auf mein aktuelles Problem gemeldet. Und komma4 hat lediglich auf diesen Thread hier verwiesen.
Windows XP, OOo 3.3.0
oder
Windows 7, OOo 3.3.0
Benutzeravatar
komma4
********
Beiträge: 5332
Registriert: Mi, 03.05.2006 23:29
Wohnort: Chon Buri Thailand Asia
Kontaktdaten:

Re: Bilder bearbeiten

Beitrag von komma4 »

Philipp_19 hat geschrieben:.CurrentSelection ist unbekannt
Das Makro arbeitet mit der ausgewählten Grafik.... hast Du diese markiert?
Cheers
Winfried
aktuell: LO 5.3.5.2 30m0(Build:2) SUSE rpm, unter Linux openSuSE Leap 42.3 x86_64/KDE5
DateTime2 Einfügen von Datum/Zeit/Zeitstempel (als OOo Extension)
Philipp_19
****
Beiträge: 115
Registriert: Mo, 29.08.2011 09:01
Wohnort: Duisburg

Re: Bilder bearbeiten

Beitrag von Philipp_19 »

Komischerweise meckert Basic erst bei dem Makro, nun klappt es...ich verstehs nicht :D
Auf jeden Fall lässt sich die BIldgröße nun anpassen mit:

Code: Alles auswählen

oDesktop = createUnoService("com.sun.star.frame.Desktop")
	oDocument = ThisComponent
	oSelection = oDocument.CurrentSelection
	Dim oSize as new com.sun.star.awt.Size
	oSize.Width = 2000
	oSize.Height = 1000
	oSelection.setSize(oSize)
Jetzt muss das ganze noch mit der Position erweiter werden.

Code: Alles auswählen

Dim Point as new com.sun.star.awt.Point
Point.x = 100
Point.y = 100
oSelection.Position = Point
Dies ist die gängige Lösung im Internet zu dem Problem, doch bei mir sagt er "position cannot be changed with this methode"...
Vorschläge?


Die Grafik ist übrigends nach dem Einfügen direkt ausgewählt, also kann ich dir nicht erklären warum Selection nicht gegriffen hat :?:
Windows XP, OOo 3.3.0
oder
Windows 7, OOo 3.3.0
Philipp_19
****
Beiträge: 115
Registriert: Mo, 29.08.2011 09:01
Wohnort: Duisburg

Re: Bilder bearbeiten

Beitrag von Philipp_19 »

Muss jetzt leider hier nochmal nach haken, ob bisher jemand eine Lösung gefunden hat.
Ich habe inzwischen einen Haufen Threads gelesen (auch englische), aber das Problem wird nirgends gelöst.
Das FAQ hat darauf keine Antworten, die Online-Hilfe ebenfalls nicht und die 3 bis 4 Dokus, die ich hier liegen habe, helfen mir da auch nicht mehr weiter.

Windows XP, OO 3.3

Ich erkläre nochmals kurz das Problem:
Ich lade mit dem Makro ein Bild hoch. Dabei wird die Größe direkt mitgeändert. Jetzt bleibt das Problem der Positionierung. Das Bild wird Standartmäßig in der Mitte geladen. Das soll so aber nicht sein, sondern es soll beliebig positionierbar sein.

Code: Alles auswählen

rem ----------------------------------------------------------------------
	dim args1(3) as new com.sun.star.beans.PropertyValue
	args1(0).Name = "FileName"
	args1(0).Value = Path
	args1(1).Name = "FilterName"
	args1(1).Value = "<Alle Formate>"
	args1(2).Name = "AsLink"
	args1(2).Value = false
	args1(3).Name = "Style"
	args1(3).Value = "Grafik"

	dispatcher.executeDispatch(document, ".uno:InsertGraphic", "", 0, args1())

rem ----------------------------------------------------------------------
	dim args2(3) as new com.sun.star.beans.PropertyValue
	args2(0).Name = "FileName"
	args2(0).Value = Path
	args2(1).Name = "FilterName"
	args2(1).Value = "<Alle Formate>"
	args2(2).Name = "AsLink"
	args2(2).Value = false
	args2(3).Name = "Style"
	args2(3).Value = "Grafik"

	dispatcher.executeDispatch(document, ".uno:InsertGraphic", "", 0, args2())
Da ich bisher keinen Weg gefunden habe, das Makro komplett selbst zu schreiben, musste ich mich dem dispatcher bedienen.
die Größe kann ich hiermit ändern:

Code: Alles auswählen

	Dim Size as new com.sun.star.awt.Size
	Size.Width = 5000
	Size.Height = 2500
	oSelection.Size = Size
Hatte zuerst angenommen, das Problem mit

Code: Alles auswählen

	Dim Point as new com.sun.star.awt.Point
	Point.x = 100
	Point.y = 100
	oSelection.Position = Point
in den Griff zu bekommen, allerdings kommt dann eine Fehlermeldung "position cannot be changed by this method".

Eine Idee war, das Bild in einen Textrahmen bzw. einer Tabellenzelle zu laden, doch kann ich das inzwischen ausschließen, da die Bilder unterschiedlich groß sein können.
Kleine Ergänzung, die euch nicht umbedingt wichtig ist für das Problem. Es wird pro Dokument ein Bild geladen. Das Bild wird über

Code: Alles auswählen

part4 = Dir(Path & "Bild.*", 0)
ausgelesen. Diese Bilder werden dabei immer in einem Temp-Verzeichnis zwischengespeichert nachdem sie über eine Software aufgerufen wurden. Die Bilder haben ALLE den gleichen Namen (Beispielsweise "Bild1.bmp")
Ich stelle nachher noch eine Datei hoch, die zeigen soll, wo das Bild aktuell geladen wird, und wo es eigentlich hinkommen soll. Braucht ihr das, um das Problem zu lösen?

Hoffe ihr habt ein paar mehr Ideen als ich.

Grüße und schonmal ein Danke an alle im vorraus.
Windows XP, OOo 3.3.0
oder
Windows 7, OOo 3.3.0
Benutzeravatar
komma4
********
Beiträge: 5332
Registriert: Mi, 03.05.2006 23:29
Wohnort: Chon Buri Thailand Asia
Kontaktdaten:

Re: Bilder bearbeiten

Beitrag von komma4 »

Philipp_19 hat geschrieben:Ich habe inzwischen einen Haufen Threads gelesen (auch englische)
Dann solltest Du auch über DannyB gestolpert sein.

Code: Alles auswählen

Sub Main
	' Create a new empty Writer document.
	oDoc = StarDesktop.loadComponentFromURL( "private:factory/swriter", "_blank", 0, Array() )

	' Get the Text of the document.
	oText = oDoc.getText()
	' Get a cursor that can scan to any point or range of the text.
	oCursor = oText.createTextCursor()
	
	' At this point, you might want to move the cursor to desired
	'  part of text, like this.
	oCursor.gotoStart( False )
	
	' Create a graphic object.
	oGraphic = oDoc.createInstance( "com.sun.star.text.GraphicObject" )
	
	' Insert the graphic object into the text, at current cursor position.
	oText.insertTextContent( oCursor, oGraphic, False )
	
	' Set properties of the graphic.
	oGraphic.AnchorType = com.sun.star.text.TextContentAnchorType.AT_PARAGRAPH
	oGraphic.GraphicURL = ConvertToURL( "C:\Danny\Graphics\Cam01.jpg" )
	oGraphic.HoriOrientPosition = 5500
	oGraphic.VertOrientPosition = 4200
	oGraphic.Width = 4400
	oGraphic.Height = 4000
End Sub
Quelle: InsertGraphicIntoWriter-2004-02-18-01.sxd

Und mit XRAY oGraphic.Anchor solltest Du ansich weiter kommen, oder?
Cheers
Winfried
aktuell: LO 5.3.5.2 30m0(Build:2) SUSE rpm, unter Linux openSuSE Leap 42.3 x86_64/KDE5
DateTime2 Einfügen von Datum/Zeit/Zeitstempel (als OOo Extension)
Philipp_19
****
Beiträge: 115
Registriert: Mo, 29.08.2011 09:01
Wohnort: Duisburg

Re: Bilder bearbeiten

Beitrag von Philipp_19 »

Hi,

Danke dir für die Antwort. Sieht vielversprechend aus, hatte das aber bisher nicht gefunden oder nicht wahrgenommen. :?

Werde das morgen dann mal ausprobieren und dann Rückmeldung geben.
Hoffe das klappt dann endlich mal :(

Grüße und danke nochmal komma
Windows XP, OOo 3.3.0
oder
Windows 7, OOo 3.3.0
Philipp_19
****
Beiträge: 115
Registriert: Mo, 29.08.2011 09:01
Wohnort: Duisburg

Re: Bilder bearbeiten

Beitrag von Philipp_19 »

So hallo,

habe jetzt erstmal weitergebastelt und bin immerhin einen Schritt weiter. Leider hapert es jetzt wieder stark.

Code: Alles auswählen

oGraphic.HoriOrient = 0
oGraphic.HoriOrientPosition = ?
oGraphic.VertOrient = 0
oGraphic.VertOrientPosition = ?
Damit kann ich nun schon die Auswahl treffen, ob die Ausrichtung "links", "rechts", "mitte" oder "von links" ist. Das gleiche mit der vertikalen Ausrichtung.
Nun kann ich mit 0-3 entscheiden, wie es das haben möchte, leider kann ich dannach keine Werte eintragen. Also z.B. "von Links" um "5,00 cm".
Kann mir jemand erklären wie ich an diese Stelle drankomme? Mit oGraphic.HoriOrientPosition klappts nicht.
Ich weiß noch nichtmal, was ich mit dem Befehl eigentlich anstelle, weil sämtlichen Werte ignoriert werden.

Grüße
Windows XP, OOo 3.3.0
oder
Windows 7, OOo 3.3.0
Benutzeravatar
komma4
********
Beiträge: 5332
Registriert: Mi, 03.05.2006 23:29
Wohnort: Chon Buri Thailand Asia
Kontaktdaten:

Re: Bilder bearbeiten

Beitrag von komma4 »

Philipp_19 hat geschrieben: Mit oGraphic.HoriOrientPosition klappts nicht.
Ich weiß noch nichtmal, was ich mit dem Befehl eigentlich anstelle, weil sämtlichen Werte ignoriert werden.
Warum schaust Du nicht mal in die Dokumentation?
http://api.openoffice.org/docs/common/r ... Shape.html

Die gibt es auch zum Runterladen und lokalem Benutzen 8)
Cheers
Winfried
aktuell: LO 5.3.5.2 30m0(Build:2) SUSE rpm, unter Linux openSuSE Leap 42.3 x86_64/KDE5
DateTime2 Einfügen von Datum/Zeit/Zeitstempel (als OOo Extension)
Philipp_19
****
Beiträge: 115
Registriert: Mo, 29.08.2011 09:01
Wohnort: Duisburg

Re: Bilder bearbeiten

Beitrag von Philipp_19 »

Hallo,

okay, danke für den Link, hatte das selber in der Doku nicht gefunden.

Code: Alles auswählen

oGraphic.HoriOrient = HoriOrientation_NONE
	oGraphic.HoriOrientPosition = 9800
	oGraphic.VertOrient = VertOrientation_NONE
	oGraphic.VertOrientPosition = 1800
So klappt das nun. Danke für die Hilfe
Windows XP, OOo 3.3.0
oder
Windows 7, OOo 3.3.0
Antworten