Wie Bilddateien in Writer verlinken statt einbetten?

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

Moderator: Moderatoren

Newbie_4711
Beiträge: 2
Registriert: Mi, 09.07.2014 17:18

Wie Bilddateien in Writer verlinken statt einbetten?

Beitrag von Newbie_4711 »

Hallo zusammen,

zum Erstellen von Fotoanlagen schreibe ich ein Makro, das mir alle jpg Dateien im Verzeichnis des Writer-Dokuments in das Dokument, und zwar mit fortlaufender Nummer als Bildunterschrift, darstellt. Das klappt auch. Was noch nicht klappt ist, dass die jpg Dateien lediglich verlinkt werden. Stattdessen werden die Bilder jetzt immer eingebettet, was die Fotoanlage natürlich sehr groß macht.

Wie kann ich die Dateien lediglich verlinkt einfügen?

Danke schon im Voraus für alle Hinweise.
Hier die wesentlichen Teile meines bisherigen Codes:

Code: Alles auswählen

'Schleife: alle jpg-Dateien laden und formatieren
sFileName = Dir(sPath, 0)
iBildNr = 0
do while (sFileName <> "")
  if UCase (Right(sFileName, 3)) = "JPG" then
    iBildNr = iBildNr + 1
    sImgPath = sPath + sFileName
    sBildUnterschrift = "" + CHR$(10) + "Foto " + CStr(iBildNr) + CHR$(10) + CHR$(10) + CHR$(10)
    oBitmaps = oDoc.createInstance( "com.sun.star.drawing.BitmapTable" )
    oBitmaps.insertByName( "myPic", sImgPath )
    oPic = oBitmaps.getByName( "myPic" )
    oGraph = oDoc.createInstance("com.sun.star.text.GraphicObject")   
    oGraph.GraphicURL = oPic
    oGraph.AnchorType = com.sun.star.text.TextContentAnchorType.AS_CHARACTER
    oCursor = oDoc.CurrentController.getViewCursor
    If NOT isEmpty(oCursor.TextTable) Then
      oCursor.Cell.insertTextContent(oCursor, oGraph, False)
    ElseIf NOT isEmpty(oCursor.TextFrame) Then
      oCursor.TextFrame.insertTextContent(oCursor, oGraph, False)
    Else
      oDoc.Text.insertTextContent(oCursor,oGraph, False)
      oDoc.Text.insertString(oCursor, sBildUnterschrift, False)
    End If
    ' Bild in der Größe anpassen
    Original_SizePixel = oGraph.Graphic.SizePixel
    Factor_Width=Size_max.width/Original_SizePixel.width
    Factor_Height=Size_max.Height/Original_SizePixel.Height
    if Factor_Width<=Factor_Height then 'bestimmen ob die Breite oder die Höhe der begrenzende Faktor ist
      factor = Factor_Width
    else
      factor = Factor_Height
    endif
    Size_new.width = Original_SizePixel.width*factor
    Size_new.Height = Original_SizePixel.Height*factor
    oGraph.size = Size_new 'verändere die Größe des dargestellten Bildes
    oBitmaps.removeByName("myPic") 'lösche das Bitmap-Objekt wieder
  end if 'Datei ist eine Bilddatei mit Endung jpg
  sFileName = Dir() 'hole nächsten Dateinamen aus dem Verzeichnis
loop 'Ende der Schleife für Bilder einbinden
F3K Total
********
Beiträge: 3724
Registriert: Mo, 28.02.2011 17:49

Re: Wie Bilddateien in Writer verlinken statt einbetten?

Beitrag von F3K Total »

Ohne Test, das Anlegen der Bitmap ist nicht nötig, versuche dies:

Code: Alles auswählen

    'Schleife: alle jpg-Dateien laden und formatieren
    sFileName = Dir(sPath, 0)
    iBildNr = 0
    do while (sFileName <> "")
      if UCase (Right(sFileName, 3)) = "JPG" then
        iBildNr = iBildNr + 1
        sImgPath = sPath + sFileName
        sBildUnterschrift = "" + CHR$(10) + "Foto " + CStr(iBildNr) + CHR$(10) + CHR$(10) + CHR$(10)


        oGraph = oDoc.createInstance("com.sun.star.text.GraphicObject")   
        oGraph.GraphicURL = sImgPath
        oGraph.AnchorType = com.sun.star.text.TextContentAnchorType.AS_CHARACTER
        oCursor = oDoc.CurrentController.getViewCursor
        If NOT isEmpty(oCursor.TextTable) Then
          oCursor.Cell.insertTextContent(oCursor, oGraph, False)
        ElseIf NOT isEmpty(oCursor.TextFrame) Then
          oCursor.TextFrame.insertTextContent(oCursor, oGraph, False)
        Else
          oDoc.Text.insertTextContent(oCursor,oGraph, False)
          oDoc.Text.insertString(oCursor, sBildUnterschrift, False)
        End If
        ' Bild in der Größe anpassen
        Original_SizePixel = oGraph.Graphic.SizePixel
        Factor_Width=Size_max.width/Original_SizePixel.width
        Factor_Height=Size_max.Height/Original_SizePixel.Height
        if Factor_Width<=Factor_Height then 'bestimmen ob die Breite oder die Höhe der begrenzende Faktor ist
          factor = Factor_Width
        else
          factor = Factor_Height
        endif
        Size_new.width = Original_SizePixel.width*factor
        Size_new.Height = Original_SizePixel.Height*factor
        oGraph.size = Size_new 'verändere die Größe des dargestellten Bildes

      end if 'Datei ist eine Bilddatei mit Endung jpg
      sFileName = Dir() 'hole nächsten Dateinamen aus dem Verzeichnis
    loop 'Ende der Schleife für Bilder einbinden
Gruß R
Newbie_4711
Beiträge: 2
Registriert: Mi, 09.07.2014 17:18

Re: Wie Bilddateien in Writer verlinken statt einbetten?

Beitrag von Newbie_4711 »

Danke für die schnelle Rückmeldung. Das klappt tatsächlich soweit, dass die Bilder jetzt nur verlinkt werden. Allerdings läuft der Code so nicht, da ich beim Anpassen der Größe jetzt die Fehlermeldung "Basic Laufzeitfehler 91 Objektvarialbe nicht belegt" auf die Variable 'oGraph.Graphic.SizePixel' erhalten. Ich habe gelesen, dass das wohl ein Synchronisierungsproblem ist, und tatsächlich, wenn ich eine Wartezeit (etwa über eine MsgBox) erzwinge, bevor die Größe der Grafik abgefragt wird, funktioniert es ganz:

Code: Alles auswählen

   ...
    ' Bild in der Größe anpassen
    MsgBox sImgPath, 0, "Verlinke..."    
    Original_SizePixel = oGraph.Graphic.SizePixel
   ...
Das ist natürlich eine unerwünschte Krücke. Wie kann ich das Synchronisierungsproblem besser lösen? Und kann ich die Links auch als relative Links zum Verzeichnis, in dem sich die Datei befindet anlegen, anstatt wie jetzt gemacht, absolute Pfade im Verzeichnis zu benutzen?
Antworten