13

我有一个 PDF 文件,我正在尝试通过 Javascript 打印它。我尝试过这种嵌入技巧:静默打印嵌入的 PDF ,但是,打印功能永远不可用,它始终未定义。

我已经用这段代码尝试了 Iframe 技巧:

function printPDF() {
if(document.getElementById("pdfDocument").contentWindow.document.readyState === "complete") {   
    document.getElementById("pdfDocument").focus();
    document.getElementById("pdfDocument").contentWindow.print();
} else {
    setInterval(printPDF(), 1000);
}
}

(pdfDocument 是 iframe 的 ID)这确实会弹出打印对话框,但会打印一个空白页。我会喜欢嵌入标签的工作方式。但是为什么打印功能永远不可用?

大多数关于这个主题的帖子都很老了。最好的 HTML5/jQuery 方法是什么?(或者此时只是普通的 JS)

编辑:

这是嵌入标签的JS代码:

function printPDF() {
alert(document.getElementById("pdfDocument").print);
//Wait until PDF is ready to print    
 if (typeof document.getElementById("pdfDocument").print == 'undefined') {
     setTimeout(function(){printPDF();}, 1000);
 } else {
     var x = document.getElementById("pdfDocument");
     x.print();
 }
}

这每秒都在改变“未定义”。打印选项永远不可用。有任何想法吗?

4

4 回答 4

15

大约一周前,我在这个问题上悬赏,它已经过期了。经过大量研究后,我将在这里发布我学到的知识,以供将来可能会发现此内容的任何人使用。

PDF 的显示方式因浏览器、浏览器版本、浏览器配置和操作系统而异。有很多变量,所以我将在这里讨论最常见的情况。

  • 在所有浏览器上,我无法通过 Javascript 调用任何类型的 print() 方法,我只能使用 PdfActions。OPENACTION 将调用 print。我使用 iText 将这些嵌入到 PDF 中。

  • Chrome 使用 Adob​​e 的查看器,它不能访问任何类型的 print() 方法,但会执行嵌入在 PDF 中的 PdfAction。因此,您可以在 PDF 中嵌入“OpenAction”,并在从任何查看这些操作的应用程序打开 PDF 调用时打印它。

  • Firefox(高于某个版本,但所有最新版本)在 Windows 中使用 Adob​​e 查看器,该查看器也可以识别 PdfActions。但是,在 OSX 中,它失去了对 Adob​​e 查看器的支持并切换到 Firefox 查看器 (pdf.js) 中的烘焙。不支持 PdfActions。

  • IE:我并没有在 IE 上做太多测试。主要是因为在 Firefox 无法在 OSX 上运行(对我来说是一个要求)之后,我放弃了从 Javascript 打印 PDF。

我的 PDF 是由我控制的服务器生成的,所以我最终在我的服务器中进行了服务更改并添加了一个 get PNG 服务,该服务基于 PDF 生成使用的相同标记生成 PNG。浏览器处理图像比我知道要使用的 PDF 好得多,但希望我能够重新使用 PDF 生成服务,因为它在我的代码中的其他地方使用过。

它没有回答问题,但它是我所拥有的所有信息。我对将来可能会发现此问题的任何人的建议:在这种情况下尽可能放弃 PDF 并变得更简单。否则,如果您知道如何在 OSX 的 FF 预览 pdf 查看器中通过 Javascript 调用 print(),请更新此问题。

-菲尔

于 2014-11-20T19:14:21.363 回答
2

使用 Javascript,我不确定我们能否做到这一点。但是可以使用脚本注入到 pdf 文件中来实现。如果我的理解是正确的,这就是谷歌所做的。

例如。

  1. 打开网址:https ://drive.google.com/viewerng/viewer?url=http://www.energy.umich.edu/sites/default/files/pdf-sample.pdf
  2. 现在点击打印图标。
  3. 如您所见,打开了一个带有注入 pdf 的打印命令的新窗口。一旦加载了 pdf,就会触发内置的打印命令。每当您刷新页面时,您都可以看到触发的打印。这意味着打印行为附加到文档加载事件。

我们可以使用 iTextSharp 来模拟上述行为。

于 2014-11-18T07:27:59.340 回答
2

有一种方法可以在浏览器中呈现整个 pdf(而不是嵌入外部应用程序),这使您可以完全访问与 pdf 相关的浏览器 API。

这是 Mozilla 在 JavaScript 中的 pdf 实现:https
://github.com/mozilla/pdf.js/ 这是展示: http: //mozilla.github.io/pdf.js/web/viewer.html(注意右上角的打印按钮)。

在此处查看查看器代码以了解其工作原理的详细信息:https ://github.com/mozilla/pdf.js/blob/master/web/viewer.js

不利的一面——它会比嵌入更难。
从好的方面来说,它实际上会起作用。

于 2014-11-18T21:26:38.417 回答
0

在 Chrome 中,您可以运行:

var toolbar = document.querySelector('#toolbar');
toolbar.shadowRoot.querySelector('#print').click();
于 2018-06-26T21:18:54.327 回答