Edge中如何触发HTML嵌入PDF的打印对话框?
问题描述
我有一份PDF文件的base64文本,需要自动打开打印对话框。目前的做法是新建窗口并嵌入PDF,让用户手动点击工具栏的打印按钮。代码如下:
var windowContent = '<!DOCTYPE html>'; windowContent += '<html>' windowContent += '<head><title>Print</title></head>'; windowContent += '<body style=\"margin:0; padding:0; height:99.5vh\">' windowContent += '<embed width=100% height=100% src="data:application/pdf;base64,' + dataUrl + '">'; windowContent += '</body>'; windowContent += '</html>'; var printWin = window.open('','','width=1000,height=1000'); printWin.document.open(); printWin.document.write(windowContent); printWin.document.close(); printWin.focus(); //printWin.print();
被注释的printWin.print()是因为embed异步加载PDF,直接调用会打印空白页。由于内部安全规定,我无法使用pdf.js这类外部JS库。想知道是否可以通过代码触发embed工具栏上的“打印”按钮?是否可行?
按照建议修改代码后仍无法正常工作,页面加载完成但打印未执行,修改后的代码如下:
function myPrint(win) { win.print(); } var windowContent = '<!DOCTYPE html>' + '<html>' + '<head><title>Print MeasurementJob</title></head>' + '<body style="margin:0; padding:0; height:99.5vh">' + '<embed width="100%" height="100%" src="data:application/pdf;base64,' + dataUrl + '">' + '</body>' + '</html>'; var printWin = window.open('', '', 'width=1000,height=1000'); printWin.document.write(windowContent); printWin.document.close(); printWin.focus(); var embed = printWin.document.querySelector('embed'); embed.addEventListener('load', function() { myPrint(printWin); });
解决方案
原修改方案失效原因
多数浏览器的PDF查看器插件不会为<embed>元素触发标准的load事件,或者触发时机和预期不符,导致绑定的打印逻辑无法执行。另外,直接触发embed工具栏的打印按钮也不可行——不同浏览器的PDF插件实现差异大,没有统一公开API可调用内部打印功能,且受浏览器安全策略限制,JS无法直接操控插件内部UI元素。
可行替代方案:改用<iframe>加载PDF
<iframe>的load事件在PDF加载完成后更可靠,能确保调用print()时内容已就绪。示例代码如下:
var windowContent = '<!DOCTYPE html>' + '<html>' + '<head><title>Print MeasurementJob</title></head>' + '<body style="margin:0; padding:0; height:99.5vh">' + '<iframe width="100%" height="100%" src="data:application/pdf;base64,' + dataUrl + '" frameborder="0"></iframe>' + '</body>' + '</html>'; var printWin = window.open('', '', 'width=1000,height=1000'); printWin.document.write(windowContent); printWin.document.close(); printWin.focus(); // 监听iframe的load事件 var iframe = printWin.document.querySelector('iframe'); iframe.addEventListener('load', function() { // 延迟执行确保PDF渲染完全 setTimeout(function() { printWin.print(); }, 500); });
备选方案:定时轮询确认PDF加载状态
如果必须使用<embed>,可以通过定时检查插件状态判断PDF是否加载完成(不同浏览器检查方式略有差异),示例如下:
var printWin = window.open('', '', 'width=1000,height=1000'); printWin.document.write(windowContent); printWin.document.close(); printWin.focus(); var embed = printWin.document.querySelector('embed'); // 轮询检查PDF加载状态 var checkLoadInterval = setInterval(function() { try { // Chrome/Edge环境:检查contentDocument状态 if (embed.contentDocument && embed.contentDocument.readyState === 'complete') { clearInterval(checkLoadInterval); printWin.print(); } // Firefox环境:检查插件status属性 else if (embed.status === 'complete') { clearInterval(checkLoadInterval); printWin.print(); } } catch(e) { // 跨域报错时忽略,继续轮询 } }, 300);
内容的提问来源于stack exchange,提问作者FunnyO
相关产品推荐
相关产品推荐

