通过iframe碎片实现web局部打印

server/2024/10/22 9:53:56/

通过iframe碎片实现web局部打印

创建打印模板

首先,创建一个出货单的 HTML 模板,并用 CSS 进行样式设计。
tips:
1、直接通过iframe碎片拉起打印,会导致样式丢失,所以需要获取当前界面的样式。

${Array.from(document.querySelectorAll('link[rel="stylesheet"], style')).map(style => style.outerHTML).join('\n');}

2、通过浏览器拉起打印机打印会有一个延迟,如果直接执行 document.body.removeChild(iframe); 移除 iframe 碎片会导致打印机获取不到碎片的内容。所以需要对 removeChild() 进行延迟处理。

<template><div id="app"><button @click="printOrder">打印出货单</button><div id="printArea"><h1>出货单</h1><p>订单编号: {{ orderNumber }}</p><p>客户名称: {{ customerName }}</p><table><thead><tr><th>商品名称</th><th>数量</th><th>单价</th><th>总价</th></tr></thead><tbody><tr v-for="item in orderItems" :key="item.id"><td>{{ item.name }}</td><td>{{ item.quantity }}</td><td>{{ item.price }}</td><td>{{ item.total }}</td></tr></tbody></table><p>总计: {{ totalAmount }}</p></div></div>
</template><script>
export default {data() {return {orderNumber: '12345',customerName: '张三',orderItems: [{ id: 1, name: '商品1', quantity: 2, price: 100, total: 200 },{ id: 2, name: '商品2', quantity: 1, price: 200, total: 200 },],totalAmount: 400,};},methods: {printOrder() {const printContent = this.$refs.printArea.innerHTML;const iframe = document.createElement('iframe');iframe.style.position = 'absolute';iframe.style.width = '0px';iframe.style.height = '0px';iframe.style.border = 'none';document.body.appendChild(iframe);const iframeDoc = iframe.contentWindow.document;iframeDoc.open();iframeDoc.write(`<!DOCTYPE html><html><head><title>出货单</title>${Array.from(document.querySelectorAll('link[rel="stylesheet"], style')).map(style => style.outerHTML).join('\n');}<style>table {width: 100%;border-collapse: collapse;}th, td {border: 1px solid #000;padding: 8px;text-align: left;}</style></head><body>${printContent}</body></html>`);iframeDoc.close();iframe.contentWindow.focus();iframe.contentWindow.print();setTimeout(()=>{document.body.removeChild(iframe);},3000);},},
};
</script><style>
#printArea {width: 100%;padding: 20px;border: 1px solid #000;
}
table {width: 100%;border-collapse: collapse;
}
th, td {border: 1px solid #000;padding: 8px;text-align: left;
}
</style>

http://www.ppmy.cn/server/90138.html

相关文章

基于 HTML+ECharts 实现智慧工地数据可视化大屏(含源码)

构建智慧工地数据可视化大屏&#xff1a;基于 HTML 和 ECharts 的实现 智慧工地已成为建筑行业的新趋势。通过实时监控和数据分析&#xff0c;智慧工地可以提高施工效率、降低安全风险。本文将详细介绍如何利用 HTML 和 ECharts 实现一个功能强大的智慧工地数据可视化大屏。 源…

网络基础之(11)优秀学习资料

网络基础之(11)优秀学习资料 Author&#xff1a;Once Day Date: 2024年7月27日 漫漫长路&#xff0c;有人对你笑过嘛… 全系列文档可参考专栏&#xff1a;通信网络技术_Once-Day的博客-CSDN博客。 参考文档&#xff1a; 网络工程初学者的学习方法及成长之路&#xff08;红…

C#港澳台通行证识别接口、台胞证识别、ocr证件识别

在这个快节奏的时代&#xff0c;效率至上&#xff0c;每一秒都弥足珍贵。想象一下&#xff0c;无需手动输入繁琐的证件信息&#xff0c;仅需轻轻一扫&#xff0c;证面上所有文字信息便可呈现在眼前将是多么的便利&#xff0c;这得益于文字识别技术衍生下的-证件识别接口&#x…

Python | TypeError: ‘function’ object is not subscriptable

Python | TypeError: ‘function’ object is not subscriptable 在Python编程中&#xff0c;遇到“TypeError: ‘function’ object is not subscriptable”这一错误通常意味着你尝试像访问列表、元组、字典或字符串等可订阅&#xff08;subscriptable&#xff09;对象那样去…

Unity顶点动画(Vertex Animation):创造动态视觉效果

在Unity中&#xff0c;顶点动画(Vertex Animation)是一种强大的技术&#xff0c;它允许开发者直接在顶点级别上操作和变形网格&#xff0c;从而实现各种动态视觉效果。顶点动画不依赖于骨骼绑定&#xff0c;因此非常适合模拟布料、流体、面部表情等复杂的动画效果。本文将探讨顶…

搭建基于 ChatGPT 的问答系统第五章-思维链推理

需要学习提示词工程的同学请看面向开发者的提示词工程 前几章内容请查看 搭建基于 ChatGPT 的问答系统第一章-综述 搭建基于 ChatGPT 的问答系统第二章-提问范式与Token 搭建基于 ChatGPT 的问答系统第三章-评估输入分类 搭建基于 ChatGPT 的问答系统第四章-检查输入审核 第五…

Visual Studio Code + vue快速安装配置Node.js+Vue+webpack+vscode

第一部分&#xff1a;Node.js 第一步&#xff1a;下载Node.js 方法1&#xff1a;链接 下载 | Node.js 中文网 (nodejs.cn) 方法2&#xff1a;百度网盘 链接&#xff1a;https://pan.baidu.com/s/1zIqu8H9rb_I1i-1OWD7swQ?pwdaurk 提取码&#xff1a;aurk --来自百度网盘…

基于FPGA + Qt + OpenCv的人脸考勤系统

一:界面设计 客户端界面设计: 服务端界面设计: 简介:首先服务端在注册界面先注册人脸,然后客户端界面进行人脸识别,将人脸识别的图像发送给服务端以后,服务端在图像数据库里寻找人脸比对,若有数据就将查询到的个人信息发送给客户端,并在客户端显示,查询界面是用来查…