Hey Jochen,

Jochen Georges schrieb:
[..]
>>Ich hätte ein 
>>Beispiel für das Einfügen einer Grafik (eines Bildes) - für die Linie
>>kann ich dir nichts bieten.
> 
> 
> Das würde mich natürlich auch interessieren :-)

Na, der einfachkeitshalber hier der entsprechende Abschnitt aus meinem
Makro-Buch. OK, das Layout leidet ein wenig - aber du wirst es verstehen :-)

********

Grafik in Textdokument einfügen
Ein Beispiel soll den Zugang zum Umgang mit Grafiken erleichtern: Per
Makrocode soll ein vorhandenes Pixelbild in den Text eingebunden werden.
Folgende Überlegungen stehen am Anfang: Ein vorhandenes Pixelbild ist
stets durch einen rechteckigen Rahmen begrenzt. Dieses Bild wird
definiert durch die Anzahl der Pixel in horizontaler und vertikaler
Richtung, für jedes Pixel hat die Datei die entsprechenden
Farbinformationen abgespeichert.
Dadurch steht der prinzipielle Weg zum Einfügen eines Bildes fest:
-       Erzeugen eines (Grafik-) Objektes
-       Das Pixelbild dem Grafikobjekt zuweisen
-       Hinzufügen des Grafikobjektes zum Textdokument (hierbei kommen
wiederum grundsätzlich zwei Wege in Frage: Hinzufügen zur Drawpage oder
Hinzufügen als Text-Content – beide sind möglich und führen zum selben
Ergebnis)
Würde man hier aufhören, ist das Grafikobjekt zwar der Seite
hinzugefügt, aber kaum sichtbar. Durch das bloße Erzeugen des
Grafikobjektes wurde dieses nämlich noch nicht dimensioniert, hätte also
die Größe 1 Pixel. Die nächsten Schritte sind also:
-       Größe des Grafikobjektes festlegen
-       Eventuell Position neu fixieren
-       Weitere Eigenschaften festlegen
Ein Grafikobjekt wird innerhalb eines Dokumentes als Instanz  des
Services com.sun.star.drawing.GraphicObjectShape erstellt. Dieses neue
Objekt bietet diverse Eigenschaften, hier einige der wichtigsten:
Eigenschaft     Beschreibung
GraphicURL      Als String – Dies ist der URL zu der Quelldatei der Grafik,
also der Pfad und der Dateinamen zu der Grafikdatei. Ein GraficURL
bindet die Daten komplett ein.
GraphicStreamURL        Als String – wie Graphic-URL, jedoch wird die Grafik
nicht eingebunden, sondern verknüpft, d.h., die Grafikdaten werden
jeweils neu geladenGraphicObjectFillBitmap      Als
com.sun.star.awt.XBitmap-Objekt – dieses Objekt repräsentiert die
Bitmap-Grafik
AdjustLuminance
AdjustContrast
AdjustRed
AdjustGreen
AdjustBlue      Jeweils als Short – Werden diese Eigenschaften gesetzt, so
werden die jeweiligen Kanäle mit der übergebenen Prozentzahl
nachjustiertGamma       Als Double – Wird diese Eigenschaft gesetzt, so wird
der Gammawert der Grafik auf den übergebenen Wert justiert.
Transparency    Als Short – setzt die Transparenz der Grafik. Es werden
Prozentzahlen übergeben:
100 -> 100 % = voll transparent, durchsichtig
0   ->  0 %    = gar nicht transparent
GraficColorMode Enum aus com.sun.star.drawing.ColorMode – setzt den
Modus, wie die Grafik „gezeichnet“ wird:
-       STANDARD – wie Vorgabe des Ausgabemediums (also in der Regel in Farbe)
-       GREYS – Die Grafik wird in Graustufen dargestellt.
-       MONO – Halbtonverfahren – verwendete Farben sind nur Schwarz und Weiß
-       WATERMARK – als „Wasserzeichen“
Es kann nur eine URL-Angabe gemacht werden. Soll die Grafik eingebunden
werden, so werden alle Informationen innerhalb des Dokumentes
gespeichert. Die Original-Grafikdatei kann nach dem Einbinden verschoben
werden (oder gelöscht). Wird die Grafik hingegen nur verknüpft, so
werden die Daten jedes Mal dann eingelesen, wenn die Ansicht die Grafik
zeigt. Der Pfad muss dann ständig Bestand haben.
Das folgende Beispiel fügt in die bestehende Textdatei eine Grafik ein
(Sie fin-den es in der Datei BSP_Writer_18.odt. Achten Sie beim
Ausprobieren darauf, dass auch die Datei Tiger.jpg im selben Verzeichnis
wie die Beispieldatei zu finden ist):

