【问题标题】:HTML / Javascript One Click Print (no dialogs)HTML / Javascript 一键打印(无对话框)
【发布时间】:2012-02-09 15:26:14
【问题描述】:

是否可以有一个绕过打印对话框的打印选项?

我在一个封闭的系统上工作,希望能够预先定义打印对话框设置;并在我单击按钮后立即处理打印。

根据我正在阅读的内容,每个浏览器的执行方式都不同。例如,IE 将使用 ActiveX。 Chrome / Firefox 需要扩展。基于此,看来我必须用 C++ 编写一个应用程序,该应用程序可以处理浏览器传递的参数,以便以正确的格式自动打印(用于标签)。然后我将不得不将其重写为 Chrome / Firefox 的扩展。最终结果是,我们封闭系统上的用户必须根据他们使用的浏览器下载/安装这些功能。

我希望有另一种方法可以解决这个问题,但这个任务很可能违反了浏览器安全问题。

【问题讨论】:

  • 你最后用了什么?我们正在尝试使用 firefox 或 chrome 浏览器。
  • @ReazPatwary 我们最终使用了一种叫做 jZebra 的东西,现在称为 qz (qzindustries.com/download) 但是,我查找/找到了另一种可能的方法,但它需要客户端下载。这将涉及用户安装使用自定义协议 (msdn.microsoft.com/en-us/library/ie/aa767914%28v=vs.85%29.aspx) 的应用程序
  • 感谢您的快速回复。但我们的主要平台是 Mac OSX。看起来那是 Windows 平台的 .exe 文件:(。
  • @ReazPatwary - qz 程序是一个基于 java 的程序。但是,我想 Mac 也支持自定义协议 - stackoverflow.com/questions/471581/…
  • qz 程序 是为了消除警告而支付的费用,一年也支付 312 美元。任何人都知道免费软件类似的产品。

标签: html printing


【解决方案1】:

我最终实现了一个与 Nexus Mod Manager 非常相似的自定义应用程序。我编写了一个注册自定义Application URI Scheme 的C# 应用程序。以下是它的工作原理:

  1. 用户点击网站上的“打印”。
  2. 网站将用户链接到“CustomURL://Print/{ID}
  3. 应用程序由 windows 通过自定义 uri 方案启动。
  4. 应用程序与预配置的服务器通信以确认打印请求,并在我的情况下获取实际的打印命令。
  5. 然后应用程序使用C# RawPrinterHelper 类将命令直接发送到打印机。

这种方法需要用户进行初始下载,并在首次启动应用程序时从 Windows 发出一个安全提示。我还实现了一些 Javascript 魔法,让它检测打印作业是否被处理。如果不是,它会要求他们下载应用程序。

【讨论】:

    【解决方案2】:

    我知道这是一个迟到的回复,但这是我正在使用的解决方案。我只在 IE 上使用过,还没有在任何其他浏览器上测试过。

    此 Sub Print 有效替换了默认打印功能。

    <script language='VBScript'>
    Sub Print()
           OLECMDID_PRINT = 6
           OLECMDEXECOPT_DONTPROMPTUSER = 2
           OLECMDEXECOPT_PROMPTUSER = 1
           call WB.ExecWB(OLECMDID_PRINT, OLECMDEXECOPT_DONTPROMPTUSER,1)
    End Sub
    document.write "<object ID='WB' WIDTH=0 HEIGHT=0 CLASSID='CLSID:8856F961-340A-11D0-A96B-00C04FD705A2'></object>"
    </script>
    

    然后使用Javascript的window.print();绑定到超链接或按钮以执行打印命令。

    如果您想在页面加载时自动打印,请将代码放在标签附近。

    <script type="text/javascript"> 
    window.onload=function(){self.print();} 
    </script> 
    

    【讨论】:

    • VBScript 不能在任何其他浏览器上运行,期间。但这对 IE 来说是一个不错的解决方案。
    • 为了跟进,我最终实现了一个名为 jZebra 的 Java 应用程序。此应用程序需要首次安装/安全批准。 code.google.com/p/jzebra
    【解决方案3】:

    我正在为火狐浏览器写这个答案。

    • 打开文件 > 页面设置

    • 将所有页眉和页脚设为空白

    • 将边距设置为 0(零)

    • 在 Firefox 的地址栏中,输入 about:config

    • 搜索print.always_print_silent并双击它

    • 把它从假改为真

      • 这让您可以跳过出现的“打印”弹出框,也可以跳过必须单击“确定”的步骤,自动打印正确尺寸的单据。
    • 如果print.always_print_silent 没有出现

      • 右键单击首选项窗口的空白区域

      • 选择新的 > 布尔值

      • 输入“print.always_print_silent”作为名称(不带引号)

      • 点击确定

      • 为值选择 true

    • 您可能还想查看print.print_printer 列出的内容

      • 您可能必须选择 Generic/Text Only(或任何收据打印机的名称)

    【讨论】:

      【解决方案4】:

      一般的答案是:不,在一般情况下您不能这样做,但在某些情况下您可能会这样做。 查看 http://justtalkaboutweb.com/2008/05/09/javascript-print-bypass-printer-dialog-in-ie-and-firefox/

      如果您无论如何都允许这样做,这将是一个安全问题,因为恶意软件脚本可以静默地将打印作业发送到访问者的打印机。

      【讨论】:

      • 网址已失效。
      【解决方案5】:

      我发现 Firefox 的一个很棒的插件可以解决这个问题。试试 seamless printing 的 firefox 插件,它会在不显示打印对话框的情况下从 Web 应用程序打印某些内容。

      1. 打开火狐
      2. 搜索插件名称无缝打印并安装
      3. 成功安装后,当用户想要打印任何东西时,打印窗口将被绕过。

      【讨论】:

      • 不再支持此插件。你知道替代方案吗?
      • 并非如此。但我会仔细检查。
      • 在 Windows 上,后台运行的自动热键脚本可以查找浏览器的打印对话框,然后确定。
      【解决方案6】:

      我能够用这个库解决问题:html2pdf.js (https://github.com/eKoopmans/html2pdf.js)

      考虑到您可以访问它,您可以执行类似的操作(取自 github 存储库):

      var element = document.getElementById('element-to-print'); 
      html2pdf(element);
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-07-05
        相关资源
        最近更新 更多