Mit ComatePlus Image im Word-Header platzieren

Windowsspezifisches Forum , API ,..
Beiträge, die plattformübergreifend sind, gehören ins 'Allgemein'-Forum.
Meier
Beiträge: 21
Registriert: 18.01.2018 17:02

Mit ComatePlus Image im Word-Header platzieren

Beitrag von Meier »

Hallo zusammen,

ich möchte gerne mit ComatePlus ein Bild im Header von Word platzieren.

Bei meiner Recherche habe ich folgenden Code gefunden, den ich geringfügig angepasst habe:

Code: Alles auswählen

XIncludeFile "../COMatePLUS.pbi"
   
Procedure AmendHeader()
 
  Protected.S strCommand
  Protected appWord.COMateObject, docMine.COMateObject, objHeader.COMateObject 
  Debug "CreateObject"
  appWord = COMate_CreateObject("Word.Application")
  Debug COMate_GetLastErrorDescription()
 
  If appWord
   
    Debug "Application.Visible=#True"
    appWord\SetProperty("Application\Visible=#True")
    Debug COMate_GetLastErrorDescription()
   
    ; Open the document.
    Debug "Documents\Open"
    strCommand = "Documents\Open('C:\test.doc')"
    appWord\Invoke(strCommand)
    Debug COMate_GetLastErrorDescription()
   
    Debug "ActiveDocument"
    docMine = appWord\GetObjectProperty("ActiveDocument")
    Debug COMate_GetLastErrorDescription()
   
    Debug "Header Range"
    ; wdHeaderFooterPrimary = 1
    strCommand = "Sections(1)\Headers\Item(1)\Range"
    objHeader = docMine\GetObjectProperty(strCommand)
    Debug COMate_GetLastErrorDescription()
    
    ;***********************************   Hier möchte eine Bild in den Header einfügen   *************************************************
    Debug "Bild einfügen"
    objHeader\SetProperty("Application\InlineShapes\AddPicture\FileName='D:\image.jpg'")   ; Vorher wurde hier der auskommentierte Text eingefügt. Der Parameter ist quasi aus VBA.
;     Debug "Text Property"
;     strCommand = "Text = 'Word COM Automation Test'"
;     objHeader\SetProperty(strCommand)
    Debug COMate_GetLastErrorDescription()
    ;**************************************************************************************************************************************
    ; Tidy up.
    Debug "Release Objects"
   
    objHeader\Release()
    docMine\Release()
    appWord\Release()
   
  Else
   
    Debug "Failed to create application object."
    Debug COMate_GetLastErrorDescription()
   
  EndIf
   
  ProcedureReturn ReturnValue
 
EndProcedure

AmendHeader()
Fehlermeldung:
Method/property not supported by this object.
Vielleicht kann mir ja jemand unter die Arme greifen. Entweder genau hierzu oder vielleicht gibt es ja auch eine andere Möglichkeit, ein Bild in den Header einzubinden.


Gruß
Meier
Meier
Beiträge: 21
Registriert: 18.01.2018 17:02

Re: Mit ComatePlus Image im Word-Header platzieren

Beitrag von Meier »

Hallo zusammen,

ich habe versucht oben folgenden VBA-Code in ComatePlus umzusetzen:

Code: Alles auswählen

    ActiveWindow.ActivePane.View.SeekView = wdSeekCurrentPageHeader
    Selection.InlineShapes.AddPicture FileName:= _
        "D:\image.jpg"
    ActiveWindow.ActivePane.View.SeekView = wdSeekMainDocument
Ich habe jetzt auch diese kürzere VBA-Version gefunden:

Code: Alles auswählen

ThisDocument.Sections.Item(1).Headers(wdHeaderFooterPrimary) _
  .Range.InlineShapes.AddPicture ("D:\image.jpg")
Diese kommt der ComatePlus-Version von oben ja schon sehr nahe.

Aber egal wie ich versuche die Parameter zu kombinieren, kommen folgende Fehlermeldungen:
'Method/property not supported by this object.'
oder
Member not found. (Check that you have not omitted any optional parameters and are not trying to set a read-only property etc.)'
Ich hab das Gefühl, ich brauche einfach einen Schubs.

Viele Grüße
Meier
Benutzeravatar
Kiffi
Beiträge: 10620
Registriert: 08.09.2004 08:21
Wohnort: Amphibios 9

Re: Mit ComatePlus Image im Word-Header platzieren

Beitrag von Kiffi »

*schubs*

Code: Alles auswählen

XIncludeFile "../COMatePLUS.pbi"

EnableExplicit

