我想建立的是,通过点击一个按钮,我想触发PDF文件的打印,但不打开它
+-----------+
|打印PDF|
+-----------+
^单击*----------->;打印PDF(PDF格式)
我第一次尝试的方式是使用iframe:
var$iframe=null;
//这应该是为了修复IE上的onload错误,但它没有被触发
window.printIframeOnLoad=函数(){
if(!$iframe.attr(“src”){return;}
var PDF=$iframe.get(0);
PDF.focus();
试一试{
//无论如何,这对IE不起作用
PDF.contentWindow.print();
//我认为在IE上我们可以做这样的事情:
//PDF.document.execCommand(“print”,false,null);
}捕获(e){
//如果我们不能打印它,我们就在当前窗口中打开它
window.location=url;
}
};
函数printPdf(url){
如果($iframe){
$iframe.remove();
}
$iframe=$(“<;iframe>;”{
类:“隐藏”,
id:“idPdf”,
//应该是对IE的修复
onload:“window.printIframeOnLoad()”,
网址:src
});
$(“正文”)。前置($iframe);
}
这适用于Safari(桌面和iOS)和Chrome(我们可以将其推广到webkit吗?)
在Firefox上,PDF.contentWindow.print()以权限被拒绝错误结束(即使PDF是从同一域加载的)
在IE(11)上,onload处理程序就是不工作
现在,我的问题是:有没有其他更好的方法来打印pdf而不向用户直观地打开它
跨浏览器的事情在这里很关键。我们应该支持尽可能多的浏览器
实现这一目标的最佳方式是什么?我的开始好吗?如何完成它
我们现在是2016年,我觉得这仍然是跨浏览器实施的一个难题。
更新:此链接详细介绍了一个优雅的解决方案,该解决方案涉及编辑第一页的页面属性并在打开页面时添加操作。适用于所有浏览器(因为浏览器将执行actions部分中的JavaScript)。需要Adobe Acrobat Pro
2016年似乎没有给印刷问题带来任何新进展。有一个类似的问题,为了使打印跨浏览器,我用PDF.JS解决了它,但不得不对源代码添加一行代码(他们要求您以任何方式构建它)
这个想法:
- 从下载预构建的稳定版本https://mozilla.github.io/pdf.js/getting_started/#download 并将“build”和“web”文件夹添加到项目中
viewer.html文件通过丰富的界面呈现PDF,并包含打印功能。我在那个文件中添加了一个链接到我自己的JavaScript中,它只是在延迟后触发window.print()
添加到查看器的链接:
<;脚本src=”https://stackoverflow.com/questions/38639769/viewer.js“></脚本>;
<;!--此autoPrint.js添加到viewer.js的下方-->;
<;脚本src=”https://stackoverflow.com/questions/38639769/autoPrint.js“></脚本>;
</头>;
autoPrint.jsjavascript:
(函数(){
函数printWhenReady(){
if(PDFViewerApplication.initialized){
window.print();
}
否则{
设置超时(printWhenReady,3000);
}
};
printWhenReady();
})();
-
然后我可以在iframe的src中调用
viewer.html?file=,并将其隐藏。由于Firefox,必须使用可见性,而不是显示样式:<;iframe src=”https://stackoverflow.com/questions/38639769/web/viewer.html?file=abcde.pdf“style=”可见性:隐藏“>;
结果:打印对话框在短暂延迟后显示,PDF对用户隐藏
在Chrome浏览器,即Firefox上测试