我正在使用OpenOffice Writer,我希望在程序控制下打印。但是,我不希望打印到默认打印机,而是根据我生成的文档类型将某些文档定向到某些打印机。
使用Bernard Marcelly's OOoTools库,对于Delphi,执行OLE自动化,与OpenOffice,4.0交谈,以下代码适用于打印到当前打印机,
procedure TMyOODocClass.Print;
var
docObj : variant; // Current OOo Document, implements IXPrintable
printProps : variant;
begin
docObj := GetMyActiveDocument; // method not shown, pretty standard stuff.
try
// empty array, I think this is where I would fill in PrinterName?
printProps := VarArrayCreate([0, -1], varVariant);
docObj.print(printProps);
except
on E:EOleException do
begin
raise Exception.Create('OpenOffice Document Print failed. '+E.Message);
end;
end;
end;
我无法找到OpenOffice Writer Document Print方法的文档或它支持的属性,我想我应该定义一些属性,如下所示:
printProps := VarArrayCreate([0, 1], varVariant);
printProps[0] := MakePropertyValue('PrinterName', 'PrinterNameHere') ;
问题A部分是否有针对Print的所有属性以及所有其他类似Document方法接受的完整HTML在线参考?而B部分是设置上述内容的属性或技术。我确实相信OO中的Document对象可以实现 一个名为IXPrintable的接口,所以我想知道如何找到IXPrintable的所有方法,以及该方法中的Print方法接受的参数或属性。
更新根据评论建议,我尝试使用名为“Name”的属性,如下所示:
procedure TMyOODocClass.PrintTo(PrinterName:String);
var
docObj : variant; // Current OOo Document, implements IXPrintable
printProps : variant;
begin
docObj := GetMyActiveDocument; // method not shown, pretty standard stuff.
try
if PrinterName='' then
printProps := dummyArray
else
begin
printProps := VarArrayCreate([0, 1], varVariant);
printProps[0] := MakePropertyValue('Name',PrinterName);
end;
docObj.print(printProps);
except
on E:EOleException do
begin
raise EOOoError.Create('OpenOffice Document Print failed. '+E.Message);
end;
end;
end;
上述方法不起作用,因此必定存在缺失或错误的内容。我也试过调用docObj.SetPrinter
,但是我得到了参数类型不匹配错误。
答案 0 :(得分:3)
好的,我让它工作,问题是我没有正确创建属性值。另外,我愚蠢地假设您将参数传递给Print,当您执行的操作是SetPrinter
,将属性名称设置为打印机名称,然后调用Print
,仍然没有参数。由TLama链接的网址清楚地说明了这一点,但我最初错过了,我想我需要更多的咖啡。
似乎Unicode VarType 258(varUString)值并不特别是OLE自动化,所以我在下面的代码中明确使用AnsiString
。
uses
ComObj,
Classes,
SysUtils,
Dialogs,
Controls,
Windows,
oOoConstants,
OOoTools,
DB,
Variants,
StdCtrls,
Forms;
procedure TMyOODocClass.PrintTo(PrinterName:AnsiString);
var
docObj : variant; // Current OOo Document, implements IXPrintable
emptyProps, printProps: variant;
propName:AnsiString;
begin
docObj := GetMyActiveDocument; // method not shown, pretty standard stuff.
try
emptyProps := dummyArray;
if PrinterName <> '' then
begin
propName := 'Name';
printProps := createProperties( [propName,PrinterName] ); // OOTools helper
docObj.SetPrinter( printProps );
end;
docObj.print(emptyProps);
except
on E:EOleException do
begin
raise EOOoError.Create('OpenOffice Document Print failed. '+E.Message);
end;
end;
end;
编译和运行的完整演示在bitbucket上为delphi_openoffice_demo01