我正在建立HTML格式的PDF清单。在列表中,我想包含一个下载链接和一个打印按钮/链接。有什么方法可以直接打开PDF的“打印”对话框,而无需用户查看PDF或打开PDF查看器?
将PDF下载到隐藏的iframe中并触发使用JavaScript进行打印,是否有些变化?
我正在建立HTML格式的PDF清单。在列表中,我想包含一个下载链接和一个打印按钮/链接。有什么方法可以直接打开PDF的“打印”对话框,而无需用户查看PDF或打开PDF查看器?
将PDF下载到隐藏的iframe中并触发使用JavaScript进行打印,是否有些变化?
Answers:
根据以下评论,它不再能在现代浏览器中使用。
该问题演示了一种可能对您有所帮助的方法:静默打印嵌入式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,因为直到完成打印才需要使用iframe,并且print方法没有回调支持(据我所知)。
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;
}
setTimeout
,打印功能有时会失败。不知道为什么,希望有人能找到答案。
onafterprint
。我有点担心,重复使用iframe可能会引起竞争状况,因为有人会快速单击两个按钮并最终两次打印第二个PDF,这是因为iframe URL在第一个打印对话框出现之前已经被换出了。
从http://printjs.crabbly.com/下载Print.js
$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)
}
跨浏览器解决方案,用于从base64字符串打印pdf:
。
const blobPdfFromBase64String = base64String => {
const byteArray = Uint8Array.from(
atob(base64String)
.split('')
.map(char => char.charCodeAt(0))
);
return new Blob([byteArray], { type: 'application/pdf' });
};
const isIE11 = !!(window.navigator && window.navigator.msSaveOrOpenBlob); // or however you want to check it
const printPDF = blob => {
try {
isIE11
? window.navigator.msSaveOrOpenBlob(blob, 'documents.pdf')
: printJS(URL.createObjectURL(blob)); // http://printjs.crabbly.com/
} catch (e) {
throw PDFError;
}
};
printPDF(blobPdfFromBase64String(base64String))
奖金-在IE11的新标签中打开Blob文件
如果您能够对服务器上的base64字符串进行一些预处理,则可以在某些url下公开它,并使用printJS
:)中的链接