01  Sub GrafikEinfuegen
02  Dim oDoc as Object, oGrafik as Object, oDrawpage as Object
03   Dim sURL as String, oTxtRange as Object, oBitMapGr as Object
04  Const tpm = 0.017636684
05  oDoc = ThisComponent
06  oDrawpage = oDoc.getDrawpage()
07  oTxtRange = ThisComponent.text.getEnd()
08  oGrafik = oDoc.createInstance("com.sun.star.drawing.GraphicObjectShape")
09  sURL = oDoc.URL
10  Mid(sURL, InStr(sURL, RetrieveFileName(oDoc)), len(sURL), "Tiger.jpg")
11  oGrafik.GraphicURL = sURL
12  oDoc.Text.insertTextContent(oTxtRange, oGrafik, False)
13  REM  oDrawpage.add(oGrafik)
14  oGrafik.AnchorType =
com.sun.star.text.TextContentAnchorType.AT_PARAGRAPH
15  Dim oGrafGr as new com.sun.star.awt.Size
16  oBitmapGr = oGrafik.GraphicObjectFillBitmap.GetSize
17  oGrafGr.height = oBitmapGr.height * TwipsPerPixelX * tpm *100
18  oGrafGr.width = oBitmapGr.width * TwipsPerPixelY * tpm * 100
19  oGrafik.setSize(oGrafGr)
20 End Sub

