浏览器打印长table时按页拆分

2023-12-13 02:38

本文主要是介绍浏览器打印长table时按页拆分,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

需求
  1. 浏览器中打印 高度未知的复杂table, 如果不做任何处理,使用 window.print() 打印 则打印中因为不存在断行. 多张纸中不美观. 需要按A4纸高度 拆分table的行进行打印
解决方案
  1. 获取所有的行标签tr元素
  2. 通过循环tr元素 和 getBoundingClientRect 获取 元素与整个table 左上角的距离
  3. 如果距离高度超过了1页纸的高度 则直接在此tr元素前插入一个指定高度的div. 达到分页效果
基础知识
  • 元素查找 document.querySelectorAll
  • CSS 属性选择器
  • CSS 中 px 与 cm 之间的换算关系
  • Element.getBoundingClientRect 函数
  • Node.insertBefore() 节点插入
function splitPage(config){let totalDom = document.getElementById('printDom'); // 需要打印的tableconst {insertDomHeight = '3cm',paperHeight = 29,printPageIds = [], // table元素id 支持多个table 同时打印. } = config;const onePageHeightPixes = Math.ceil(96 * paperHeight / 2.54);   // 一张纸 的高度(像素)// https://developer.mozilla.org/zh-CN/docs/Web/CSS/length  1cm = 96px / 2.54// A4纸 29.7cm 高const { top : totalTop, height : totalHeight  } = totalDom.getBoundingClientRect();let insertHeight = onePageHeightPixes;
for (let item of printPageIds) {const trList = document.querySelectorAll(`tr[data-tr-id*="${item}"]`);if (trList) {trList.forEach((x) => {const nodePosition = x.getBoundingClientRect();const { top, height } = nodePosition;const distance = top + height - totalTop; // 目标元素左下角相对于整个表单左上角的距离;if (distance > insertHeight) {const divHeight = top - insertHeight + height + insertDomHeight;console.log(divHeight);insertDiv(x, divHeight + 'px');insertHeight = insertHeight + onePageHeightPixes;}});}}}function insertDiv(dom, height = '5cm'){if (!dom) {return;}let parent = dom.parentNode;let newNode = document.createElement("div");newNode.style.height = height;parent.insertBefore(newNode, dom);
}

这篇关于浏览器打印长table时按页拆分的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/486860

相关文章

Java实现预览与打印功能详解

《Java实现预览与打印功能详解》在Java中,打印功能主要依赖java.awt.print包,该包提供了与打印相关的一些关键类,比如PrinterJob和PageFormat,它们构成... 目录Java 打印系统概述打印预览与设置使用 PageFormat 和 PrinterJob 类设置页面格式与纸张

MySQL 8 中的一个强大功能 JSON_TABLE示例详解

《MySQL8中的一个强大功能JSON_TABLE示例详解》JSON_TABLE是MySQL8中引入的一个强大功能,它允许用户将JSON数据转换为关系表格式,从而可以更方便地在SQL查询中处理J... 目录基本语法示例示例查询解释应用场景不适用场景1. ‌jsON 数据结构过于复杂或动态变化‌2. ‌性能要

解决1093 - You can‘t specify target table报错问题及原因分析

《解决1093-Youcan‘tspecifytargettable报错问题及原因分析》MySQL1093错误因UPDATE/DELETE语句的FROM子句直接引用目标表或嵌套子查询导致,... 目录报js错原因分析具体原因解决办法方法一:使用临时表方法二:使用JOIN方法三:使用EXISTS示例总结报错原

基于Python实现一个图片拆分工具

《基于Python实现一个图片拆分工具》这篇文章主要为大家详细介绍了如何基于Python实现一个图片拆分工具,可以根据需要的行数和列数进行拆分,感兴趣的小伙伴可以跟随小编一起学习一下... 简单介绍先自己选择输入的图片,默认是输出到项目文件夹中,可以自己选择其他的文件夹,选择需要拆分的行数和列数,可以通过

浏览器插件cursor实现自动注册、续杯的详细过程

《浏览器插件cursor实现自动注册、续杯的详细过程》Cursor简易注册助手脚本通过自动化邮箱填写和验证码获取流程,大大简化了Cursor的注册过程,它不仅提高了注册效率,还通过友好的用户界面和详细... 目录前言功能概述使用方法安装脚本使用流程邮箱输入页面验证码页面实战演示技术实现核心功能实现1. 随机

Java实现自定义table宽高的示例代码

《Java实现自定义table宽高的示例代码》在桌面应用、管理系统乃至报表工具中,表格(JTable)作为最常用的数据展示组件,不仅承载对数据的增删改查,还需要配合布局与视觉需求,而JavaSwing... 目录一、项目背景详细介绍二、项目需求详细介绍三、相关技术详细介绍四、实现思路详细介绍五、完整实现代码

如何在Mac上彻底删除Edge账户? 手动卸载Edge浏览器并清理残留文件技巧

《如何在Mac上彻底删除Edge账户?手动卸载Edge浏览器并清理残留文件技巧》Mac上的Edge账户里存了不少网站密码和个人信息,结果同事一不小心打开了,简直尴尬到爆炸,想要卸载edge浏览器并清... 如果你遇到 Microsoft Edge 浏览器运行迟缓、频繁崩溃或网页加载异常等问题,可以尝试多种方

Python如何将OpenCV摄像头视频流通过浏览器播放

《Python如何将OpenCV摄像头视频流通过浏览器播放》:本文主要介绍Python如何将OpenCV摄像头视频流通过浏览器播放的问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完... 目录方法1:使用Flask + MJPEG流实现代码使用方法优点缺点方法2:使用WebSocket传输视

Python打印对象所有属性和值的方法小结

《Python打印对象所有属性和值的方法小结》在Python开发过程中,调试代码时经常需要查看对象的当前状态,也就是对象的所有属性和对应的值,然而,Python并没有像PHP的print_r那样直接提... 目录python中打印对象所有属性和值的方法实现步骤1. 使用vars()和pprint()2. 使

MySQL的ALTER TABLE命令的使用解读

《MySQL的ALTERTABLE命令的使用解读》:本文主要介绍MySQL的ALTERTABLE命令的使用,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录1、查看所建表的编China编程码格式2、修改表的编码格式3、修改列队数据类型4、添加列5、修改列的位置5.1、把列