8

更新:我决定在我的项目中使用 appjs,而不是 TideSDK。使用 AppJS,您可以轻松制作节点模块,您可以在其中添加 C++ 模块,以便轻松使用静默打印。我建议任何对该主题感兴趣的人检查一下。祝大家好运!

我正在使用 TideSDK 开发一个应用程序 - 这是一个非常棒的框架,如果您还没有尝试过,请留出一些时间!

无论如何,我正在尝试使用 Javascript 进行打印,但每次都会出现打印设置对话框,就像使用其他浏览器一样。我正在尝试消除该框并传递我希望它打印的打印机。

我知道 FireFox 中有用于静默打印的设置,这是我以前使用的,但 TideSDK 没有任何类似的选项(我已经找到)。

经过大量研究,我认为唯一可行的选项包括 python 脚本、C++ 模块或编辑 TideSDK 源代码并重新编译。对我来说,这三个听起来都比较宽松。修改 TideSDK 源并从中删除对话框webkit_ui_delegate.cpp在以后更新此程序时很可能会导致一些问题 - 除了无法轻松传递打印机名称之外。python 脚本将需要第三方模块并且必须处理页面的内容,我怀疑我是否能够编写一些可以在这方面做得很好的东西。最后,我认为 C++ 解决方案是最可行的,因为它可以访问 win32api,但同样,它必须将 HTML 处理为打印语言,这是我不熟悉的。我想我正在寻找更多为我处理渲染的 webkit 解决方案。

在 TideSDK 上实现静默打印应该怎么做?请包括代码示例。

我主要在寻找Windows解决方案,我已经弄清楚了其他平台。

感谢您的宝贵时间,感谢您的反馈!

4

2 回答 2

1

注意:这是对先前问题的重写。

Windows/GDI+ 打印的工作方式是它使用 aPrintDialog来获取打印机标识符(并且还让用户知道他们正在打印到哪台打印机)。因此,为了进行静默打印,您需要在不显示对话框的情况下获取打印机标识符。

所以删除这段代码:

// Open a printing dialog to fetch the HDC of the desired printer.
PRINTDLG dialog;
ZeroMemory(&dialog, sizeof(PRINTDLG));
dialog.lStructSize = sizeof(PRINTDLG);
dialog.Flags = PD_PRINTSETUP | PD_RETURNDC;
BOOL dialogResult = ::PrintDlg(&dialog);

if (!dialogResult) // Error or cancel.
{
    DWORD reason = CommDlgExtendedError();
    if (!reason) // User cancelled.
        return S_OK;

    logger->Error("Could not print page, dialog error code: %i",
        reason);
    return E_FAIL;
}

HDC hdc = dialog.hDC;

然后将最后一行 ( HDC hdc = ...) 替换为获取打印机 HDC 的其他方式。您可以使用GetDefaultPrinter()获取默认打印机的名称,然后使用CreateDC().

EnumPrinters()或者,您可以选择打印机或使用该功能创建自定义打印对话框。

于 2013-01-20T17:36:07.297 回答
0

很遗憾看到这个问题没有得到任何高质量的答案,这是我想自己实现的。

我认为花时间让这个功能与 TideSDK 一起工作是相当冒险的。因此,我将偏离问题的核心能力,并建议您尝试使用 TideSDK 以外的框架来完成此任务。我认为这是解决这个问题的最现实的解决方案,这将是我采用的解决方案。

一旦找到我将坚持的框架,我将更新此答案。

于 2013-01-19T23:18:49.317 回答