浏览器调用print实现部分打印的两种方法

本文介绍了如何使用JavaScript来替换页面内容以便打印,以及在打印后恢复原页面,并探讨了在新窗口中进行打印并在打印结束后关闭窗口的方法。通过创建新元素和修改innerHTML属性实现动态打印功能。

替换body的内容为要打印的内容,然后再从新刷新页面

const old = window.document.body.innerHTML //备份原来的页面
window.document.body.innerHTML = ''
window.document.body.appendChild(/* 将你要打印的内容附加到这 */)
window.print() //调用print()函数时,会跳出打印预览的界面,如下的代码被阻塞,关闭预览界面后继续执行
window.document.body.innerHTML = old
window.location.reload() //从新加载旧页面

将打印内容放到新窗口打印,打印结束后关闭新窗口

const newWindow = window.open("打印窗口", "_blank")
const docStr = '<div>test</div>'  //须要打印的内容
newWindow.document.write(docStr)
const styles = document.createElement("style")
styles.setAttribute('type', 'text/css') //media="print"
styles.innerHTML = ''
newWindow.document.getElementsByTagName('head')[0].appendChild(styles)
newWindow.print()
newWindow.close()

详见原文 http://oejia.net/blog/2022/05/30/browser_print.html

本文由博客一文多发平台 OpenWrite 发布!

