当前位置:首页 » 《资源分享》 » 正文

Vue3+TypeScript+printjs 实现标签批量打印功能

7 人参与  2024年09月20日 11:23  分类 : 《资源分享》  评论

点击全文阅读


前言:临时性需求没怎么接触过前端,代码实现有问题及优化点希望大佬可以留言告知一下

开发工具:VS CODE

界面开发:Vue3+TypeScript+ElementPlus

打印组件:Print-JS

前端打印入口图:

标签页面:

打印界面:

实现功能:前端点击"打印标签"弹出打印界面进行打印作业

实现过程:主界面点击"打印标签"调用el-dialog弹窗(预览和直接打印都居于弹窗实现)

  标签模板代码:

<template>    <div class="LabelPrint-List">        <el-dialog v-model="state.isShowDialog" draggable :close-on-click-modal="false" width="50%" >            <template #header><div style="color: #fff"><el-icon size="16" style="margin-right: 3px; display: inline; vertical-align: middle"> <ele-Edit/> </el-icon><span>标签打印界面</span></div></template>            <el-row :gutter="10">                <el-col :xs="24" :sm="24" :md="24" :lg="24" :xl="24" class="mb10">                     <div v-for="item in state.Datas">                        <el-card class="box-card" style="width:100mm; height: 90mm;display: block;" >                            <div :id='item.id?.toString()'>                                <!-- print-js -->                                <div class="labelHeadBody">                                    <div class="labelHeadBodyLeftHead">                                        <img class="labelHeadBodyLeftHeadimage"  src="/image/点金log.png" fit="fill" />                                    </div>                                    <div class="labelHeadBodyRightHead">                                        <table class="tableHead">                                            <tr>                                                <td class="labelHeadBodyRightHeadTd">某某有限公司</td>                                            </tr>                                            <tr>                                                <td class="labelHeadBodyRightHeadTd">物料标识卡</td>                                            </tr>                                        </table>                                    </div>                                </div>                                <div class="labelBody">                                     <table>                                        <tbody>                                            <tr><td class="lableBodytdleft">P/N:</td><td class="lableBodytdright">{{ item.produceNo }}</td></tr>                                            <tr><td class="lableBodytdleft">数量:</td><td class="lableBodytdright">{{ item.quantity }}</td></tr>                                            <tr><td class="lableBodytdleft">规格:</td><td class="lableBodytdright lableBodytdrightfont">{{ item.platingSpecs }}</td></tr>                                            <tr><td class="lableBodytdleft">供应商:</td><td class="lableBodytdright">东莞点金</td></tr>                                            <tr><td class="lableBodytdleft">生产日期:</td><td class="lableBodytdright">{{moment(String(item.createTime)).format('YYYY/MM/DD')}}</td></tr>                                            <tr><td class="lableBodytdleft">批次单号:</td><td class="lableBodytdright">{{ item.lot }}</td></tr>                                            <tr><td class="lableBodytdleft">单重:</td><td class="lableBodytdright">{{ item.singleWeight }}</td></tr>                                            <tr><td class="lableBodytdleft">总重:</td><td class="lableBodytdright">{{ item.sumWeight }}</td></tr>                                            <tr><td class="lableBodytdleft">标识人:</td><td class="lableBodytdright"></td></tr>                                        </tbody>                                     </table>                                </div>                                                            </div>                        </el-card>                     </div>                </el-col>            </el-row>            <template #footer><span class="dialog-footer"><el-button @click="cancel">取 消</el-button>                    <el-button style="background-color:red;color:white" @click="print">打 印</el-button></span></template>         </el-dialog>    </div></template>

Typescript代码:

printrow 方法中使用nextTick是当el-dialog弹窗DOM加载完成后在调用PrintJS获取需要打印的区域,这个直接打印过程其实会先弹窗然后DOM加载完成后直接调用浏览器打印界面,后面把弹出关闭,如果不加载el-dialog可以通过动态加载html内容来实现直接打印,我这里图方便就用该方法实现了。

printJS({printable:区域id,type:打印类型(pdf\image\html等),style:打印内容的CSS样式})

注意:style参数值按打印区域的HTMLCSS样式构建,调用printJS设置scanStyles:false不会自动加载HTML的CSS样式需要重新给Style参数赋值所以增加了一个printStyle函数,scanStyles默认值是true(会导致打印界面的内容奇奇怪怪,还没去了解详细原因哈哈哈哈)

