【问题标题】:Silent Printing with TideSDK使用 TideSDK 进行静默打印
【发布时间】:2013-01-10 23:34:06
【问题描述】:

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

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

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

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

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

如何在 TideSDK 上实现静默打印?请包含代码示例。

我主要在寻找 windows 解决方案,我已经想通了 其他平台。

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

【问题讨论】:

  • 为什么你认为修改 TideSDK 源代码会是一个糟糕的解决方案?只要它有效,您可能会要求将您的更改重新导入 TideSDK 主分支,因为这听起来是一个有用的选项。
  • @Danack - 您如何将打印机参数传递给webkit_ui_delegate.cpp 中的printFrame 函数?这是问题的主要组成部分之一。
  • 在这里发布一个问题可能是值得的:developer.appcelerator.com/questions/newest
  • @JSuar 我认为他们不再支持 TideSDK,很遗憾。
  • 在这种情况下提交功能请求、为解决方案做出贡献或赞助对您的项目有意义的工作是合适的。

标签: printing tidesdk


【解决方案1】:

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

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

所以删除这段代码:

// 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() 获取HDC。

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

【讨论】:

  • 好的,谁对我投了反对票,为什么? this 解决方案有什么问题?
  • 除非您开发单独的 API,否则您无法在运行时执行 C++ - 我在您上一个答案中评论过的内容相同。
  • @waddlesplash 感谢用于打印的 Windows 实现。您可以在 TideSDK 中贡献您的 C++ 代码。这是我们想要实施的正确解决方案,除了需要为所有平台实施相同的事情。
  • 谢谢,有时间我可能会开个 PR。我不会进一步参与这个问题,提问者不了解 Windows 打印的工作原理,或者我的代码进入 webkit_ui_delegate.cpp 并且不需要其他 API。
  • @waddlesplash 您不能将参数传递给该文件,我认为您不明白。如果他们必须选择打印机,则不是静默打印,代码应该可以选择。
【解决方案2】:

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

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

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

【讨论】:

  • 这很可能是我要走的路线。很遗憾 - 这是一个很好的框架。我只会奖励你赏金,这样积分就不会浪费了。祝您和您的应用程序好运。
  • 确实如此。谢谢你的赏金,但我真的不认为我应得的。也祝你好运。
  • 嘿,要么是你,要么没有人可以使用它们。让我知道你使用什么框架。
  • 我不确定评估是否公平。可以实现但不是微不足道的,也不能简单地回答这个问题。我们的代码库是以一种我们不解决单一平台优先级问题的方式编写的。我建议赞助这项工作,以作为替代方案为解决方案做出贡献。
  • @MitalVora 我只是想明确一点,我和受访者都没有反对 TideSDK。从他的回答来看,他认为这是一个很棒的框架——我也是。这个问题只是询问如何实现一个特性,他给出了一个现实的建议。感谢您和您的开发人员同事一直以来为 TideSDK 投入的时间,这是一个很棒的框架。
猜你喜欢
  • 2018-06-16
  • 2012-11-05
  • 1970-01-01
  • 2023-02-17
  • 2019-05-09
  • 2014-01-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多