【问题标题】:Silent print an embedded PDF静默打印嵌入的 PDF
【发布时间】:2010-11-01 19:37:13
【问题描述】:

我有一个嵌入了 PDF 的网页。我的代码如下所示:

<embed
    type="application/pdf"
    src="path_to_pdf_document.pdf"
    id="pdfDocument"
    width="100%"
    height="100%">
</embed>

我有这个用于打印我的 PDF 的 javascript 代码:

function printDocument(documentId) {

    //Wait until PDF is ready to print    
    if (typeof document.getElementById(documentId).print == 'undefined') {

        setTimeout(function(){printDocument(documentId);}, 1000);

    } else {

        var x = document.getElementById(documentId);
        x.print();
    }
}

执行此代码时,Acrobat 插件会打开众所周知的打印对话框。像这样的:

两个问题:

  • 如何改进检测 PDF 已加载并准备好打印的方法?
  • 如何避免显示打印对话框?

关于我的系统的更多信息:

操作系统: Windows XP

浏览器: Internet Explorer 7

PDF 插件: Acrobat Reader 9

【问题讨论】:

  • @gideon 出于某种原因这不起作用....在 ie8 ff 或 chrome 中...即给出错误网页错误详细信息消息:'null' 为空或不是对象行:26 Char: 5 Code: 0 URI: localhost/mpdf/pdf.php if i put in alert() if typeof 即使在加载文档后,警报仍会继续弹出

标签: javascript html pdf acrobat


【解决方案1】:

我想知道您是否真的需要在打印前等待——打印作业不会为您处理吗?我真的希望没有任何现代浏览器允许您(或任何网站)在没有确认对话框的情况下打印(很久以前一些旧浏览器曾经这样做)。

【讨论】:

  • 嗨,Arjan,感谢您的快速回复。如果我在加载 PDF 文件之前调用 .print 方法,我会收到一个 Javascript 错误,例如“此对象不允许使用此方法”(我收到西班牙语的错误消息)。在您的第二次评估中,我认为 PDF 不是由浏览器打印的,而是由 Acrobat 插件打印的 :-)
  • 但是该插件可能存在于任何人的浏览器中,对吧?如果是这样,那么我不希望该确认消失。在加载 PDF 之前,正文元素的 onload 事件是否会触发?
  • 哦,在我看来 Internet Explorer 也支持 onload() 嵌入:msdn.microsoft.com/en-us/library/cc197055(VS.85).aspx
  • @Arjan:它是一个企业 Intranet 应用程序,所有客户端都安装了 Acrobat 阅读器版本 9 和 Internet Explorer 7 :-),是的,在加载 PDF 之前触发 onload 并且嵌入它的 onload 事件相同的行为。
  • 嗯,这很奇怪,onload 启动得太早了。让我们假设您会更幸运地找到 ActiveX 控件...
【解决方案2】:

您将无法使用普通的旧 JavaScript 进行静默打印。您希望您的打印机如何开始打印 100000000 页全黑。不是什么好事。如果您想静默打印并使其仅适用于 Internet Explorer,则可以使用 ActiveX 控件。这需要为您的页面和您的用户提供更高的安全设置才能真正信任您的网站。

【讨论】:

  • 谢谢,它用于企业内部网而不是互联网,他们必须信任! :-) 你能指点我这个 ActiveX。我会评估它。
  • 我认为他的观点是,如果浏览器允许静默打印,那将是一个安全漏洞。因此,浏览器/插件可能在设计上不允许这样做。
  • 自从该解决方案被接受以来,技术已经发生了很大变化。这里有一些静默打印解决方案,其中一些可以完全按照请求通过 URL 静默打印 PDF。 stackoverflow.com/questions/27057816
【解决方案3】:

您可以在 Firefox 中通过更改 about:config 来做到这一点。添加print.always_print_silent并将其设置为true

【讨论】:

    【解决方案4】:

    这在受信任的 Intranet 环境中是可能的。

    <object id="pdfDoc" style="position:absolute;z-index:-1;" name="pdfDoc" classid="clsid:CA8A9780-280D-11CF-A24D-444553540000" width="900px" height="100%">
            <param name="SRC" value="yourdoc.pdf" />
        </object>
    
    <input type="button" ... onclick="pdfDoc.printAll();" />
    

    这将绕过打印对话框并直接发送到默认打印机。

    【讨论】:

    • 我无法在 FF 或 Safari 中使用此方法。只有这个 IE 吗?
    • clsid:CA8A9780-280D-11CF-A24D-444553540000 指的是 Adob​​e Reader ActiveX 插件。 Firefox 不支持 ActiveX。
    猜你喜欢
    • 2015-06-07
    • 2011-05-28
    • 2010-11-27
    • 1970-01-01
    • 2015-01-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多