vue2 打印标签功能 用于10cm*10cm纸张

1:例图如下 (html布局可自定义修改)

2:代码如下(大致的思路是 打印时 先把打印的区域转换成图片,然后在用printJS打印出图片,这样布局和样式就不会丢失。)

html2canvas:中文网址(更多属性和方法可查看官网)

print-js:官方网址(更多属性和方法可查看官网)

我用的版本,不需要 (vue-qr:二维码)的可不用安装

npm install html2canvas@1.4.1

npm install print-js@1.6.0

npm install vue-qr@4.0.9

javascript 复制代码
<template>
  <div >
    <el-button type="primary" @click="printBtn">打印按钮</el-button>
    <div  style="text-align:center;">
     <img v-if="imageUrl" :src="imageUrl" style="width: 400px;" />
    <div v-else="!imageUrl" ref="materialCard" class="material-card">
      
    <h2 class="card-title">标识卡</h2>
    <table>
      <tr>
        <td>编码</td>
        <td colspan="2" class="contentText">{{ materialCode }}</td>
        <td>名称</td>
        <td colspan="2" class="contentText">{{ materialName }}</td>
        
      </tr>
      <tr>
        <td>规格</td>
        <td colspan="2" class="contentText">{{ specification }}</td>
        <td>型号/合金</td>
        <td colspan="2" class="contentText">{{ model }}</td>
      </tr>
      <tr>
        <td>项目</td>
        <td colspan="2" class="contentText"></td>
        <td>供应商</td>
        <td colspan="2" class="contentText"></td>
      </tr>
      <tr>
        <td>数量/重量</td>
        <td colspan="2" class="contentText">{{ quantity }}</td>
        <td colspan="2" rowspan="5" class="qr-code-cell">
          <vue-qr
          ref="qrCode"
          text="10245787878788"          
          style="width: 100%;height: -webkit-fill-available;"
        ></vue-qr>
        </td>
      </tr>
      <tr>
        <td>料框编号</td>
        <td colspan="2" class="contentText"></td>
      </tr>
      <tr>
        <td>批次号</td>
        <td colspan="2" class="contentText">{{ batchNumber }}</td>
      </tr>
      <tr>
        <td>订单号</td>
        <td colspan="2" class="contentText"></td>
      </tr>
      <tr>
        <td>生产日期</td>
        <td colspan="2" class="contentText">{{ productionDate }}</td>
      </tr>
    </table>
  </div>
    </div>
    
  </div>
</template>

<script>
//html转换成图片
import html2canvas from 'html2canvas';
//打印插件
import printJS from "print-js";
//二维码
import VueQr from "vue-qr";
export default {
  computed: {
    
  },
  created () {
  },
  mounted () {
  },
  data () {
    return {
      imageUrl: "",
      materialCode: '14-03565-460',
      materialName: 'PN8-C边框一',
      specification: '4600mm',
      model: 'ND-3565/6061',
      quantity: '10PCS/276KG',
      batchNumber: 'J2405013Ab04001-121',
      productionDate: '2024-06-26',
      
    }
  },
  
  components: {    
    
  },
  methods: {
    
    async printBtn() {
      const scale = 20;
      html2canvas(this.$refs.materialCard, {
        scale: scale,
        windowWidth: this.$refs.materialCard.scrollWidth * scale,
        windowHeight: this.$refs.materialCard.scrollHeight * scale
      }
      ).then(canvas => {
        this.imageUrl = canvas.toDataURL('image/png');
        this.printPDF();
      }).catch(error => {
        console.error('生成图片失败:', error);
        // 可以在这里添加错误处理,比如显示错误消息给用户
      });
    },
    
   
   
    
    async printPDF() {
      
      printJS({
        printable: this.imageUrl, // 标签元素id
        type: "image",
        style: `
            @page { size: auto; margin: 0mm; }
            @media print {
              img { max-width: 100%; height: auto; }
            }
          `
      });
      
    },
  }
}
</script>
<style  >

.material-card {
  width: 400px; /* 增加宽度以适应更多列 */
  border: 1px solid black;
  padding: 10px;
  font-family: Arial, sans-serif;
  margin: 0 auto;
}

.card-title {
  text-align: center;
  margin-bottom: 10px;
  font-weight: bold;
  font-family: "黑体";
  font-size: 14px;
}

table {
  width: 100%;
  border-collapse: collapse;
}

td {
  border: 1px solid black;
  padding: 5px;
  height: 25px; /* 设置一个固定高度使行高一致 */
  font-size: 12px;
    font-weight: 800;
    font-family: "黑体";

}
.contentText{
  font-family: "仿宋";
  
}
.qr-code-cell {
  
  vertical-align: middle;
  text-align: center;
}

.qr-code {
  max-width: 100%;
  max-height: 100%;
  object-fit: contain;
}
</style>

3:如果取消了打印,图片会把html覆盖,这样就不能进行复制操作;

解决办法1:是把图片定位到html下面,层级为-1(需要有背景色,可以设置成白色,不然会重叠),然后把v-if 改成v-show 。

解决办法2:是把图片设置透明,然后把v-if 改成v-show。

4:关闭页面或者关闭弹窗时记得把imageUrl 及时清空。 撒花 *★,°*:.☆( ̄▽ ̄)/$:*.°★* 。

相关推荐
counterxing2 小时前
我整理了一个免费开发资源目录,还做成了 CLI 和 MCP
前端·agent·ai编程
子兮曰9 小时前
Bun v1.3.14 深度解析:Image API、HTTP/3、全局虚拟存储与五十项变革
前端·后端·bun
kyriewen10 小时前
今天,百年巨头一次砍了9200人,而一个离职科学家的实话让全网睡不着觉
前端·openai·ai编程
问心无愧051310 小时前
ctf show web 入门42
android·前端·android studio
kyriewen11 小时前
老板逼我上AI,我偷偷在浏览器里跑LLaMA,省下20万API费
前端·react.js·llm
Beginner x_u11 小时前
前端八股整理(手写 02)|数组转树、数组扁平化、随机打乱一个数组
前端·数组·数组转树·数组扁平化
KaMeidebaby11 小时前
卡梅德生物技术快报|禽类成纤维细胞 FISH 实验:鸟类性别染色体基因定位技术实现与数据验证
前端·数据库·其他·百度·新浪微博
天若有情67311 小时前
前端高阶性能优化:跳出传统懒加载与预加载,基于用户行为做轻量预判加载
前端·性能优化
小小小小宇11 小时前
前端转后端:SQL 是什么
前端
张元清12 小时前
React Observer Hooks:7 种监听 DOM 而不写样板代码的方式
前端·javascript·面试