Chrome扩展程序用于静音打印?

时间:2015-08-07 23:56:40

标签: javascript printing google-chrome-extension

我制作了一个打印PDF文件的静态打印Web应用程序。关键是将JavaScript添加到静默打印的PDF文件中。

为此,我使用chrome中的acrobat reader打开PDF,允许我执行脚本(具有适当的权限)。

但是正如宣布的那样,这个解决方案在chrome 45之后将无效,因为npapi问题。

我想一个可能的解决方案可能是使用最近发布的chrome扩展程序的printProvider。

然而,我无法想象如何触发任何printProvider事件。 所以问题是:可以考虑使用chrome扩展来创建一个静态打印Web应用程序,以及如何为HTML页面的嵌入式PDF启动和处理打印作业。

4 个答案:

答案 0 :(得分:7)

最后我为这个问题找到了一个可接受的解决方案,因为我找不到它,但是阅读了许多相同问题的帖子,我会在这里留下我的解决方案。

首先,您需要将您的打印机添加到Google云打印,然后您需要为Google Developers Console

添加一个项目

然后添加此脚本,并在需要打印时执行print()函数。此方法将打印内容中指示的文档

一旦管理您的打印机,应用程序将请求您的许可。

function auth() {
  gapi.auth.authorize({
    'client_id': 'YOUR_GOOGLE_API_CLIENT_ID',
    'scope': 'https://www.googleapis.com/auth/cloudprint',
    'immediate': true
  });

}

function print() {
  var xhr = new XMLHttpRequest();
  var q = new FormData()
  q.append('xsrf', gapi.auth.getToken().access_token);
  q.append('printerid', 'YOUR_GOOGLE_CLOUD_PRINTER_ID');
  q.append('jobid', '');
  q.append('title', 'silentPrintTest');
  q.append('contentType', 'url');
  q.append('content',"http://www.pdf995.com/samples/pdf.pdf");
  q.append('ticket', '{ "version": "1.0", "print": {}}');


  xhr.open('POST', 'https://www.google.com/cloudprint/submit');
  xhr.setRequestHeader('Authorization', 'Bearer ' + gapi.auth.getToken().access_token);
  xhr.onload = function () {
    try {
      var r = JSON.parse(xhr.responseText);
      console.log(r.message)
    } catch (e) {
      console.log(xhr.responseText)
    }
  }

  xhr.send(q)

}

window.addEventListener('load', auth);
<script src="https://apis.google.com/js/client.js"></script>

无论如何,这个脚本会抛出一个'Access-Control-Allow-Origin'错误,即使这出现在文档中......我也无法使其工作:(

  

Google API使用跨源资源共享(CORS)支持请求和响应。您无需加载完整的JavaScript客户端库即可使用CORS。但是,如果您希望应用程序访问用户的个人信息,则必须使用Google的OAuth 2.0机制。为了实现这一目标,Google提供了独立的auth客户端 - JavaScript客户端的一个子集。

所以要抛出这个我必须安装这个chrome扩展CORS。我确信有人会改进这个脚本以避免这个chrome扩展。

答案 1 :(得分:1)

删除npapi之后,我认为这不可能仅通过编程方式实现。我所知道的目前唯一一种让Chrome无声打印的方法是使用chrome kiosk模式,这是一个在启动chrome时必须设置的标志(模式)。

看看这些SO帖子:

Silent printing (direct) using KIOSK mode in Google Chrome

Running Chrome with extension in kiosk mode

答案 2 :(得分:1)

您可以将应用程序注册到URI方案,以触发本地应用程序以静默方式打印。设置非常简单明了。这是一种无缝的体验。我已经在这里发布了完整的例子:

https://stackoverflow.com/a/37601807/409319

答案 3 :(得分:0)

过去使用浏览器插件(例如Java + NPAPI,ActiveX)是可以实现的,但几年来大多数浏览器已将其列入黑名单。

如果对使用类似技术的现代解决方案感兴趣,那么该体系结构通常需要满足以下条件:

  1. WebSocket,HTTP或自定义URI连接回到本地主机
  2. 通过Web传输(JavaScript或自定义URI方案)与本地运行的应用程序对话的API。

利用这些技术的项目的详细信息(其中一些是开源的)在这里: https://stackoverflow.com/a/28783269/3196753

由于这些项目的源代码可能会有所不同(几百行到上万行),因此除非查询特定项目的API,否则代码段会太大。

侧面说明:某些技术提供了专用的云资源,从而以潜在的延迟和隐私为代价增加了便利性。在撰写本文时,最受欢迎的“免费”云解决方案-Google Cloud Print-计划于2020年12月停用。