首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >从javascript嵌入标签打印Pdf

从javascript嵌入标签打印Pdf
EN

Stack Overflow用户
提问于 2013-09-17 03:21:19
回答 4查看 27.4K关注 0票数 13

我有一个PDF文件,我正在尝试通过Javascript打印它。我尝试过这个嵌入技巧:Silent print a embedded PDF。然而,打印功能从来没有变得可用,它始终是未定义的。

我已经用下面的代码尝试过Iframe技巧:

代码语言:javascript
复制
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代码:

代码语言:javascript
复制
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();
 }
}

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

EN

回答 4

Stack Overflow用户

发布于 2014-11-21 03:14:21

我在大约一周前对这个问题进行了悬赏,但它已经过期了。我将在经过大量研究后将我在这里学到的东西发布给未来可能发现这一点的任何人。

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

在所有浏览器上,我无法通过Javascript调用任何类型的()方法,我只能使用PdfActions。操作会调用print。

  • Chrome使用的是iText的查看器,它不能访问任何类型的print()方法,但可以执行嵌入到PDF中的PdfActions。因此,您可以在PDF中嵌入一个'OpenAction‘,并让PDF调用print,无论何时从任何应用程序打开它时(高于某个版本,都是最近的版本),都可以使用Windows中的Adobe viewer,它也可以识别PdfActions。然而,在OSX中,它失去了对Adobe查看器的支持,并切换到在Firefox中烘焙的查看器(pdf.js)。它不支持PdfActions.
  • IE:,我并没有在IE上做过太多测试。主要是因为在Firefox不能在OSX上工作之后,我放弃了从Javascript打印PDF。对我来说)。

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

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

-Phil

票数 15
EN

Stack Overflow用户

发布于 2014-11-18 15:27:59

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

例如。

打开网址:https://drive.google.com/viewerng/viewer?url=http://www.energy.umich.edu/sites/default/files/pdf-sample.pdf

  • Now点击打印图标。
  1. 正如你看到的那样,一个新的窗口被注入了打印命令
  2. 被打开了。一旦加载了pdf,就会触发内置打印命令。您可以在每次刷新页面时看到触发的打印。这意味着打印行为被附加到文档加载事件。

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

票数 2
EN

Stack Overflow用户

发布于 2014-11-19 05:26:38

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

这是Mozilla在JavaScript中的实现:https://github.com/mozilla/pdf.js/

这是一个示例:http://mozilla.github.io/pdf.js/web/viewer.html (请注意右上角的print按钮)。

有关其工作原理的详细信息,请查看此处的查看器代码:https://github.com/mozilla/pdf.js/blob/master/web/viewer.js

从不利的方面来看,这将比仅仅嵌入要难得多。

从好的方面来说,它实际上是可行的。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/18835648

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档