【问题标题】:Print Pdf from javascript embed tag从 javascript 嵌入标签打印 Pdf
【发布时间】:2013-09-21 01:16:53
【问题描述】:

我有一个 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) 这确实会弹出打印对话框,但会打印一个空白页。我会喜欢嵌入标签的工作方式。但是为什么打印功能一直不可用呢?

关于这个主题的大多数帖子都很老了。最好的 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();
 }
}

这会每秒不断地改变“未定义”。打印选项永远不可用。有什么想法吗?

【问题讨论】:

  • 澄清一下:你想打印一个 iframe,你想静默打印,还是两者兼而有之?
  • 要么/全部大声笑,现在什么都可以!
  • :S 你怎么知道 print 总是返回 undefined,你没有任何 return 语句?
  • 哦,jsFiddle 会有所帮助...
  • 我知道这已经很老了,但是...有没有其他人注意到setInterval(printPDF(), 1000); 正在将间隔设置为 printPDF() 的返回结果?由于您创建了一个递归函数,它恰好可以工作,但它实际上并没有利用间隔......

标签: javascript html pdf


【解决方案1】:

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

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

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

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

  • Firefox(高于某个版本,但所有最新版本)在 Windows 中使用 Adob​​e 查看器,该查看器也可以识别 PdfAction。但是,在 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(),请更新此问题。

-菲尔

【讨论】:

    【解决方案2】:

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

    例如。

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

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

    【讨论】:

    • 两个 cmets - 首先这个技巧在我的 Mac 上不起作用;它取决于操作系统和浏览器(甚至浏览器版本/配置)。但其次,您认为这是一个 PDF 技巧是正确的,这里的 PDF 包含一个“OpenAction”和一些 Javascript 以静默打印 PDF 文件。
    【解决方案3】:

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

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

    【讨论】:

    • 虽然我很欣赏这个想法,但我认为倒数第二行确实总结了我的感受。仅仅为了访问 Javascript 中的 print() 函数,这样做将是一项疯狂的工作。
    • 我将 PDF.JS 用于其他目的。不幸的是,它的打印渲染质量不如 Adob​​e Reader……希望它在未来得到修复。
    【解决方案4】:

    在 Chrome 中你可以运行:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-05-27
      • 1970-01-01
      • 2015-01-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-11-01
      相关资源
      最近更新 更多