Procedure InsertImageToWordHeader(WordFilename.s, ImageFilename.s)
  
  Protected oWordApplication.COMateObject
  Protected oActiveDocument.COMateObject
  Protected oSection.COMateObject 
  Protected oHeader.COMateObject 
  
  Debug "CreateObject"
  oWordApplication = COMate_CreateObject("Word.Application")
  Debug COMate_GetLastErrorDescription()
  
  If oWordApplication
    
    Debug "Application.Visible=#True"
    oWordApplication\SetProperty("Application\Visible=#True")
    Debug COMate_GetLastErrorDescription()
    
    ; Open the document.
    Debug "Documents\Open"
    oWordApplication\Invoke("Documents\Open('" + WordFilename + "')")
    Debug COMate_GetLastErrorDescription()
    
    ; ####
    
    Debug "oActiveDocument"
    oActiveDocument = oWordApplication\GetObjectProperty("ActiveDocument")
    Debug COMate_GetLastErrorDescription()
    
    If oActiveDocument
      
      Debug "oSection..."
      oSection = oActiveDocument\GetObjectProperty("Sections(1)")
      Debug COMate_GetLastErrorDescription()
      
      If oSection
        
        Debug "oHeader..."
        oHeader = oSection\GetObjectProperty("Headers(1)") ; 1 = wdHeaderFooterPrimary
        Debug COMate_GetLastErrorDescription()
        
        If oHeader
          
          Debug "oHeader..."
          oHeader\Invoke("Range\InlineShapes\AddPicture('" + ImageFilename + "')")
          Debug COMate_GetLastErrorDescription()
          
          oHeader\Release()
          
        Else
          Debug "!oHeader"
        EndIf
        
        oSection\Release()
        
      Else
        Debug "!oSection"
      EndIf
      
      oActiveDocument\Release()
      
    Else
      Debug "!oActiveDocument"
    EndIf
    
    oWordApplication\Release()
    
    Debug "Ready!"
    
  Else
    
    Debug "Failed to create application object."
    Debug COMate_GetLastErrorDescription()
    
  EndIf
  
EndProcedure

InsertImageToWordHeader("c:\test.doc", "D:\image.jpg")
Dokument speichern und schließen und vorher testen, ob Word-Datei und Bild-Datei auch tatsächlich vorhanden sind, müsstest Du noch selber implementieren.

Grüße ... Peter
Hygge
Meier
Beiträge: 21
Registriert: 18.01.2018 17:02

Re: Mit ComatePlus Image im Word-Header platzieren

Beitrag von Meier »

Hallo Peter,

okay ich muss zugeben, auf 'Headers(1)' wäre ich nicht gekommen.

Aber es funktioniert. Das Bild wird in der Kopfzeile dargestellt. Vielen Dank dafür. :allright:

Leider ist das Bild links oben in der Kopfzeile und lässt sich nicht da wegbewegen.
Ich habe es versucht in gleicher Weise mit 'Item(1)' (scheint es nicht zu geben) und mit 'Selection'+'Move' (kommt nicht in die Kopfzeile, obwohl er

Code: Alles auswählen

appWord\Invoke("ActiveWindow\ActivePane\View.SeekView = 'wdSeekCurrentPageHeader'")
akzeptiert).

Es soll eine Zeile tiefer.

Hast du noch eine Hilfestellung?


Gruß
Meier
Benutzeravatar
Kiffi
Beiträge: 10620
Registriert: 08.09.2004 08:21
Wohnort: Amphibios 9

Re: Mit ComatePlus Image im Word-Header platzieren

Beitrag von Kiffi »

Meier hat geschrieben:Es soll eine Zeile tiefer.
also das Bild soll in den Header, aber darüber eine Leerzeile?

Code: Alles auswählen

XIncludeFile "../COMatePLUS.pbi"

EnableExplicit

