1

这个问题断断续续地困扰了我大约一年,我想也许其他人会有类似情况的经历。

目标:在 Mac OS X 10.6-7 上,NSViews使用定义的分辨率和“高速”设置打印多台 EPSON Stylus Pro 4880 打印机,而不显示打印面板。

当前情况:NSPrintOperations我可以为每个创建成功NSView,但是如果我不显示打印面板,则似乎使用了打印机的默认分辨率,这对于我的需要来说太高而且太慢了。

迄今为止我拥有的最佳解决方案:我尝试显示打印面板并定义一个 Mac OS 的“预设”,它已经启用了正确的打印分辨率和高速设置。这里的缺点是 Mac 预设会覆盖我通过 设置的副本数量NSCopies,这是一个问题。另一个困难当然是有人总是在身边每天按几千次“确定”按钮。

我在哪里

  • NSPrintOperation运行它的面板时,它必须在某处设置 EPSON 特定的打印机设置,但我找不到它的保存位置。它们似乎没有设置在[NSPrintInfo printSettings].

  • 我查看了打印机的 PPD,但我在任何地方都找不到高速设置,并且 PPD 中定义的默认分辨率实际上并未用作打印时的默认值。看来 EPSON 有自己的驱动程序设置,这些设置不是从我拥有的 PPD 中获取的,我不知道如何手动设置它们。

  • 基本上,NSPrintOperation使用打印面板和预设运行会覆盖所有设置,包括我不想覆盖的设置。在没有打印面板的情况下运行它会将所有设置保留为默认设置,这不是我想要的。谁能指出我在这两者之间找到解决方案的正确方向?

4

2 回答 2

0

不幸的是,这是迄今为止我发现的最好的解决方案,尽管我讨厌称它为“最好的”,甚至是“解决方案”。回到这个:使用面板运行操作,然后以编程方式“单击”Print按钮。

[op runOperationModalForWindow: self.window delegate: self didRunSelector: nil contextInfo: nil];
NSPanel *panel = (NSPanel*)self.window.attachedSheet;
for (NSView *view in ((NSView*)panel.contentView).subviews)
{
    if (view.class == [NSButton class])
    {
        NSButton *button = (NSButton*)view;
        if ([button.title isEqualToString: @"Print"])
            [button performClick: self];
    }
}

或者

op.runOperationModalForWindow(window, delegate: nil, didRunSelector: nil, contextInfo: nil)
(window.attachedSheet?.contentView.subviews.filter({ $0 is NSButton }) as [NSButton]).filter({ $0.title == "Print" }).first?.performClick(self)

缺点显然是需要一个窗口,而我希望将其作为无头服务器应用程序运行。我曾尝试使用 Core Printing 和PMPrinter/PMPrintSettings等等,但无济于事。我唯一还没有尝试过的就是直接与 CUPS 交谈。也许我会把它留着以备不时之需!

于 2012-01-25T05:10:09.497 回答
0

在 NSPrintOperation 的 runOperation 与对话框一起运行后,查看 PMPrintSettings,打印机特定的参数可能在那里。我想您可以以某种方式为将来保留 PMPrintSettings 并通过 updateFromPMPrintSettings 加载。

于 2013-04-17T23:25:54.353 回答