Tach!
Ich habe mal Tage damit verbracht, bis es richtig funktionierte, Microsoft Word per OLE zu steuern.
Aber mit der Erfahrung ist es mir gerade gelungen (nach nur 20 Fehlversuchen) mittels OLE und OpenOffice/LibreOffice ein .odt/.docx als .pdf zu speichern.
Code: Alles auswählen
unit OpenOfficeUnit;
{$mode objfpc}{$H+}
interface
function convertODTtoPDF(const SrcFilename, PdfFilename: String): Boolean;
implementation
uses
SysUtils, Variants, ComObj;
function convertPath_FileURI(const Path: String): String;
begin
Result := 'file:///' + StringReplace(Path, '\', '/', [rfReplaceAll]);
end;
function convertODTtoPDF(const SrcFilename, PdfFilename: String): Boolean;
var
v, ServiceManager, Desktop, Document, Options: Variant;
begin
Result:=false;
if (SrcFilename='') or (PdfFilename='') then Exit;
if not FileExists(SrcFilename) then Exit;
VarClear(Document);
try
ServiceManager := CreateOleObject('com.sun.star.ServiceManager');
Desktop := ServiceManager.createInstance('com.sun.star.frame.Desktop');
Options := VarArrayCreate([0,2],varVariant); // 2 = höchster Index = 3 Elemente
v := ServiceManager.Bridge_GetStruct('com.sun.star.beans.PropertyValue');
v.Name := 'Hidden';
v.Value := true;
Options[0] := v;
v := ServiceManager.Bridge_GetStruct('com.sun.star.beans.PropertyValue');
v.Name := 'ReadOnly';
v.Value := true;
Options[1] := v;
v := ServiceManager.Bridge_GetStruct('com.sun.star.beans.PropertyValue');
v.Name := 'AsTemplate';
v.Value := false;
Options[2] := v;
v := convertPath_FileURI(SrcFilename);
Document := Desktop.loadComponentFromURL( v, '_blank', 0, Options );
if not VarIsClear(Document) then
begin
Options := VarArrayCreate([0,0],varVariant); // zweite 0 = höchster Index = 1 Element
v := ServiceManager.Bridge_GetStruct('com.sun.star.beans.PropertyValue');
v.Name := 'FilterName';
v.Value := 'writer_pdf_Export';
Options[0] := v;
v := convertPath_FileURI(PdfFilename);
Document.storeToURL( v, Options );
Result:=true;
end;
except // on E: Exception do Writeln(E.ClassName, ': ', E.Message);
Result:=false;
end;
VarClear(Options);
if not VarIsEmpty(Document) then begin Document.close(false); VarClear(Document); end;
VarClear(Desktop);
VarClear(ServiceManager);
end;
end.
Dazu eine Test-Funktion ...
Code: Alles auswählen
procedure Test();
var Path, SrcFilename, DestFilename: String;
begin
Path := ExtractFilePath(ParamStr(0));
SrcFilename := Path+'Test.odt';
DestFilename := Path+'Test.pdf';
if convertODTtoPDF(SrcFilename, DestFilename)
then ShowMessage('geklappt')
else ShowMessage('Fehler');
end;
Habe gerade erfolgreich getestet, dass es nicht nur mit .odt geht, sondern auch mit .docx und vermutlich allen Dateitypen, die von LibreOffice geöffnet werden können.
Ich hoffe, dass viele Leute das gut gebrauchen können.
Grüße, Jörg