为了实现这一点,我在Chrome中使用Acrobat Reader打开PDF文件,这样我就能执行脚本(具有适当的权限)。
但正如宣布的那样,在Chrome 45之后,这种解决方案将无法使用,因为npapi问题。
我猜测可能的解决方案是使用最近发布的Chrome扩展的PrintProvider。
尽管如此,我无法想象如何触发任何printProvider事件。 因此,问题是:是否可以考虑使用Chrome扩展来制作无声打印网络应用程序,以及如何触发和处理嵌入式HTML页面的PDF的打印作业。
我终于找到了一个可接受的解决方案来解决这个问题,因为我在外面找不到它,但是看到了许多帖子都有相同的问题,所以我将在这里留下我的解决方案。
首先,您需要将打印机添加到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>
因此,为了解决这个问题,我必须安装这个Chrome扩展程序CORS。我相信有人会改进此脚本,以避免使用该Chrome扩展程序。Google APIs支持使用跨源资源共享(CORS)进行请求和响应。您不需要加载完整的JavaScript客户端库来使用CORS。然而,如果您想让您的应用程序访问用户的个人信息,则必须仍然使用Google的OAuth 2.0机制。为了实现这一点,Google提供了独立的auth客户端——JavaScript客户端的一个子集。
移除 npapi 后,我不相信这只是通过编程就能实现。目前唯一我知道的让 Chrome 静默打印的方法是使用 Chrome kiosk 模式,这是一种在启动 Chrome 时必须设置的标志(模式)。
看看以下 Stack Overflow 的帖子:
以前可以使用浏览器插件(例如Java + NPAPI、ActiveX),但大多数浏览器已经禁用了几年。
如果对使用类似技术的现代解决方案感兴趣,架构通常需要以下内容:
利用这些技术的项目的详细信息(其中有一些是开源的)在此处提供: https://dev59.com/WF8d5IYBdhLWcg3wNAKy#28783269
由于这些项目的源代码可能会有所不同(从几百行到数万行不等),除非查询特定项目的API,否则代码片段太大了。
附注:一些技术提供专用云资源,这增加了便利性,但可能会降低潜在的延迟和隐私。撰写本文时,“免费”的最受欢迎的云解决方案——Google Cloud Print——预计将在2020年12月停止使用。