嵌入式PDF如何静默打印

26

我有一个包含嵌入式PDF的网页。我的代码看起来像这样:

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

我有这段JavaScript代码用于打印我的PDF:

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插件会打开常见的打印对话框,类似于这样: PrintDialog 两个问题:
1. 如何改进检测PDF是否已加载并准备好进行打印的方式? 2. 如何避免显示打印对话框?
有关我的系统的更多信息: 操作系统:Windows XP 浏览器:Internet Explorer 7 PDF插件:Acrobat Reader 9

@gideon 由于某些原因,这在ie8、ff或chrome中都无法正常工作... ie会给出错误的网页错误详细信息 消息:'null'是null或不是对象 行:26 字符:5 代码:0 URI:http://localhost/mpdf/pdf.php如果我在if typeof中放入alert(),即使文档加载完成后,警报也会继续弹出。 - Apurva
4个回答

20

使用普通的JavaScript无法实现静默打印。您想让打印机开始打印100000000页全黑的页面吗?这不是一个好主意。如果您想要在Internet Explorer上进行静默打印,并使其工作,有一些ActiveX控件可以实现。这需要为您的页面设置更高的安全性,并且需要使用户真正信任您的网站。


谢谢,这是为企业内部网络而不是互联网设计的,他们必须信任!:-) 你能告诉我这个ActiveX在哪里吗?我会进行评估。 - sourcerebels
1
我认为他的观点是,如果浏览器允许静默打印,那么这将成为一个安全漏洞。因此,浏览器/插件不允许这样做很可能是出于设计考虑。 - JohnFx
自从这个解决方案被接受以来,技术已经发生了很大的变化。以下是一些无声打印解决方案,其中一些可以按照要求通过URL无声打印PDF。https://dev59.com/WF8d5IYBdhLWcg3wNAKy - tresf

5
在可信的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();" />

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

5
我无法在火狐或Safari中使用这种方法。这只适用于IE吗? - Karl
clsid:CA8A9780-280D-11CF-A24D-444553540000 是指 Adobe Reader ActiveX 插件。Firefox 不支持 ActiveX。 - mischka

2

您可以通过更改 about:config 在Firefox中实现此操作。添加 print.always_print_silent 并将其设置为 true


2

我想知道你是否真的需要等待才能打印--难道不是打印任务自动处理吗?我真心希望现代浏览器不会让你(或任何网站)在没有确认对话框的情况下打印(一些旧浏览器曾经这样做,很久以前)。


嗨,阿尔贾恩,感谢您的快速回复。如果在加载PDF文件之前调用.print方法,我会收到一个JavaScript错误,类似于“此对象不允许使用此方法”(我会收到西班牙语的错误消息)。关于您的第二个评价,我认为PDF不是由浏览器打印的,而是由Acrobat插件打印的 :-) - sourcerebels
但是那个插件可能存在于任何人的浏览器中,对吗?如果是这样,那么我不希望确认框消失。body元素的onload事件是否在PDF加载之前触发? - Arjan
哦,看起来Internet Explorer也支持嵌入式元素的onload()事件:http://msdn.microsoft.com/en-us/library/cc197055(VS.85).aspx - Arjan
@Arjan:这是一个企业内部网络应用程序,所有客户端都安装了Acrobat Reader 9版本和Internet Explorer 7 :-),是的,PDF加载前已经触发了onload事件,同时embed标签的onload事件也具有相同的行为。 - sourcerebels
1
嗯,这很奇怪,onload 触发得太早了。让我们假设你会有更多运气找到那个 ActiveX 控件... - Arjan
谢谢你,Arjan。我们正在使用类似于信息亭的操作系统,这个问题的解决方案由这个软件提供。感谢你的回复。 - sourcerebels

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接