gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 09:41:57 25 4
gpt4 key购买 nike

我正在使用 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 文档打印方法或其支持的属性的文档,我想我应该定义一些属性,如下所示:

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

问题 A 部分,对于 Print 和所有其他类似的 Document 方法接受的所有属性,是否有完整的 HTML 在线引用? B 部分是设置上述内容的属性或技术是什么。我确实相信 OO 中的 Document 对象实现了一个名为 IXPrintable 的接口(interface),所以我想知道如何找到 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,但收到参数类型不匹配错误。

最佳答案

好吧,我让它工作了,问题是我没有正确创建属性值。另外,我还愚蠢地假设,当您调用 SetPrinter 时,您将参数传递给 Print,并将属性名称设置为打印机名称,然后调用 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

关于delphi - 如何使用 OpenOffice oleautomation 选择要打印到的打印机?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19012648/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com