Procedure InsertImageToWordHeader(WordFilename.s, ImageFilename.s)
  
  Protected oWordApplication.COMateObject
  Protected oActiveDocument.COMateObject
  Protected oSection.COMateObject 
  Protected oHeader.COMateObject 
  Protected oRange.COMateObject 
  
  Debug "CreateObject"
  oWordApplication = COMate_CreateObject("Word.Application")
  Debug COMate_GetLastErrorDescription()
  
  If oWordApplication
    
    Debug "Application.Visible=#True"
    oWordApplication\SetProperty("Application\Visible=#True")
    Debug COMate_GetLastErrorDescription()
    
    ; Open the document.
    Debug "Documents\Open"
    oWordApplication\Invoke("Documents\Open('" + WordFilename + "')")
    Debug COMate_GetLastErrorDescription()
    
    ; ####
    
    Debug "oActiveDocument"
    oActiveDocument = oWordApplication\GetObjectProperty("ActiveDocument")
    Debug COMate_GetLastErrorDescription()
    
    If oActiveDocument
      
      Debug "oSection..."
      oSection = oActiveDocument\GetObjectProperty("Sections(1)")
      Debug COMate_GetLastErrorDescription()
      
      If oSection
        
        Debug "oHeader..."
        oHeader = oSection\GetObjectProperty("Headers(1)") ; 1 = wdHeaderFooterPrimary
        Debug COMate_GetLastErrorDescription()
        
        If oHeader
          
          Debug "oRange..."
          oRange = oHeader\GetObjectProperty("Range") 
          Debug COMate_GetLastErrorDescription()
          
          If oRange
            
            Debug "Set Range Text..."
            oRange\SetProperty("Text = '" + #CRLF$ + "'")
            Debug COMate_GetLastErrorDescription()
            
            Debug "Range Collapse..."
            oRange\Invoke("Collapse(0)") ; 0 = wdCollapseEnd
            Debug COMate_GetLastErrorDescription()
            
            Debug "AddPicture..."
            oRange\Invoke("InlineShapes\AddPicture('" + ImageFilename + "')")
            Debug COMate_GetLastErrorDescription()
            
            oRange\Release()
            
          Else
            Debug "!oRange"
          EndIf
          
          oHeader\Release()
          
        Else
          Debug "!oHeader"
        EndIf
        
        oSection\Release()
        
      Else
        Debug "!oSection"
      EndIf
      
      oActiveDocument\Release()
      
    Else
      Debug "!oActiveDocument"
    EndIf
    
    oWordApplication\Release()
    
    Debug "Ready!"
    
  Else
    
    Debug "Failed to create application object."
    Debug COMate_GetLastErrorDescription()
    
  EndIf
  
EndProcedure

InsertImageToWordHeader("c:\test.doc", "D:\image.jpg")
Grüße ... Peter
Hygge
Meier
Beiträge: 21
Registriert: 18.01.2018 17:02

Re: Mit ComatePlus Image im Word-Header platzieren

Beitrag von Meier »

Hallo Peter,

fast, die zweite Zeile ist schon da. Ich muss nur eine Zeile runter und dann einfügen.

Also statt

Code: Alles auswählen

oRange\SetProperty("Text = '" + #CRLF$ + "'")

Code: Alles auswählen

oRange\Invoke("Selection\MoveDown")
Besten Dank. Es klappt. :bounce:

Viele Grüße
Meier
Meier
Beiträge: 21
Registriert: 18.01.2018 17:02

Re: Mit ComatePlus Image im Word-Header platzieren

Beitrag von Meier »

Hallo zusammen,

zu früh gefreut. Ich war Freitag in Eile und habe die Fehlermeldung nicht drum herum gebaut. Das Logo stand nur zufällig richtig. 'range-move'-Befehl hatte keine Auswirkung. :oops:

In meiner Testumgebung kann ich den 'range-type'-Befehl anwenden. Was ich noch nicht erwähnt habe (weil ich dachte, dass es nicht wichtig sei) ist, dass mein eigentlicher Header wie folgt aussieht:

Bild

Wenn ich den 'range-type'-Befehl anwende, ist der komplette Rahmen samt Inhalt weg. Nur das Logo steht in der 2. Zeile des Headers.


Noch eine Idee?

Gruß
Meier
Meier
Beiträge: 21
Registriert: 18.01.2018 17:02

Re: Mit ComatePlus Image im Word-Header platzieren

Beitrag von Meier »

Hallo zusammen,

ich komme einfach nicht weiter.

Ich verfolge zum Einen den Weg von Peter, wobei egal was ich ändere entweder der Rahmen verschwindet oder das Bild sich nicht von oben links wegbewegt.

Zum Anderen habe ich immer wieder versucht den folgenden VBA-Code in ComatePlus zu übersetzen, der ja genau das macht:

Code: Alles auswählen

ActiveWindow.ActivePane.View.SeekView = wdSeekCurrentPageHeader
    Selection.MoveDown Unit:=wdLine, Count:=1
    Selection.InlineShapes.AddPicture FileName:= _
        "C:\test.jpg" _
        , LinkToFile:=False, SaveWithDocument:=True
    ActiveWindow.ActivePane.View.SeekView = wdSeekMainDocument
Wobei ich den ersten Befehl schon nicht übersetzt bekomme.

Hat jemand noch eine Hilfestellung?

Viele Grüße
Meier
Benutzeravatar
Kiffi
Beiträge: 10620
Registriert: 08.09.2004 08:21
Wohnort: Amphibios 9

Re: Mit ComatePlus Image im Word-Header platzieren

Beitrag von Kiffi »

wie wäre es, wenn Du Dir ein Template (*.docx) samt korrekt platziertem Logo bauen würdest?

Grüße ... Peter
Hygge
Meier
Beiträge: 21
Registriert: 18.01.2018 17:02

Re: Mit ComatePlus Image im Word-Header platzieren

Beitrag von Meier »

Hallo Peter,

das hatte ich vorher und hatte jahrelang funktioniert.

Jetzt soll aber aus einer Auswahl von Logos zur Laufzeit ein Bild gewählt werden und dann eingefügt werden.

Das drumherum ist fertig, nur das Setzen des Bildes fehlt noch.

Es handelt sich um ca. 72 Logos. Ich könnte für jedes Logo eine Vorlage erstellen. Bei Änderungen müsste ich dann immer alle 72 Vorlagen anpassen. Und die Tendenz der Logoanzahl ist steigend.

Freundliche Grüße
Meier
Antworten