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]