我正在用 HTML 构建一个 PDF 列表。在列表中,我想包含一个下载链接和一个打印按钮/链接。有没有办法直接打开 PDF 的“打印”对话框,而无需用户查看 PDF 或打开 PDF 查看器?
将 PDF 下载到隐藏的 iframe 并触发它使用 JavaScript 打印的一些变体?
我正在用 HTML 构建一个 PDF 列表。在列表中,我想包含一个下载链接和一个打印按钮/链接。有没有办法直接打开 PDF 的“打印”对话框,而无需用户查看 PDF 或打开 PDF 查看器?
将 PDF 下载到隐藏的 iframe 并触发它使用 JavaScript 打印的一些变体?
根据下面的评论,它不再适用于现代浏览器
这个问题展示了一种可能对您有帮助的方法:Silent print an Embedded PDF
它使用<embed>
标签将 PDF 嵌入到文档中:
<embed
type="application/pdf"
src="path_to_pdf_document.pdf"
id="pdfDocument"
width="100%"
height="100%" />
然后.print()
在加载 PDF 时在 Javascript 中调用元素上的方法:
function printDocument(documentId) {
var doc = document.getElementById(documentId);
//Wait until PDF is ready to print
if (typeof doc.print === 'undefined') {
setTimeout(function(){printDocument(documentId);}, 1000);
} else {
doc.print();
}
}
您可以将嵌入内容放置在隐藏的 iframe 中并从那里打印出来,从而为您提供无缝体验。
这是一个从 iframe 打印 PDF 的函数。
您只需要将 PDF 的 URL 传递给函数。加载 PDF 后,它将创建一个 iframe 并触发打印。
请注意,该函数不会破坏 iframe。相反,它每次调用函数时都会重用它。很难销毁 iframe,因为在打印完成之前需要它,并且打印方法没有回调支持(据我所知)。
printPdf = function (url) {
var iframe = this._printIframe;
if (!this._printIframe) {
iframe = this._printIframe = document.createElement('iframe');
document.body.appendChild(iframe);
iframe.style.display = 'none';
iframe.onload = function() {
setTimeout(function() {
iframe.focus();
iframe.contentWindow.print();
}, 1);
};
}
iframe.src = url;
}
您可以使用 Print.js ( npm install print-js
)。解压后大小为 128kB,您可以在http://printjs.crabbly.com/ 上找到文档。
不过,它不会在 IE 上打印,在这些情况下,您必须下载 PDF。
$http({
url: "",
method: "GET",
headers: {
"Content-type": "application/pdf"
},
responseType: "arraybuffer"
}).success(function (data, status, headers, config) {
var pdfFile = new Blob([data], {
type: "application/pdf"
});
var pdfUrl = URL.createObjectURL(pdfFile);
//window.open(pdfUrl);
printJS(pdfUrl);
//var printwWindow = $window.open(pdfUrl);
//printwWindow.print();
}).error(function (data, status, headers, config) {
alert("Sorry, something went wrong")
});
https://github.com/mozilla/pdf.js/
现场演示http://mozilla.github.io/pdf.js/
这可能是你想要的,但我看不出这有什么意义,因为现代浏览器包含这样的功能,而且它在低功耗设备上运行速度也会非常慢,比如移动设备,顺便说一下,这些设备有自己优化的插件和应用程序.
我使用此功能从服务器下载 pdf 流。
function printPdf(url) {
var iframe = document.createElement('iframe');
// iframe.id = 'pdfIframe'
iframe.className='pdfIframe'
document.body.appendChild(iframe);
iframe.style.display = 'none';
iframe.onload = function () {
setTimeout(function () {
iframe.focus();
iframe.contentWindow.print();
URL.revokeObjectURL(url)
// document.body.removeChild(iframe)
}, 1);
};
iframe.src = url;
// URL.revokeObjectURL(url)
}