28

在 Web 应用程序中,是否可以强制在客户端打印 PDF 文件?如果浏览器配置为在窗口内打开 PDF,我猜调用 window.print() 将起作用,但某些浏览器(如我的)配置为在外部打开 PDF。

4

8 回答 8

29

google docs 的做法是将 JavaScript 嵌入到 PDF 中,告诉 Acrobat Reader 或任何其他兼容的阅读器打印它。

您需要一个 PDF 工具包来使用随机 PDF 执行此操作。

于 2008-10-15T15:32:40.330 回答
5
<html>
<script language="javascript">
timerID = setTimeout("exPDF.print();", 1000);
</script>
<body>
<object id="exPDF" type="application/pdf" data="111.pdf" width="100%" height="500"/>
</body>
</html>
于 2011-01-11T08:04:49.043 回答
3

与 taeyoung 的建议类似,您可以使用 iframe 呈现 pdf,然后使用 contentWindow.print();

于 2011-07-27T22:28:21.920 回答
2

您可以将 http 标头设置为 application/pdf,然后使用 javascript 强制打开一个新窗口并以这种方式打印。但谁真的会那样做呢?我的意思是现在来吧。

于 2008-12-12T21:30:07.967 回答
1

您可以使用简单而神奇的库printjshttp://printjs.crabbly.com ”,它需要 PDF 文件并在不显示打印对话框的情况下打印它,如果需要,这是一种简单的方法:

 <button type="button" onclick="printJS('docs/printjs.pdf')">
    Print PDF
 </button>

于 2017-12-17T13:01:49.060 回答
0

您的意思是要强制将文件发送到打印机吗?您是否在考虑意外后果定律——用户的设备未连接到打印机?可能是黑莓手机,也可能是连接 Wi-Fi 的笔记本电脑。如果用户不希望它使用默认打印机怎么办?

于 2008-10-15T16:35:56.567 回答
0

您不能使用 Javascript 直接从浏览器打印 PDF 文档。Javascript 函数 window.print() 使用浏览器打印功能,这不是您需要的。您可以通过Java Web Start 来达到您开始打印的目的。将您的 PDF 文档直接放入 jnlp 中,这样您就可以运行一个 Java 程序来接收原始 PDF 文档作为参数。现在您在系统中运行,不再在浏览器中运行,因此您可以通过 JAVA API 直接与打印驱动程序交互。这看起来很简单,但实际上并不是因为 JAVA 打印 API 不接受文件作为输入,而是因为实现了 ava.awt.print.Pageable 接口的特定数据结构。

在www.pdfprint.it上存在一个网络服务,可以为您完成所有工作。这里摘自官方文档的片段。

<?php

// 1. GET the jnlp file with curl

$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, "http://www.pdfprint.it/printPdf?auth=XXXX");        
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); //return the transfer as a string       
$jnlp = curl_exec($ch);
curl_close($ch); 

$pdfDoc ="example.pdf";


//2. put in the jnlp your PDF document base64 encoded

$jnlp = str_replace("####", base64_encode(file_get_contents($pdfDoc)),$jnlp);


//3. echo the jnlp file 

header('Content-type: application/x-java-jnlp-file');

echo $jnlp;

您只需要获取 jnlp 文件,放入您的 PDF 文档并将 jnlp 发送到浏览器。运行打印的 JAVA 程序将直接从 Web 服务下载。您还可以将一些打印选项设置为副本、面数等

于 2014-01-17T09:17:54.837 回答
0

如果要通过浏览器的打印对话框打印 PDF,可以在调用该print()方法的 iframe 中呈现 PDF。

// create iframe element
const iframe = document.createElement('iframe');

// create object URL for your blob or file and set it as the iframe's src
iframe.src = window.URL.createObjectURL(fileOrBlob);
iframe.name = 'pdf';

// call the print method in the iframe onload handler
iframe.onload = () => {
    const pdfFrame = window.frames["pdf"];
    pdfFrame.focus();
    pdfFrame.print();
}
document.body.appendChild(iframe);

您还可以设置iframe.hidden = true;在隐藏的 iframe 中执行所有这些操作,用户不会注意到这一点。

此解决方案应适用于除旧版 Microsoft Edge 之外的所有主要浏览器。如果您需要与旧版 Microsoft Edge 兼容,您可以回退到 npm 包 print-js:https ://www.npmjs.com/package/print-js 。

于 2021-06-07T19:49:28.337 回答