Open Office Writer und Page Orientation

Für alles, was in den übrigen Lazarusthemen keinen Platz, aber mit Lazarus zutun hat.
Antworten
Benutzeravatar
onkeltorty
Beiträge: 6
Registriert: So 19. Nov 2023, 06:49

Open Office Writer und Page Orientation

Beitrag von onkeltorty »

Hallo,
ich suche hier eine Möglichkeit, im Open Office Writer mit OLE die Orientierung der Seite von Portrait auf Landscape zu ändern. Ich habe versucht, es mit UNO zu ändern, aber es ist scheinbar nur möglich, den Dialog für das Seitenformat aufzurufen ('.uno:PageDialog').
Weiß hier jemand, wie man das mit Lazarus programmiert?

Bin bis jetzt so weit gekommen:

Code: Alles auswählen

procedure TOleInterf.SetPageOrientation(bLandscape: boolean = false);
var
  vStyleFamilies, vPageStyles, vStandard, vNewStyle: variant;
begin
  vStyleFamilies := rDocs.vDocs[rDocs.byteActualDocument-1].StyleFamilies;
  vPageStyles := vStyleFamilies.getByName('PageStyles');

  If vPageStyles.hasByName('MyPageStyle1') Then vPageStyles.removeByName('MyPageStyle1');

  vNewStyle := rDocs.vDocs[rDocs.byteActualDocument-1].createInstance('com.sun.star.style.PageStyle');
  vNewStyle.Size.Width := 29700;  //DIN A4 Höhe
  vNewStyle.Size.Height := 21000; //DIN A4 Breite
  vNewStyle.isLandscape := bLandscape;
  vPageStyles.insertByName('MyPageStyle1', vNewStyle);

  //rDocs.vDocs[rDocs.byteActualDocument-1].PageStyle.isLandscape := true; //Erzeugt eine Exception

  vStandard:= vPageStyles.getByName('Standard');
  vStandard.isLandscape := bLandscape;
  //rDocs.vDocs[rDocs.byteActualDocument-1].PageStyle := vStandard; //Erzeugt eine Exception
end;                          
Leider kann ich den PageStyle nicht zuweisen und auch nicht direkt darauf über seine Member zugreifen ...

Benutzeravatar
onkeltorty
Beiträge: 6
Registriert: So 19. Nov 2023, 06:49

Re: Open Office Writer und Page Orientation

Beitrag von onkeltorty »

Ich habe es mittlerweile selbst raus gefunden. Bevor jemand ebenfalls ewig rumtüftelt: hier die Lösung ...
Zuerst erstellt man ein Programm, welches ein OLE-Objekt zu OpenOffice öffnet und anschließend der Writer öffnet: (Siehehttps://wiki.lazarus.freepascal.org/Office_Automation)

Code: Alles auswählen

program TestOO;

{$IFDEF FPC}
 {$MODE Delphi}
{$ELSE}
 {$APPTYPE CONSOLE}
{$ENDIF} 

uses
  SysUtils, Variants, ComObj;

const
  ServerName = 'com.sun.star.ServiceManager';
var          
  Server     : Variant;
  Desktop    : Variant;
  LoadParams : Variant;
  Document   : Variant;
  TextCursor : Variant;
begin
  if Assigned(InitProc) then
    TProcedure(InitProc);

  try
    Server := CreateOleObject(ServerName);
  except
    WriteLn('Unable to start OO.');
    Exit;
  end;

  Desktop := Server.CreateInstance('com.sun.star.frame.Desktop');

  LoadParams := VarArrayCreate([0, -1], varVariant);

   {Create new document}
  Document := Desktop.LoadComponentFromURL('private:factory/swriter', '_blank', 0, LoadParams);

   {or Open existing} //you must use forward slashes, not backward!
  //Document := Desktop.LoadComponentFromURL('file:///C:/my/path/mydoc.doc', '_blank', 0, LoadParams); 

  TextCursor := Document.Text.CreateTextCursor;

   {Insert existing document}  //Substitute your path and doc
  TextCursor.InsertDocumentFromURL('file:///C:/my/path/mydoc.doc', LoadParams);
end.
Nun programmiert man sich eine Funktion, welches die Ausrichtung der Seite steuert:

Code: Alles auswählen

procedure SetPageOrientation(bLandscape: boolean = false);
var
  vStyleFamilies, vPageStyles, vStandard, vNewStyle, vCursor, Size: variant;
  width: integer;
begin
  //StyleFamilies holen
  vStyleFamilies := Document.StyleFamilies;
  //PageStyles holen
  vPageStyles := vStyleFamilies.getByName('PageStyles');
  //Doppelten Eintrag vermeiden 
  If vPageStyles.hasByName('MyPageStyle1') Then vPageStyles.removeByName('MyPageStyle1');
  //"Standard"-Formatvorlage abholen
  vStandard := vPageStyles.getByName('Standard');  //"Default" in Englisch
  //Größe abholen
   Size := vStandard.Size;
  //Breite Speichern
  Width := Size.Width;
  //Breite und Höhe vertauschen
  Size.Width := Size.Height;
  Size.Height := width;
  //Neuen PageStyle erzeugen
  vNewStyle := Document.createInstance('com.sun.star.style.PageStyle');
  //ParentStyle zuweisen
  vNewStyle.ParentStyle := 'Standard';
  //Größe zuweisen
  vNewStyle.Size:=Size; 
  //Ausrichtung zuweisen
  vNewStyle.isLandscape := bLandscape;
  //Neuen Style einfügen
  vPageStyles.insertByName('MyPageStyle1', vNewStyle);
  //Den aktuellen Cursor einholen
  vCursor := Document.GetCurrentController.ViewCursor;
  //Über den Cursor dem Dokument die aktuelle Vorlage mitteilen
  vCursor.PageDescName := 'MyPageStyle1';
Wer wie ich auf Seitengrößen angewiesen ist, der kann sich das in die Funktion mit einfügen:

Code: Alles auswählen

const
  DINA4_Width = 21000; //21 cm breit
  DINA4_Height = 29700; //29,7 cm hoch
  
  [...]
  
  //Bei Hochformat:
  vNewStyle.Size.Width := DINA4_Width;  //DIN A4 Höhe
  vNewStyle.Size.Height := DINA4_Height; //DIN A4 Breite
  vNewStyle.isLandscape := false;
  
  [...]
  //Bei Querformat:
  vNewStyle.Size.Width := DINA4_Height;  //DIN A4 Breite
  vNewStyle.Size.Height := DINA4_Width; //DIN A4 Höhe
  vNewStyle.isLandscape := true;

Antworten