2013-09-25 49 views
2

我正在使用OpenOffice Writer,并希望在程序控制下打印。但是,根据我生成的文档类型,我不希望打印到默认打印机,而是将某些文档导向某些打印机。如何选择要使用OpenOffice oleautomation进行打印的打印机?

使用Bernard Marcelly's OOoTools库,德尔福,做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文档打印方式或支持,我想我应该定义一些属性的属性,像这样:

printProps := VarArrayCreate([0, 1], varVariant); 
printProps[0] := MakePropertyValue('PrinterName', 'PrinterNameHere') ; 

问题A部分,是有中所有属性的打印彻底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,但是我得到一个参数类型不匹配错误。

+1

也许['这example'(http://wiki.openoffice.org/wiki/API/Samples/Java/Office/DocumentHandling#DocumentPrinter)可能会有所帮助。 – TLama

+0

谢谢,这个例子很有用,但我很难将它翻译成Delphi-sprache。 :-) –

回答

3

好吧我得到它的工作,问题是我没有正确创建属性值。另外我愚蠢地认为你将参数传递给Print时,你所要做的是调用SetPrinter,将属性Name设置为打印机名称,然后调用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; 

编译并运行了一个完整的演示是到位桶这里delphi_openoffice_demo01

+0

是的,ANSI字符串用于属性名称是正确的。无论如何,你可以使用该助手的'MakePropertyValue'函数来创建一个单独的属性(该包装看起来是用于Delphi的ANSI版本,但是对于某些函数参数,可能会明确使用'AnsiString')。 – TLama

+0

'createProperties'调用似乎工作正常,并且有一些安全检查内容。 –

+0

'createProperties'只是因为它需要'Variant'数组作为输入,它必须是'[AnsiString,Variant]'类型的对。对于这种情况,它会创建不必要的变量数组,因为对于['setPrinter'](http://www.openoffice.org/api/docs/common/ref/com/sun/star/view/XPrintable.html#setPrinter)方法调用你只使用一个参数。并且为了使一个参数是来自该包装器的'MakePropertyValue'功能,或者例如我的['CreateProperty'](http://stackoverflow.com/a/7819626/960757)嵌套函数。它们是相同的(假设包装是ANSI Delphi)。 – TLama

相关问题