如何强制浏览器打印网页的PDF版本?

8
考虑一个静态的HTML页面,例如test.html,并且该页面的可打印版本已存储在test.pdf中。当访问者告诉他们的浏览器要打印时,如何引导浏览器加载和打印test.pdf而不是test.html
如果不可能,我如何在HTML页面中引入一个打印按钮(使用JavaScript)来实现这一点?

1
  1. 这将下载文件,而不是打印;
  2. 即使加载 PDF 文件,它也会打开而不是打印。
- Googlebot
哎呀,我看错了问题。可能有一个方法(不确定)是在iframe中加载pdf并调用iframe的打印功能。但我不确定DOM保留了多少。 - Manishearth
我有点糊涂了,你是使用打印友好的CSS还是预制的PDF文件?因为这两者非常不同。 - David Hellsing
@Ali,我已经撤销了你的编辑。在回答已经给出之后,你不能完全改变一个问题。请求CSS解决方案来自定义打印内容与打印时打开PDF是完全不同的事情。如果你已经改变了你的要求,请创建一个新的问题。 - James Hill
@JamesHill 我不想要一个CSS解决方案,我只是想澄清一下情况。我说的是类似于读取PDF文件的东西。 - Googlebot
显示剩余2条评论
3个回答

8
您不能强制浏览器打印与用户请求/查看的文件不同的文件。那将是一个安全噩梦!
选项1(JS(按要求)和HTML)
我建议在您的网站上创建一个“可打印版本”链接,该链接将引导用户到.pdf文件(最好在新窗口中打开PDF)。
<!-- JS -->
<script type="text/javascript">
    function LoadPrintableVersion() {
        window.open("Test.pdf");
    }
</script>

<!-- HTML -->
<span id="spanPrintableVersion" onclick="LoadPrintableVersion()">
    Printable Version
</span>

选项二(纯HTML)

<a href="test.pdf" target="_blank">Printable Version</a>

1
为什么不使用<a>标签链接到PDF呢?这样即使没有JS也可以正常工作。 - David Hellsing
3
@David,因为用户特别要求使用JS,而我也正好在我的JS环境中:) 我将提供一个纯HTML的示例(因为您的观点是有效的)! - James Hill
请解释一下如何向打印机发送不同的文档会成为“安全噩梦”? - Ky -
@Supuhstar,认真吗?我可以想到无数的邪恶用途。更好的问题是,除了使用CSS样式使打印更加用户友好之外,为什么有人想要打印屏幕上没有显示的内容?如果用户选择打印屏幕上的内容,他们应该知道正在打印什么。 - James Hill
1
@JamesHill 这里是我能想到的一些例子:个人简历,其中包含特殊格式的版本,以确保始终打印在一页上;Google 地图,在打印搜索方向时,会打印逐步说明而不是屏幕上的内容;一个仅使用 Flash(或 Silverlight 或 Canvas)的网站,其中已创建了预览图像,并应该打印,因为当前显示的内容并不总是立即可理解的。 - Ky -
@JamesHill 也是,没错。如何利用打印机和网页远程侵犯另一个用户的安全? - Ky -

3
您无法在浏览器中劫持打印命令,但您可以劫持键盘快捷键(虽然我不建议这样做),以便当用户使用ctrl/cmd + p打印时,它会重定向到PDF(或执行其他操作)。然而,这是一个易用性雷区,您应该只创建一个大型链接,上面写着“可打印版本”,并将其链接到PDF(或使用打印友好的CSS的页面版本)。
另一个好的选择是在CSS文件中为print媒体类型定义一些规则,然后浏览器将在用户打印时应用这些规则,而无需任何黑客技巧或JavaScript。
但既然您要求,我创建了一个小的快捷键劫持脚本来打印命令。由于Mac命令键的缘故,这有点棘手,但类似于:
var cmd = false;

$(document).on('keydown', function(e) {

    if(detectMacCommand(e.which)) {
        cmd = true;
        return;
    }

    // now detect print (ctr/cmd + p)
    if ( e.which == 80 && ( e.ctrl || cmd ) ) {
        e.preventDefault();
        alert('redirect to PDF');
    }

}).on('keyup', function(e) {

    if(detectMacCommand(e.which)) {
        cmd = false;
        return;
    }

});

function detectMacCommand(key) {
    return ( $.browser.mozilla && key == 224 ||
             $.browser.opera   && key == 17 ||
             $.browser.webkit  && ( key == 91 || key == 93 ));
}
​

那很酷,但不要使用它 :)

2
以下是W3C建议的方法:

这里是W3C建议的方式:

<LINK REL="alternate" HREF="/path/to/PDFVersion.pdf" TYPE="application/pdf" MEDIA="print" TITLE="PDF version" />

请注意,据我所知,目前没有浏览器支持此功能。抱歉。

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