vue-print-nb 打印相关问题

一、背景与解决方案

1、ElementUI表格打印通病,均面临边框丢失、宽度超出问题:相关解决代码有注释;

2、大多数情况下不会打印页眉页脚的日期、网址、未配置popTitle显示的undefined:相关解决代码有注释;

3、打印预览页面不显示背景色:相关解决代码有注释;

4、客户希望打印预览页面显示登录用户信息水印,前端页面不显示水印:使用vue2-water-marker组件,并根据用户操作控制水印组件显示变量;

5、打印预览页面表头单元格与表体单元格右边框错位:隐藏表头,将表头作为表体第一行数据,并将样式与表头样式统一;表头只有一层且只有一个分组,所以将组名直接写为html元素,放于表格上方,并将样式与表头样式统一。

二、代码示例

javascript 复制代码
<template>
    <div>
        <el-button type="primary" size="mini" icon="el-icon-printer" v-print="printConfig" @click="handlePrint">打印</el-button>
        <div id="printContent">
            <!-- 打印页面水印,行内样式是为了解决打印页面不显示背景色的问题 -->
            <!-- text: 水印内容,根据需求设置,opacity: 水印内容透明度,0~1之间,越大越清晰 -->
            <vue2-water-marker v-if="showWaterMask" text="打印水印" :opacity="0.8" :zIndex="9999" style="-webkit-print-color-adjust: exact"></vue2-water-marker>
            <div class="table-title">分组表头</div>
            <el-table :data="dataSource" :row-style="rowStyle" size="mini" :show-header="false" border style="width: 100%;">
                <el-table-column
                    prop="index"
                    label="序号"
                    algin="center"
                    width="70">
                </el-table-column>
                <el-table-column
                    prop="name"
                    label="姓名"
                    width="180">
                </el-table-column>
                <el-table-column
                    prop="sex"
                    label="性别"
                    width="180">
                </el-table-column>
                <el-table-column
                    prop="height"
                    label="身高"
                    width="180">
                </el-table-column>
            </el-table>
        </div>
    </div>
</template>
<script>
import print from 'vue-print-nb'

export default {
    directives: {
        print   
    },
    data () {
        return {
            showWaterMask: false,
            printConfig: {
                id: 'printContent',
                closeCallback: () => {
                    this.showWaterMask = false; //关闭时不显示水印
                }
            },
            dataSource: [
                {
                    index: '序号',
                    name: '姓名',
                    sex: '性别',
                    height: '身高'
                },
                {
                    index: '1',
                    name: '张三',
                    sex: '男',
                    height: 180
                },
                {
                    index: '2',
                    name: '李四',
                    sex: '女',
                    height: 160
                }
            ]
        }
    },
    methods: {
        rowStyle ({rowIndex}) { //将表体数据第一行显示样式调整为与表头样式一致
            return rowIndex===0?{
                backgroundColor: '#F5F7FA',
                fontWeight: 'bold',
                color: '#909399',
                webkitPrintColorAdjust: 'exact' //解决打印页面"表头"不显示背景色的问题
            }:{};
        },
        handlePrint () {
            if(this.userName) {
                this.showWaterMask = true;
            }
        }
    }
}
</script>
<style scoped lang="less">
#printContent>.table-title {
    padding: 10px 0;
    background-color: #F5F7FA;
    border: 1px solid #CCC;
    border-bottom: none;

    font-size: 12px;
    font-weight: bold;
    vertical-align: middle;
    text-align: center;
    color: #909399;
}
</style>
<!-- 打印预览页面样式 -->
<style scoped media="print" lang="less">
@page {
    size: auto;
    margin: 3mm;
}
@media print {
    html {
        margin: 0px;
        height: auto;
        background-color: #FFF;
    }
    body {
        border: 1px solid #FFF;
        margin: 10mm 15mm 10mm 15mm;
    } //以上代码解决打印页面页眉页脚显示日期、网址、undefined问题

    #printContent>.table-title {
        width: calc(100% - 2px);
        border-bottom: 1px solid #CCC;
        -webkit-print-color-adjust: exact; //解决打印页面分组表头不显示背景色的问题
    }

    // 解决打印页面表格宽度超出预览区域问题
    /deep/ table {
        table-layout: auto !important;
    }
    /deep/ #printContent table {
        table-layout: fixed !important;
    }
    /deep/ .el-table__body-wrapper .el-table__body {
        width: 100% !important;
        border-right: 1px solid #CCC !important; //解决打印页面表格右边框不显示的问题
    }
}
</style>

二、涉及问题

相关推荐
fanruitian4 小时前
uniapp android开发 测试板本与发行版本
前端·javascript·uni-app
rayufo4 小时前
【工具】列出指定文件夹下所有的目录和文件
开发语言·前端·python
RANCE_atttackkk4 小时前
[Java]实现使用邮箱找回密码的功能
java·开发语言·前端·spring boot·intellij-idea·idea
2501_944525545 小时前
Flutter for OpenHarmony 个人理财管理App实战 - 支出分析页面
android·开发语言·前端·javascript·flutter
李白你好6 小时前
Burp Suite插件用于自动检测Web应用程序中的未授权访问漏洞
前端
刘一说7 小时前
Vue 组件不必要的重新渲染问题解析:为什么子组件总在“无故”刷新?
前端·javascript·vue.js
徐同保8 小时前
React useRef 完全指南:在异步回调中访问最新的 props/state引言
前端·javascript·react.js
fanruitian8 小时前
uniapp 创建项目
javascript·vue.js·uni-app
刘一说8 小时前
Vue 导航守卫未生效问题解析:为什么路由守卫不执行或逻辑失效?
前端·javascript·vue.js
一周七喜h9 小时前
在Vue3和TypeScripts中使用pinia
前端·javascript·vue.js