从 javascript 嵌入标记打印 Pdf

Print Pdf from javascript embed tag

本文关键字:打印 Pdf javascript      更新时间:2023-09-26

我有一个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();
 }
}

这每秒都在不断改变"未定义"。 "打印"选项从不可用。 有什么想法吗?

大约

一周前,我对这个问题进行了赏金,它已经过期了。 经过大量研究后,我将在这里发布我学到的知识,供将来可能发现这一点的任何人使用。

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

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

  • Chrome使用Adobe的查看器,它不提供任何类型的print()方法,但会执行PDF中嵌入的PdfActions。 因此,您可以在PDF中嵌入"OpenAction",并在从查看这些操作的任何应用程序打开PDF调用时打印PDF调用。

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

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

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

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

-菲尔

使用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 来模拟上述行为。

有一种方法可以在浏览器中呈现整个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

在缺点方面 - 这将比嵌入更难。
从好的方面来说,它实际上会起作用。

在 Chrome 中,您可以运行:

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