<think>好的,我现在需要回答用户关于如何在前端通过浏览器API实现PDF文件打印的问题。用户希望使用JavaScript或HTML5调用浏览器内置函数来打印PDF文档,并需要方法及示例代码。首先,我得回忆一下相关知识,确保自己理解正确。 首先,用户的问题是关于前端如何调用浏览器API打印PDF。根据我的理解,通常在前端处理PDF打印有几种方法。一种是在浏览器中直接打开PDF,然后利用浏览器打印功能。另一种是将PDF嵌入到网页中,然后触发打印。不过需要注意的是,直接通过JavaScript控制PDF的打印可能受到浏览器安全策略的限制,比如跨域问题。 接下来,我需要考虑用户提到的引用内容。根据引用[1],提到了使用PyPDF加载PDF文档,但这可能是指后端处理,而用户的问题是关于前端,所以可能需要不同的方法。引用[2]中提到学习JavaScript的ES6~ESn,以及使用Babel和编译器原理,这可能与问题关联不大,但可以忽略,因为用户明确询问的是浏览器API。 首先,用户可能需要知道如何在浏览器中打开PDF并自动触发打印。例如,使用window.print()方法,但这通常用于打印当前页面内容,而不是直接打印PDF文件。另一种方法是在iframe中加载PDF,然后调用打印功能。例如,创建一个隐藏的iframe,加载PDF文件,并在加载完成后触发打印。 另外,HTML5的<embed>或<object>标签可以用来嵌入PDF,然后通过JavaScript调用打印。但不同浏览器的支持可能不同,特别是Chrome可能默认使用内置的PDF查看器,而其他浏览器可能依赖插件。 需要注意的是,直接通过JavaScript自动触发PDF打印可能会被浏览器的弹出窗口阻止程序拦截,因此可能需要用户手动触发,比如点击按钮后执行打印操作。此外,PDF文件的URL必须同源,否则可能因CORS策略被阻止。 现在,我需要整理步骤,并提供示例代码。首先,使用iframe的方法:创建一个iframe元素,设置src为PDF的URL,然后监听其加载事件,在加载完成后调用contentWindow.print()。但需要注意,如果PDF来自不同源,可能会遇到权限问题。 另一种方法是使用window.open打开PDF在新窗口,然后尝试调用print()方法,但这同样可能被浏览器拦截,或者因为PDF查看器的不同而无法自动打印。 另外,可以考虑使用PDF.js库,这是Mozilla开发的一个用JavaScript编写的PDF渲染器,可以在canvas中渲染PDF,并提供更多的控制。但这种方法需要将PDF内容渲染到页面上,然后触发打印,适用于需要自定义打印样式的情况。 不过,用户的问题可能更倾向于使用原生浏览器API,而不是第三方库。因此,重点放在原生的方法上。 总结可能的解决方案: 1. 使用iframe嵌入PDF并调用打印。 2. 使用window.open打开PDF后调用打印。 3. 使用PDF.js渲染并打印。 由于用户要求使用浏览器内置函数,可能前两种方法更合适。但需要考虑兼容性和安全限制。 现在需要编写示例代码。例如,使用iframe的方法: ```html <iframe id="pdfFrame" src="document.pdf" style="display:none;"></iframe> <button onclick="printPDF()">打印PDF</button> <script> function printPDF() { const iframe = document.getElementById('pdfFrame'); iframe.onload = function() { iframe.contentWindow.print(); }; } </script> ``` 但这种方法可能在某些浏览器中无法自动触发打印,或者需要用户交互。例如,Chrome可能不允许脚本自动调用print(),必须由用户手势触发,比如点击按钮后的回调函数中执行。 另外,如果PDF是在新窗口中打开,可以尝试: ```javascript function printPDF() { const win = window.open('document.pdf', '_blank'); win.onload = function() { win.print(); }; } ``` 但window.open可能会被拦截,且onload事件可能不会在PDF查看器中正确触发,因为PDF的加载由浏览器插件处理,而非普通的页面加载。 因此,更可靠的方式可能是让用户手动打开PDF,然后使用浏览器打印功能(Ctrl+P),或者在前端页面中嵌入PDF查看器,并提供打印按钮。 另外,如果PDF作为数据在客户端生成,比如通过Blob,可以使用URL.createObjectURL生成临时链接,然后在iframe中加载: ```javascript fetch('document.pdf') .then(response => response.blob()) .then(blob => { const url = URL.createObjectURL(blob); const iframe = document.createElement('iframe'); iframe.style.display = 'none'; iframe.src = url; document.body.appendChild(iframe); iframe.onload = () => { iframe.contentWindow.print(); }; }); ``` 但同样需要注意跨域问题和用户手势要求。 此外,如果服务器设置了适当的CORS头,可以避免跨域问题。 最后,需要提醒用户这些方法可能存在的限制,比如浏览器兼容性、安全策略等,以及可能需要用户交互才能成功打印。 现在,将这些思路整理成结构化的回答,分步骤说明,并提供示例代码,同时注意引用相关的内容。根据引用[1]中提到的PyPDF可能不适用于前端,所以可能不需要引用,但引用[2]中的前端技术相关的内容可能可以忽略,除非有直接关联。</think>要使用JavaScript或HTML5调用浏览器内置函数打印PDF文档,可以通过嵌入PDF并触发打印对话框实现。以下是具体方法及示例代码: --- ### 方法一:通过`<iframe>`嵌入PDF后打印 1. **嵌入PDF**:将PDF文件嵌入到隐藏的`<iframe>`中。 2. **触发打印**:在PDF加载完成后调用`contentWindow.print()`。 ```html <iframe id="pdfFrame" src="document.pdf" style="display:none;"></iframe> <button onclick="printPDF()">打印PDF</button> <script> function printPDF() { const iframe = document.getElementById('pdfFrame'); iframe.onload = function() { iframe.contentWindow.print(); // 调用iframe内的打印功能 }; // 防止缓存导致onload不触发 iframe.src = iframe.src; } </script> ``` **注意**:需确保PDF与页面同源,否则可能因跨域限制失败[^1]。 --- ### 方法二:通过`window.open`打开新窗口打印 1. **新窗口打开PDF**:使用`window.open`加载PDF。 2. **尝试自动打印**:在新窗口加载完成后调用`print()`。 ```javascript function printPDF() { const pdfWindow = window.open('document.pdf', '_blank'); pdfWindow.onload = function() { pdfWindow.print(); // 可能因浏览器策略限制无法自动执行 }; } ``` **限制**:部分浏览器会阻止非用户触发的`print()`调用,需用户手动确认。 --- ### 方法三:使用Blob数据打印(适用于动态生成的PDF) 1. **获取PDF数据**:通过`fetch`获取PDF二进制数据。 2. **生成临时URL**:使用`URL.createObjectURL`创建链接。 3. **嵌入并打印**: ```javascript function printPDF() { fetch('document.pdf') .then(response => response.blob()) .then(blob => { const url = URL.createObjectURL(blob); const iframe = document.createElement('iframe'); iframe.style.display = 'none'; iframe.src = url; document.body.appendChild(iframe); iframe.onload = () => { iframe.contentWindow.print(); URL.revokeObjectURL(url); // 释放内存 }; }); } ``` --- ### 关键注意事项 1. **用户手势要求**:Chrome等浏览器要求`print()`必须由用户操作(如点击按钮)触发,否则会被拦截。 2. **跨域限制**:PDF文件需与页面同源,或服务器设置`CORS`响应头。 3. **浏览器兼容性**:部分浏览器(如Safari)可能不支持直接调用PDF查看器的打印功能。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值