Chrome浏览器安静打印的扩展?

8
我制作了一个无声打印网络应用程序,可以打印PDF文件。关键是在PDF文件中添加JavaScript,使其自行静默打印。
为了实现这一点,我在Chrome中使用Acrobat Reader打开PDF文件,这样我就能执行脚本(具有适当的权限)。
但正如宣布的那样,在Chrome 45之后,这种解决方案将无法使用,因为npapi问题。
我猜测可能的解决方案是使用最近发布的Chrome扩展的PrintProvider。
尽管如此,我无法想象如何触发任何printProvider事件。 因此,问题是:是否可以考虑使用Chrome扩展来制作无声打印网络应用程序,以及如何触发和处理嵌入式HTML页面的PDF的打印作业。

我的评论是...如果您认为在未经许可的情况下自动打印我打开的PDF文件是可以接受的...那您一定是在开玩笑。我很惊讶您说这样做是有效的。希望将来不会出现这样的情况,即有人可以创建一个文档,在打开时将从我的打印机中连续打印多页纸(除非我明确允许)。 - Kevin Brown
1
就像我之前所说的,只要用户在他的电脑上给予了静默打印的适当权限,那么这并不是什么疯狂的想法。请查看此链接以了解如何授予适当的权限:https://www.adobe.com/devnet-docs/acrobatetk/tools/PrefRef/Windows/TrustManager.html#idkeyname_1_19573 - Diego
4个回答

7

我终于找到了一个可接受的解决方案来解决这个问题,因为我在外面找不到它,但是看到了许多帖子都有相同的问题,所以我将在这里留下我的解决方案。

首先,您需要将打印机添加到Google Cloud Print中,然后需要在Google Developers控制台上添加项目。

然后添加此脚本,每次需要打印时执行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 APIs支持使用跨源资源共享(CORS)进行请求和响应。您不需要加载完整的JavaScript客户端库来使用CORS。然而,如果您想让您的应用程序访问用户的个人信息,则必须仍然使用Google的OAuth 2.0机制。为了实现这一点,Google提供了独立的auth客户端——JavaScript客户端的一个子集。

因此,为了解决这个问题,我必须安装这个Chrome扩展程序CORS。我相信有人会改进此脚本,以避免使用该Chrome扩展程序。

如果没有互联网接入,怎么办? - hakan
@piedpiper 很抱歉,这个解决方案只适用于联网状态。该解决方案利用了谷歌云打印服务器实现的打印队列,接收您的作业,然后将其发送到您的谷歌浏览器,最终发送到打印机。我之前提到的原始解决方案在 npapi 问题出现之前可以使用,它不需要联网,并且仍然可以在 ie 上使用。但是,它只能打印 pdf 文件(因为嵌入式 acrobat reader 将文件发送到打印机),并且假定您可以向 pdf 文件添加 JavaScript 以自动打印。 - Diego
1
嗨@Diego,我正在尝试做同样的事情,我了解了Google Cloud Print并且这是我的最后选择,你找到了其他选项吗?或者如何使用printProvider?谢谢。 - Pablo Cesar Cordova Morales
@Diego 我正在尝试使用GCP,但我不理解如何使用它。尽管我正在阅读官方文档。我手动将打印机添加到了GCP中,现在我有很多数据(代理、打印机ID、客户端ID等),但是我需要创建一个项目吗?或者你有没有教程可以学习如何在JavaScript(客户端)中使用GCP?谢谢。 - Pablo Cesar Cordova Morales
@PabloCesarCordovaMorales 我没有任何教程。你需要在控制台中创建一个项目的原因是因为谷歌要求这样做,以便您可以使用他们的服务,并且当然获取YOUR_GOOGLE_API_CLIENT_ID。在那里,您将需要注册您的网站,因为谷歌只会接受从该网站发送的打印作业。否则,任何网站都可以在您的打印机上打印...我认为这主要是出于安全考虑...但无论如何,注册它不应该给您带来任何麻烦,顺便说一下,这是一个免费的服务。 - Diego
显示剩余2条评论

2
您可以注册一个应用程序到URI方案以触发本地应用程序进行静默打印。该设置非常简单和直接,使用起来非常流畅。我已经在此处发布了完整示例的解决方案: https://dev59.com/kWw05IYBdhLWcg3wszwl#37601807

1

如果有人愿意运行桌面应用程序或远程服务器,那么还有一些更多的选择。 - tresf

0

以前可以使用浏览器插件(例如Java + NPAPI、ActiveX),但大多数浏览器已经禁用了几年。

如果对使用类似技术的现代解决方案感兴趣,架构通常需要以下内容:

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

利用这些技术的项目的详细信息(其中有一些是开源的)在此处提供: https://dev59.com/WF8d5IYBdhLWcg3wNAKy#28783269

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

附注:一些技术提供专用云资源,这增加了便利性,但可能会降低潜在的延迟和隐私。撰写本文时,“免费”的最受欢迎的云解决方案——Google Cloud Print——预计将在2020年12月停止使用。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接