2

我正在使用 OpenOffice Writer,我希望在程序控制下打印。但是,我不希望打印到默认打印机,而是根据我生成的文档类型将某些文档定向到某些打印机。

使用Bernard Marcelly 的 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 方法接受哪些参数或属性。

更新按照评论建议,我尝试使用名为“名称”的属性,如下所示:

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,但出现参数类型不匹配错误。

4

1 回答 1

3

好的,我让它工作了,问题是我没有正确创建属性值。我还愚蠢地假设您在调用时将参数传递给 Print SetPrinter,属性 Name 设置为打印机名称,然后调用Print,仍然没有参数。TLama 链接的 url 清楚地说明了这一点,但我最初错过了它,我想我需要更多的咖啡。

此外,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

于 2013-09-25T19:23:59.817 回答