Die Schritte im Einzelnen:
In Zeile 03 wird der Umrechnungsfaktor Twips in Millimetern als
Konstante definiert. Diese Umrechnung wird später benötigt.
In Zeile 07 beschafft man sich eine Textmarke (genauer: ein
TextRange-Objekt) – hier Ende des Textes –, um dort später die Grafik
einfügen zu können.
In Zeile 08 wird das Grafikobjekt erzeugt – als Objekt des Dokumentes.
Um diesen Objekt nun die Grafik zuweisen zu können, muss der Pfad zu
dieser Grafik bekannt sein. In statischen Systemen ist dies einfach,
hier kann man den Pfad fest vorgeben. Schwieriger wird es, wenn die
Dokumente verteilt werden sollen, jetzt kann man einen statischen,
absoluten Pfad kaum noch definieren. Es ist aber möglich, den Pfad
relativ zum aktuellen Dokument zu definieren. Hier nutzt man aus, dass
das vorhandene Dokument schon einen Pfad (URL) besitzt und man diesen
auslesen kann (Zeile 09).
Über die eingebaute Funktion RetrieveFileName() – die Funktion gehört
zum Lieferumfang von OOo, zu finden in der Bibliothek „Tools“ im Modul
„Misc“ – lässt sich auch der Dateiname leicht auslesen. Jetzt muss nur
noch der Datei-name im aktuellen Pfad durch den Dateinamen der
Grafikdatei ersetzt werden (Zeile 10), schon kann dieser dem
Grafikobjekt zugeordnet werden (Zeile 11).
Der erste Teil wäre jetzt erledigt, das Objekt existiert, die
Grafikdatei ist zuge-wiesen. Nun muss das Objekt eingebettet werden.
Dafür gibt es nun zwei Mög-lichkeiten:
1.      Über die Methode insertTextContent() wird die Grafikdatei dem
Text-objekt direkt zugeordnet. Nutzen Sie diesen Weg, muss schon ein
An-kerpunkt (ein TextRange-Objekt) als Platzierung mit übergeben
wer-den. Die Methode erkennt, dass es sich um ein Grafikobjekt handelt,
und fügt dieses somit entsprechend zur Drawpage hinzu.
2.      Da das Objekt ohnehin zur Drawpage gehört, können Sie es auch gleich
dort hinzufügen. Dies geschieht mit der Methode add(), der das
Grafik-objekt übergeben wird. Dieses wird dann immer in der linken
oberen Ecke der Drawpage als Ankerpunkt fixiert.
Beide Methoden sind im Beispiel enthalten, wobei natürlich nur eine
genutzt werden sollte (Zeile 12 beziehungsweise auskommentiert Zeile 13).
In beiden Fällen aber ist nun ein Text-Content-Objekt (siehe auch Anfang
Abschnitt 5.3) erzeugt worden, das diverse Eigenschaften besitzt, unter
anderem den Ankertyp. Voreingestellt bei Textdokumenten ist hier
„AS_CHARACTER“ – also als Zeichen –, der natürlich für Grafiken gänzlich
ungeeignet ist. Es wird folglich ein anderer Typ gewählt und zugewiesen
(Zeile 14). Die Grafik befindet sich jetzt je nach gewählter
Einfügemethode entweder in der oberen linken Ecke der sichtbaren Seite
(die Drawpage wird vom Cont-roller ausgewertet -> Viewpage) bei add()
oder am gewählten und übergebenen Ankerpunkt bei der Methode
insertTextContext(), aber jeweils noch als eine 1 Pixel große Grafik.
Der nächste Schritt ist nun also, die Grafik entsprechend zu skalieren.
Noch einmal zum besseren Verständnis: Das Grafikobjekt ist quasi ein
Rahmen, be-stimmt durch seine Seitenlängen und entsprechend
positioniert. Dieser Rahmen kann eine Bitmap-Grafik aufnehmen und
entsprechend anzeigen. Der Rahmen hat aber eigene Größen-Eigenschaften,
die noch nicht gesetzt sind.
Im Beispiel soll das Bild in seiner Originalgröße (342*269 Pixel)
eingefügt werden. Die Problematik besteht nun darin, erstens die
Originalgröße auszule-sen und zweitens, diese dem Rahmenobjekt
zuzuweisen. Was zunächst recht einfach klingt, erweist sich in der
Praxis als ein wenig tückisch, da die Maßein-heiten leider nicht
identisch sind.
Die Grafik-Rahmengröße erwartet eine Größenangabe in 100stel
Millimetern, das Bild besitzt lediglich die Pixelanzahl. Ein Pixel
wiederum ist entsprechend der Ausgabeumgebung unterschiedlich groß –
also benötigt man die Umrech-nung zunächst auf Twips (siehe auch Kapitel
2.6.7 -> Grafikfunktionen) und anschließend auf 100stel Millimeter. Der
Umrechnungsfaktor von Twips in Millimeter wurde dabei schon am Anfang
als Konstante definiert.
Zunächst benötigen Sie eine neues Größenobjekt, ein Struct des Typs
com.sun.star.awt.Size (Zeile 15).
In Zeile 16 wird nun die Größe der in der Grafik vorhandenen Bitmap (die
ge-ladene Grafik) ausgelesen – wie gesagt, auch dieses ist ein Struct
des Typs com.sun.star.awt.Size, die Werte aber repräsentieren die
Pixelanzahl des Ori-ginalbildes.
Die Werte werden nun umgerechnet auf 100stel Millimeter und dem neuen
Größenobjekt zugeordnet(Zeile 17 und 18). Letztendlich wird dann der
Grafik diese Größe zugewiesen (Zeile 19).
*********

Viele Grüße

Thomas
-- 
## Marketing deutschsprachiges Projekt
## http://de.openoffice.org  - www.openoffice.org
## Vorstand OpenOffice.org Deutschland e.V.
## Mitglieder willkommen: www.OOoDeV.org

---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]

Antwort per Email an