el-table打印PDF预览,表头错位的解决方案

文章目录

  • 背景与需求
  • 需求分析
  • 解决方案
    • 方案一:vue-print-nb插件
      • 安装
      • 引入
      • 使用
    • 方案二
      • 安装
      • 使用
    • 方案三
  • 总结

背景与需求

本例以vue2项目为例,vue3与react等同理。

有个项目需要打印的功能,网页使用vue2写的,主体内容为表格el-table,添加某个按钮,点击按钮时弹出PDF打印预览,示例如下:
在这里插入图片描述

需求分析

通常我们会使用vue-print-nb组件,通过一些配置即可实现需求,但是会出现一些奇怪的bug,比如:

  • 表头错位
  • 首页尾页多出一页
  • 边框线不显示
  • 表格的边框1px不会不显示的问题
  • 某些边框变粗了……

以上问题会在下面解决!

解决方案

方案一:vue-print-nb插件

vue-print-nb是vue项目中用的比较广泛的打印预览插件,其npm地址如下:

vue-print-nb文档(https://www.npmjs.com/package/vue-print-nb)

安装

npm install vue-print-nb --save

引入

main.js中引入并注册插件:

import Print from 'vue-print-nb'
Vue.use(Print)

使用

在需要的vue组件中使用:

<template><div class="app-container"><el-button type="primary" size="medium" v-print="printObj">报表打印</el-button><div id="printArea" ref="gatprintArea">打印区域,内容自定义</div></div>
</template><script>export default {data() {return {printObj: {id: 'printArea', // 这里是要打印元素的IDpopTitle: '&nbsp', // 打印的标题},};},};
</script>

通过上述代码,我们可以实现打印并预览PDF的效果,但是实际应用中会出现之前说的问题。
原图:在这里插入图片描述
预览效果图:
在这里插入图片描述
可以看到,没有把完整的表格区域打印出来,而且表格的很多边框线没显示,我们给它添加一些样式,先让它能完整的打印出来:

  ::v-deep table {table-layout: auto;}::v-deep .el-table__header-wrapper .el-table__header {width: 100% !important;}::v-deep .el-table__body-wrapper .el-table__body {width: 100% !important;}::v-deep .el-table .cell.el-tooltip {text-overflow: clip;white-space: normal;min-width: none;width: auto !important;border: none !important;}

添加完样式之后,表格能完整的显示出来了,效果如下:
在这里插入图片描述
但是边框线还是不显示,再加一些样式如下:

  @page{size:  auto;margin-bottom: 0; //去掉页脚}@media print{body {margin: 0;padding: 0;}#printArea {page-break-inside: avoid;}::v-deep .el-table th.gutter {display: table-cell !important;}// 设置表格边框样式::v-deep table {//table-layout: auto;border: 1px solid #dfe6ec !important;border-color: #dfe6ec !important;//border-collapse: collapse;font-size: 12px !important;td {border-right: 1px solid  #dfe6ec !important;border-bottom: 1px solid  #dfe6ec !important;}tbody {border-left: 1px solid  #dfe6ec !important;}th {border: 1px solid #dfe6ec !important;border-bottom: none !important;width: auto !important;}.cell {padding: 0 !important;}}::v-deep thead tr th {border-right: 0 !important;}// 清除原来的边框样式::v-deep .el-table--border::after,.el-table--group::after,.el-table::before {background-color: transparent;}::v-deep .el-table th {border-bottom: 1px solid #dfe6ec;background: #F5F7FA !important;}::v-deep {.el-table--border::after {display: none !important;}.el-table__header {border: 0 !important;.gutter {width: 0 !important;}}thead tr:nth-child(1) th:nth-child(1) {border-left: 0 !important;}}}

现在可以看到,边框线经过处理后,基本都能显示出来了,但是还有表头错位的问题没有解决,这是因为预览时,表格自动计算的宽度会存在误差,且目前无法避免(即使没有多级表头),效果如下:
在这里插入图片描述
既然这样会存在一点问题,那么我们只能试试第二种方案了。

方案二

html2canvasprint-js结合,其原理是先把需要打印的内容转化为图片,然后打印预览图片,这样就不会出现表头错位的问题了。

安装

npm install --save html2canvas
npm install --save print-js

使用

示例代码如下:

<template><div class="app-container"><el-button type="primary" size="medium" @click="onPrint">报表打印</el-button><div id="printArea" ref="gatprintArea">打印区域,内容自定义</div></div>
</template><script>import html2canvas from "html2canvas";
import printJS from "print-js";
export default {methods: {// 方案二,这种方法不会错位onPrint() {const printContent = this.$refs.gatprintArea; //获取上面的ref对应的组件实例// 获取dom 宽度 高度const width = printContent.clientWidth + 2; //如果有边框可适当增加2~10之间的画布大小const height = printContent.clientHeight + 2;//如果有边框可适当增加2~10之间的画布大小// 创建一个canvas节点const canvas = document.createElement('canvas');const scale = 1; // 定义任意放大倍数,支持小数;越大,图片清晰度越高,生成图片越慢。canvas.width = width * scale; // 定义canvas 宽度 * 缩放canvas.height = height * scale; // 定义canvas高度 *缩放canvas.style.width = width * scale + 'px';canvas.style.height = height * scale + 'px';canvas.getContext('2d').scale(scale, scale); // 获取context,设置scaleconst scrollTop = document.documentElement.scrollTop || document.body.scrollTop; // 获取滚动轴滚动的长度const scrollLeft = document.documentElement.scrollLeft || document.body.scrollLeft; // 获取水平滚动轴的长度html2canvas(printContent, {canvas,// backgroundColor: null,useCORS: true,windowHeight: document.body.scrollHeight,scrollX: -scrollLeft, // 解决水平偏移问题,防止打印的内容不全scrollY: -scrollTop}).then((myCanvas) => {const url = myCanvas.toDataURL('image/png')printJS({printable: url,type: 'image',documentTitle: '', // 标题style: '@page{size:auto;margin: 0.5cm 1cm 0cm 1cm;}' // 去除页眉页脚})}).catch(err => {console.error(err);})}}
};
</script>

可以从下图看到,虽然显示效果没有方案一的好,但是实现了功能,示例图如下:
在这里插入图片描述
如果打印的内容超过一页,会在收尾出现空白页,可添加样式如下:

printJS({printable: url,type: 'image',documentTitle: '', // 标题style: '@page{size:auto;margin: 0.5cm 1cm 0cm 1cm;}body{margin:0}' // 去除页眉页脚
})

至此,本方案成功解决需求

方案三

看了网友的一个方案,就是把表头隐藏起来:show-header="false" ,把表头放到表格内容中,再稍微调整一下样式,这样就不会出现错位了,因为表头和内容自动分配宽度,也页面内可以正确对齐,但是打印时又计算了,其他因素影响导致错位的。
在这里插入图片描述

总结

方案一显示下过好,但是表头错位问题无法解决,如果不涉及el-table表头,打印预览其他内容时,本方案很推荐
如果方案一无法解决,那么就用方案二
如果表格简单,也可以用方案三

如果有更好的解决方案,欢迎评论!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/491615.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

uniapp炫酷导航按钮及轮播指示器组件

一个拥有炫酷动效的导航按钮和指示器uniapp组件&#xff0c;帮你构建更炫酷的官网、宣传页、产品介绍等页面。 目前测试了vue2语法在h5和微信小程序的适配&#xff0c;其他平台理论上也能用。 下载及使用方法地址&#xff1a;iliya-desgin 展示&#xff1a; 目标页面出现在可视…

SAM大模型实践(一)

参考着segment-geospatial 项目主页的介绍&#xff0c;尝试复现一下Example-satallite的案例。 Satellite - segment-geospatialhttps://samgeo.gishub.org/examples/satellite/ 过程当中遇到了一些坑给大家做点分享&#xff0c;主要有几种情况&#xff0c;一个是torch…

如何为IntelliJ IDEA配置JVM参数

在使用IntelliJ IDEA进行Java开发时&#xff0c;合理配置JVM参数对于优化项目性能和资源管理至关重要。IntelliJ IDEA提供了两种方便的方式来设置JVM参数&#xff0c;以确保你的应用程序能够在最佳状态下运行。本文将详细介绍这两种方法&#xff1a;通过工具栏编辑配置和通过服…

解决电脑网速慢问题:硬件检查与软件设置指南

电脑网速慢是许多用户在使用过程中常见的问题&#xff0c;它不仅会降低工作效率&#xff0c;还可能影响娱乐体验。导致电脑网速慢的原因多种多样&#xff0c;包括硬件问题、软件设置和网络环境等。本文将从不同角度分析这些原因&#xff0c;并提供提高电脑网速的方法。 一、检查…

探索Starship:一款用Rust打造的高性能终端

在终端的世界里&#xff0c;效率和美观往往并行不悖。今天&#xff0c;我们要介绍的是一款名为Starship的终端工具&#xff0c;它以其轻量级、高颜值和强大的自定义功能&#xff0c;赢得了众多开发者的青睐。 安装 任选一种方式进行安装 Windows &#x1fa9f; # scoop scoo…

快速启动Go-Admin(Gin + Vue3 + Element UI)脚手架管理系统

Go-Admin 是一个基于 Gin Vue Element UI & Arco Design & Ant Design 的前后端分离权限管理系统脚手架。它包含了多租户支持、基础用户管理功能、JWT 鉴权、代码生成器、RBAC 资源控制、表单构建、定时任务等功能。该项目的主要编程语言是 Go 和 JavaScript。 ps&a…

SEC_ASA 第二天作业

拓扑 按照拓扑图配置 NTP&#xff0c;Server端为 Outside路由器&#xff0c;Client端为 ASA&#xff0c;两个设备的 NTP传输使用MD5做校验。&#xff08;安全 V4 LAB考点&#xff09; 提示&#xff1a;Outside路由器作为 Server端要配置好正确的时间和时区&#xff0c;ASA防…

《深入探究:C++ 在多方面对 C 语言实现的优化》

目录 一、C 在 C 上进行的优化二、C 关键字&#xff08;C 98&#xff09;三、C 的输入输出1. cin 和 cout 的使用2. cin、cout 和 scanf()、printf() 的区别 三、命名空间1. 命名空间的使用2. 嵌套命名空间3. 在多个头文件中使用相同的命名空间 四、函数缺省值1. 缺省值的使用2…

vue3修改elementui-plus的默认样式的几种方法

#创作灵感 今天写vue的前端项目&#xff0c;因为需要去修改elementui-plus中drawer的默认样式&#xff0c;所以刚好将修改步骤记录下来。 一共提供了三种方法&#xff0c;但亲测第二种最好用。 使用第二种是可以无视自己的代码中是否定义了该盒子&#xff0c;因为有时候盒子的…

Fiddler简单使用

Fiddler使用方法 1.作用 接口测试&#xff0c;发送自定义请求&#xff0c;模拟小型的接口测试定位前后端bug&#xff0c;抓取协议包&#xff0c;前后端联调构建模拟测试场景&#xff0c;数据篡改&#xff0c;重定向弱网测试&#xff0c;模拟限速操作&#xff0c;弱网&#xf…

如何通过递延型指标预测项目的长期成果?

递延型指标&#xff08;Deferred Metrics&#xff09;是指那些并不立即反映或直接影响当前操作、决策或行为的指标&#xff0c;而是随着时间的推移&#xff0c;才逐渐显现出影响效果的指标。这类指标通常会在一段时间后反映出来&#xff0c;或者需要一定的周期才能展现其成果或…

SpringCloud微服务实战系列:01让SpringCloud项目在你机器上运行起来

目录 项目选型 项目安装-本地运行起来 软件安装&#xff1a; 项目启动&#xff1a; 总结&答疑 项目选型 软件开发&#xff0c;基本上都不会从0开始&#xff0c;一般都是在其他项目或者组件的基础上进行整合优化迭代&#xff0c;站在巨人肩膀上才能看得更远&#xff0c…

分布式全文检索引擎ElasticSearch-数据的写入存储底层原理

一、数据写入的核心流程 当向 ES 索引写入数据时&#xff0c;整体流程如下&#xff1a; 1、客户端发送写入请求 客户端向 ES 集群的任意节点&#xff08;称为协调节点&#xff0c;Coordinating Node&#xff09;发送一个写入请求&#xff0c;比如 index&#xff08;插入或更…

【Linux 篇】Docker 容器星河与镜像灯塔:Linux 系统下解锁应用部署奇幻征程

文章目录 【Linux 篇】Docker 容器星河与镜像灯塔&#xff1a;Linux 系统下解锁应用部署奇幻征程前言一 、docker上部署mysql1. 拉取mysql镜像2. 创建容器3. 远程登录mysql 二 、docker上部署nginx1. 拉取nginx镜像2. 在dockerTar目录下 上传nginx.tar rz命令3. 创建nginx容器4…

第8章 搬移特性

8.1 搬移函数 模块化是优秀软件设计的核心所在&#xff0c;好的模块化能够让我在修改程序时只需理解程序的一小部分。为了设计出高度模块化的程序&#xff0c;我得保证互相关联的软件要素都能集中到一块&#xff0c;并确保块与块之间的联系易于查找、直观易懂。同时&#xff0c…

「九」HarmonyOS 5 端云一体化实战项目——「M.U.」应用云侧开发云数据库

1 立意背景 M. 代表 “我”&#xff0c;U. 代表 “你”&#xff0c;这是一款用于记录情侣从相识、相知、相恋、见家长、订婚直至结婚等各个阶段美好记忆留存的应用程序。它旨在为情侣们提供一个专属的空间&#xff0c;让他们能够将一路走来的点点滴滴&#xff0c;如初次相遇时…

【计算机网络】lab2 Ethernet(链路层Ethernet frame结构细节)

&#x1f308; 个人主页&#xff1a;十二月的猫-CSDN博客 &#x1f525; 系列专栏&#xff1a; &#x1f3c0;各种软件安装与配置_十二月的猫的博客-CSDN博客 &#x1f4aa;&#x1f3fb; 十二月的寒冬阻挡不了春天的脚步&#xff0c;十二点的黑夜遮蔽不住黎明的曙光 目录 1. …

“从零到一:揭秘操作系统的奇妙世界”【操作系统的发展】

1.手工操作阶段 此时没有OS&#xff0c;用户采用人工操作方式进行。 方式&#xff1a;程序员在纸带机上打孔---计算机读取---结果输出到纸袋机上---程序员取走结果 缺点&#xff1a;耗时长&#xff0c;难度大、用户独占全机、人机速度矛盾导致资源利用率低 2.单批道处理系统 引…

Base64在线编码解码 - 加菲工具

Base64在线编码解码 - 加菲工具 打开网站 加菲工具 选择“Base64 在线编码解码” 或者直接打开https://www.orcc.online/tools/base64 输入需要编码/解码的内容&#xff0c;点击“编码”/“解码”按钮 编码&#xff1a; 解码&#xff1a; 复制已经编码/解码后的内容。

python 配置 oracle instant client

1.问题描述 想用python连接oracle数据库&#xff0c;百度得知需要cx_Oracle这个第三方库 import cx_Oracle# 设置Oracle数据源名称 dsn cx_Oracle.makedsn(host, port, service_nameservice_name)# 创建数据库连接 connection cx_Oracle.connect(userusername, passwordpas…