如何使用OpenOffice oleautomation选择要打印的打印机?

时间:2013-09-25 18:37:50

标签: delphi openoffice-writer ole-automation

我正在使用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,但是我得到了参数类型不匹配错误。

1 个答案:

答案 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