<script lang="ts" setup>import { ref,reactive,nextTick } from 'vue';import { TbProduceOrderNoInfo } from '/@/api-services';import printJS from 'print-js';import moment from 'moment';const props=defineProps({    title:String})const state=reactive({    isShowDialog:false,    Datas:[] as Array<TbProduceOrderNoInfo>,})const emits = defineEmits(['handleQuery']);const closeDialog=()=>{    emits('handleQuery');    state.isShowDialog=false;}const cancel=()=>{    state.isShowDialog=false;    closeDialog();}//预览+打印const openDialog=async(row:any)=>{      state.Datas=JSON.parse(JSON.stringify(row));   state.isShowDialog=true;}const print=()=>{   for(var i=0;i<state.Datas.length;i++){      printJS({printable:`${state.Datas[i].id}`,type:"html",style:printStyle(),scanStyles:false})   }}//直接打印不预览const printrow=async(row:any)=>{    state.Datas=JSON.parse(JSON.stringify(row));    state.isShowDialog=true;    //主界面form DOM加载完成    nextTick(()=>{            //弹窗加载完成            nextTick(()=>{                printJS({printable:`${state.Datas[0].id}`,type:"html",style:printStyle(),scanStyles:false})                state.isShowDialog=false;            })        })}//打印界面的CSS样式const printStyle=()=>{    return `.labelHeadBody{    display: flex;justify-content:space-between;margin: 0; font-size: 16px;width: 100%; height:45px}.labelHeadBodyLeftHead{    width: 30px;}.labelHeadBodyRightHead{    width: 250px; height: 70px;display: flex;justify-content: center;}.lableBodytdrightfont{    font-size:10px}.labelHeadBodyRightHeadTd{    padding: 0;    font-size: 14px;    font-weight: bold;    text-align: center;    vertical-align: middle;}.labelBody{    margin-left: 5px;    margin-right: 5px;}.lableBodytdleft{    width: 30%;    font-weight: bold;    vertical-align: bottom;   }.lableBodytdright{    width: 70%;     border-bottom: 1px solid;}.labelHeadBodyLeftHeadimage{    width: 70px; height: 40px}.tableHead{    height: 20px;}    `;}//预览、直接打印defineExpose({openDialog,printrow})</script>

标签前端样式代码:

<style>.labelHeadBody{    display: flex;justify-content:space-between;margin: 0; font-size: 16px;width: 100%;}.labelHeadBodyLeftHead{    width: 30px;}.labelHeadBodyRightHead{    width: 250px; height: 70px;display: flex;justify-content: center;}.labelHeadBodyRightHeadTd{    padding: 0;    font-size: 14px;    font-weight: bold;    text-align: center;    vertical-align: middle;}.labelBody{    margin-top: 10px;    margin-left: 5px;    margin-right: 5px;}.lableBodytdleft{    width: 30%;    font-weight: bold;    vertical-align: bottom;   }.lableBodytdright{    width: 75%;     border-bottom: 1px solid;}.labelHeadBodyLeftHeadimage{    width: 80px; height: 55px}.tableHead{    height: 20px;}</style>

最后,如果需要带二维码的同学可以添加qrcode组件,以下是简单的实现(el-image、img标签中图片不显示的问题还没解决,迂回操作直接把生成的二维码图片设置成控件背景来处理,囧.........):

<template #default="scope">                         <div :style="createQrcode(scope.row.eqNo)" ></div>                          <!-- <el-image :scr="createQrcode1(scope.row.eqNo)" style="width: 60px;height: 60px;"></el-image> --></template>import QRCode from 'qrcode'//将生成的二维码设置成div的Style,不知道为嘛el-image绑定base64image图片不显示const createQrcode=(text:string)=>{    if(text==""||text==undefined||text==null) return "";    let url1:any;    url1="";      QRCode.toDataURL(text,(err,url)=>{        if(err){            console.error(err);        }        else{            url1=url;        }    })    return `background-image: url(${url1});background-position: center center;background-size: contain;background-repeat: no-repeat;;width:100%;height:60px`;}


点击全文阅读


本文链接:http://zhangshiyu.com/post/162113.html

<< 上一篇 下一篇 >>

  • 评论(0)
  • 赞助本站

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。

最新文章

  • 祖母寿宴,侯府冒牌嫡女被打脸了(沈屿安秦秀婉)阅读 -
  • 《雕花锦年,昭都旧梦》(裴辞鹤昭都)完结版小说全文免费阅读_最新热门小说《雕花锦年,昭都旧梦》(裴辞鹤昭都) -
  • 郊区41号(许洛竹王云云)完整版免费阅读_最新全本小说郊区41号(许洛竹王云云) -
  • 负我情深几许(白诗茵陆司宴)完结版小说阅读_最热门小说排行榜负我情深几许白诗茵陆司宴 -
  • 九胞胎孕妇赖上我萱萱蓉蓉免费阅读全文_免费小说在线看九胞胎孕妇赖上我萱萱蓉蓉 -
  • 为保白月光,侯爷拿我抵了债(谢景安花田)小说完结版_完结版小说全文免费阅读为保白月光,侯爷拿我抵了债谢景安花田 -
  • 陆望程映川上官硕《我的阿爹是带攻略系统的替身》最新章节阅读_(我的阿爹是带攻略系统的替身)全章节免费在线阅读陆望程映川上官硕
  • 郑雅琴魏旭明免费阅读_郑雅琴魏旭明小说全文阅读笔趣阁
  • 头条热门小说《乔书意贺宴临(乔书意贺宴临)》乔书意贺宴临(全集完整小说大结局)全文阅读笔趣阁
  • 完结好看小说跨年夜,老婆初恋送儿子故意出车祸_沈月柔林瀚枫完结的小说免费阅读推荐
  • 热推《郑雅琴魏旭明》郑雅琴魏旭明~小说全文阅读~完本【已完结】笔趣阁
  • 《你的遗憾与我无关》宋怀川冯洛洛无弹窗小说免费阅读_免费小说大全《你的遗憾与我无关》宋怀川冯洛洛 -

    关于我们 | 我要投稿 | 免责申明

    Copyright © 2020-2022 ZhangShiYu.com Rights Reserved.豫ICP备2022013469号-1