从javascript嵌入标签打印Pdf

时间:2013-09-16 19:21:19

标签: javascript html5 pdf

我有一个PDF文件,我试图通过Javascript打印它。我尝试过这个嵌入技巧:Silent print a embedded 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)这会弹出打印对话框,但会打印空白页。我希望embed标签的工作方式。但为什么打印功能永远不可用?

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

编辑:

这是embed标签的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 个答案:

答案 0 :(得分:12)

我在大约一周左右的时间里对这些问题给予了赏金,并且它已经过期了。在经过大量研究之后,我将发布我在这里学到的知识,以及将来可能会发现这一点的人。

根据浏览器,浏览器版本,浏览器配置和操作系统,PDF的显示方式不同。有很多变数,所以我将在这里讨论最常见的情况。

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

  • Chrome使用的是Adobe的查看器,它无法访问任何类型的print()方法,但会执行PDF中嵌入的PdfActions。所以你可以嵌入一个' OpenAction'在PDF中,只要从查看这些操作的任何应用程序打开,就可以打印PDF。

  • Firefox(在特定版本之上,但所有最新版本)都使用Windows中的Adobe查看器,它也识别PdfActions。但是,在OSX中,它失去了对Adobe查看器的支持,并切换到Firefox查看器中的烘焙(pdf.js)。哪个不支持PdfActions。

  • IE:我对IE没有太多考验。主要是因为在Firefox没有在OSX上工作之后我放弃了从Javascript打印PDF(对我来说是一个要求)。

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

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

-Phil

答案 1 :(得分: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后,将触发内置打印命令。刷新页面时,您可以看到触发的打印。这意味着打印行为附加到文档加载事件。
  4. 我们可以使用iTextSharp来模拟上述行为。

答案 2 :(得分: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

从负面看 - 它会比嵌入更难 从好的方面来说,它实际上是有效的。

答案 3 :(得分:0)

在Chrome中,您可以运行:

var toolbar = document.querySelector('#toolbar');
toolbar.shadowRoot.querySelector('#print').click();