【问题标题】:Automatically Print Image from Website从网站自动打印图像
【发布时间】:2009-06-03 16:25:16
【问题描述】:

我和一位同事正在讨论浏览器中什么是可能的,什么是不可能的。

然后出现了一个我们都无法肯定回答的问题。

您能否创建一个网页,当您导航到该网页时,它会使用客户端打印机并尝试打印文档。例如,每当您访问我的个人网站时,您都会被打印出一张我微笑的照片。

现在,这是一个可怕的想法。我意识到。但讨论引起了我的兴趣,即是否可以做到,以及如何做到。我的朋友坚持认为你能做的最好的就是为用户弹出打印对话框,他们必须自己点击打印。

是否可以绕过这一步?或者只是一些花哨的脚本将鼠标移动到打印按钮上并单击它?还是使用 activeX 控件直接与打印机 API 交互?

【问题讨论】:

标签: web-applications printing


【解决方案1】:

你必须提示用户打印当前页面,没有办法绕过这一步(可能在activeX for IE中)。也就是说,当页面加载时,您可以通过两种不同的方式提示用户打印您微笑的图像。

下面是如何在 JavaScript 中做到这一点。

window.onload = function() {
  var img = window.open("me-smiling.png");
  img.print();
}

下面是如何在 css/javascript/html 中执行此操作(假设您的图片有 id'me-smiling'): CSS:

@media print {
   * {
     display:none;
   }
   img#me-smiling {
     display:block;
   }
}

Javascript:

 window.onload = function() { window.print() }

【讨论】:

  • 有没有办法让它也必须竖起两个大拇指?
  • 不,浏览器不支持打印两个拇指向上的图片(IE支持一个拇指向上)
【解决方案2】:

我发现避免打印对话框的唯一解决方案是在 Mozilla Firefox 上创建一个变量来设置自动打印。如果您需要使用其他浏览器,也许不是最好的解决方案,但就我而言,我只需要自动打印报告即可:

1- 打开 Firefox 并在地址栏中输入“about:config”
2-右键单击任何首选项并选择“新建”>“布尔”
3- 添加一个名为“print.always_print_silent”的变量,其值为“true”
4- 重启火狐。

希望能帮到你!

【讨论】:

    【解决方案3】:

    AttendStar 创建了一个免费的插件,可以抑制对话框并删除大多数 Firefox 版本的所有页眉和页脚。

    https://addons.mozilla.org/en-US/firefox/addon/attendprint/

    有了这个功能,你可以使用 $('img').jqprint();而 jquery 的 jqprint 只会打印从您的 Web 应用程序自动调用的图像。

    【讨论】:

    • 这不仅非常有趣,而且表明我所询问的内容实际上有一个商业案例。我当时不知道的东西。
    【解决方案4】:

    据我所知,没有任何客户端干预(例如设置浏览器标志),无法直接打印文档。 在我们当前的项目中,我们需要直接打印到默认打印机,但至少使用 Chrome,您可以通过额外的启动参数轻松完成。

    要直接打印到操作系统默认打印机,您可以使用:

    "C:\Program Files (x86)\Google\Chrome\Application\chrome.exe" --user-data-dir=c:\tmp --kiosk-printing http://www.contoso.com

    另一个可能也有用的选项是使用本机打印对话框而不是 chrome 打印预览。

    "C:\Program Files (x86)\Google\Chrome\Application\chrome.exe" --user-data-dir=c:\tmp --disable-print-preview http://www.contoso.com

    请注意,window.print() 和/或 Ctrl-P 的行为与上述设置一致。

    我知道,这并不能完全回答 OPs 问题,但我认为它有些相关,对于基于 Web 的企业应用程序,这是一个非常常见的用例。也许有人觉得它有用。

    对于 Firefox,我推荐 Seamless Print Addon

    【讨论】:

      【解决方案5】:

      据我所知,您无法绕过打印对话框。如果浏览器允许,那将是一个非常明显的安全漏洞。但是您可以使用“window.print()”调出打印对话框。

      【讨论】:

      • 仅仅因为它“将”是一个安全漏洞,并不意味着它已经不是一个安全漏洞。
      • 我之前遇到过这个要求。它是通过在线订单在热食配送服务中自动打印食品订单。他们只是希望订单在纸上出来,而不必被承认。我最近看到的新系列“云打印机”也提供了这种业务设施,但绕过了浏览器。
      【解决方案6】:

      我认为您最多需要一个使用基本 Windows API 的 ActiveX 组件来获取默认打印机的设备上下文,并尝试使用打印机设置的假定值打印嵌入的图像。

      【讨论】:

        【解决方案7】:

        为了在不看到打印对话框提示的情况下自动打印到默认打印机,我在以下问题中分享了一些适用于 IE7、IE8 和 IE9 的代码:

        Bypass Printdialog in IE9

        【讨论】:

          【解决方案8】:

          从最近几天的大量搜索中, 我找到了一个最好的解决方案。 迄今为止,Chrome 不支持从 javascript 直接打印。 它推出了 USB 和串行 API,这可能会有所帮助。

          但目前我使用的是开源的 JavaApplet 解决方案。 https://github.com/qzind/qz-print - 构建 虽然我在构建它时遇到错误。我更喜欢 Prebuilt - QZ Print Plugin 1.9.3 桌面应用,效果很好。

          从这里下载:https://qz.io/download/

          代码示例:

          /***************************************************************************
           * Prototype function for printing an HTML screenshot of the existing page
           * Usage: (identical to appendImage(), but uses html2canvas for png rendering)
           *    qz.setPaperSize("8.5in", "11.0in");  // US Letter
           *    qz.setAutoSize(true);
           *    qz.appendImage($("canvas")[0].toDataURL('image/png'));
           ***************************************************************************/
          function printHTML5Page() {
              $("#qz-status").html2canvas({
                  canvas: hidden_screenshot,
                  onrendered: function() {
                      if (notReady()) { return; }
                      // Optional, set up custom page size.  These only work for PostScript printing.
                      // setPaperSize() must be called before setAutoSize(), setOrientation(), etc.
                      qz.setPaperSize("8.5in", "11.0in");  // US Letter
                      qz.setAutoSize(true);
                      qz.appendImage($("canvas")[0].toDataURL('image/png'));
          
                      //qz.setCopies(3);
                      qz.setCopies(parseInt(document.getElementById("copies").value));
          
                      // Automatically gets called when "qz.appendFile()" is finished.
                      window['qzDoneAppending'] = function() {
                          // Tell the applet to print.
                          qz.printPS();
          
                          // Remove reference to this function
                          window['qzDoneAppending'] = null;
                      };
                  }
              });
          }
          

          完整的例子可以在这里找到: https://gist.github.com/bkrajendra/c80de17b627e59287f7c

          【讨论】:

            【解决方案9】:

            这是我为 Firefox 找到的最佳解决方案: 有这个很棒的插件Seamless Print.

            它就像魅力一样。

            【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2017-06-02
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2016-03-25
            相关资源
            最近更新 更多