【问题标题】:Chrome extensions for silent print?用于静默打印的 Chrome 扩展程序?
【发布时间】:2015-08-07 23:56:39
【问题描述】:

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

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

但正如宣布的那样,由于 npapi 问题,该解决方案在 chrome 45 之后将不起作用。

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

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

【问题讨论】:

  • 我的评论是……如果您认为自动打印未经我许可打开的 PDF 是可以的……您一定是在开玩笑。我很惊讶你说它有效。将来没有办法(希望)有人可以创建一个在打开时会自动从我的打印机中喷出页面的文档。
  • 正如我所说,只要用户在他的电脑上给予适当的静默打印权限,就不会那么疯狂。检查此链接以了解如何授予适当的权限adobe.com/devnet-docs/acrobatetk/tools/PrefRef/Windows/…

标签: javascript printing google-chrome-extension


【解决方案1】:

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

因此,首先您需要将打印机添加到 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 提供了独立的身份验证客户端——JavaScript 客户端的一个子集。

所以要扔掉这个,我必须安装这个 chrome 扩展 CORS。我相信有人会改进这个脚本以避免这个 chrome 扩展。

【讨论】:

  • 如果不能上网怎么办?
  • @piedpiper 恐怕这个解决方案只适用于互联网访问。此解决方案利用 google 云打印服务器实现的打印队列接收您的作业,然后将其发送到您的 google chrome 以最终将其发送到打印机。我提到的在 npapi 问题之前有效的原始解决方案不使用互联网访问,并且仍然适用于 ie。但这只能打印pdf文件(因为是嵌入的acrobat阅读器发送到打印机)并且它假设您可以将javascript添加到pdf文件以自行打印。
  • 嗨@Diego,我正在尝试做同样的事情,我阅读了有关谷歌云打印的信息,这是我的最后一个选择,你找到其他选择了吗?或者如何使用 printProvider?谢谢。
  • @PabloCesarCordovaMorales 谷歌云打印对我来说效果很好,我当时在一堆解决方案中使用它。无论如何都要照顾 CORS 扩展,因为它存在使用风险。我的建议是你为那个特殊的情况自己做一个。
  • @Diego 我正在尝试使用 GCP,但我不了解使用它的流程。尽管我正在阅读官方文档。我手动将我的打印机添加到 GCP,现在我有很多数据(代理、打印机 ID、客户端 ID 等),但是我需要创建一个您所说的项目吗?或者您是否有教程可以在 javascript(客户端)中了解有关 GCP 的更多信息?谢谢。
【解决方案2】:

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

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

【讨论】:

    【解决方案3】:

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

    看看这些 SO 帖子:

    Silent printing (direct) using KIOSK mode in Google Chrome

    Running Chrome with extension in kiosk mode

    【讨论】:

    【解决方案4】:

    这曾经可以通过浏览器插件(例如 Java + NPAPI、ActiveX)实现,但多年来已被大多数浏览器列入黑名单。

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

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

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

    由于这些项目的源代码可能不同(数百行到数万行),除非查询特定项目的 API,否则代码 sn-p 会太大。

    旁注:某些技术提供专用的云资源,以牺牲潜在的延迟和隐私为代价来增加便利性。在撰写本文时,最流行的“免费”云解决方案——谷歌云打印——计划于 2020 年 12 月停用。

    【讨论】:

      猜你喜欢
      • 2011-06-18
      • 2023-02-02
      • 1970-01-01
      • 1970-01-01
      • 2012-07-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多