vue3 + antd + print-js 实现打印功能(含输出PDF)

一、背景:在中后台系统中有时需要实现合同打印(包含连接物理打印机、输出PDF等)

二、print-js安装

npm i print-js

三、代码实现

javascript 复制代码
<template>
  <div class="print-container">
    <!-- 打印按钮 -->
    <a-button type="primary" @click="handlePrint">
      <PrinterOutlined />
      打印
    </a-button>

    <!-- 打印区域 - 只有这个区域的内容会被打印 -->
    <div id="printContent" class="print-area">
      <h2>员工信息表</h2>
      <!-- Antd表格组件 -->
      <a-table 
        :dataSource="data" 
        :columns="columns" 
        :pagination="false"
        size="small"
      >
        <template #footer>共 {{ data.length }} 条记录</template>
      </a-table>
    </div>
  </div>
</template>

<script setup>
import { ref } from 'vue';
import { Button, Table } from 'ant-design-vue';
import { PrinterOutlined } from '@ant-design/icons-vue';
import printJS from 'print-js';

// 表格数据
const data = ref([
  { key: '1', name: '张三', age: 25, department: '技术部' },
  { key: '2', name: '李四', age: 30, department: '市场部' },
]);

// 表格列配置
const columns = ref([
  { title: '姓名', dataIndex: 'name' },
  { title: '年龄', dataIndex: 'age' },
  { title: '部门', dataIndex: 'department' }
]);

// 打印功能
const handlePrint = () => {
  printJS({
    printable: 'printContent',     // 指定要打印的DOM元素ID
    type: 'html',                  // 打印类型为HTML
    scanStyles: false,             // 关键:禁用样式扫描,使用组件内的@media print样式
  });
};
</script>

<style scoped>
/* 屏幕显示样式 */
.print-container {
  padding: 20px;
}

.print-area {
  margin-top: 20px;
  padding: 20px;
  border: 1px solid #d9d9d9;
  background: white;
}

/* 打印媒体查询 - 只在打印时生效 */
@media print {
  /* 隐藏打印按钮和其他非打印元素 */
  .print-container > button {
    display: none;
  }
  
  /* 打印页面整体设置 */
  body { 
    margin: 10mm;                   /* 设置打印边距 */
    font-family: "Microsoft YaHei", sans-serif; /* 设置打印字体 */
  }
  
  /* 打印区域样式调整 */
  .print-area {
    margin: 0;                      /* 去除外边距 */
    padding: 0;                     /* 去除内边距 */
    border: none;                   /* 去除边框 */
  }
  
  /* 标题打印优化 */
  h2 { 
    text-align: center;             /* 标题居中 */
    color: #000;                    /* 确保黑色打印 */
  }
  
  /* 深度选择器:影响Antd子组件样式 */
  :deep(.ant-table) {
    border: 1px solid #000;         /* 表格边框 */
  }
  
  :deep(.ant-table-thead > tr > th) {
    background: #f5f5f5 !important; /* 表头背景色 */
  }
}
</style>

四、效果图

相关推荐
Dxy12393102167 分钟前
HTML中的伪类详解:从基础到高级应用的全面指南
前端·html
Dxy12393102169 分钟前
HTML中如何设置元素样式:从基础到进阶的完整指南
前端·html
村头的猫12 分钟前
JWT 令牌的工作原理,结构和签名验证
前端·数据库·经验分享·微服务
pe7er4 小时前
window管理开发环境篇 - 持续更新
前端·后端
We་ct5 小时前
LeetCode 5. 最长回文子串:DP + 中心扩展
前端·javascript·算法·leetcode·typescript
陈随易9 小时前
有生之年系列,Nodejs进程管理pm2 v7.0发布
前端·后端·程序员
冰暮流星9 小时前
javascript之事件代理/事件委托
前端
@yanyu66610 小时前
登录注册功能-明文
vue.js·springboot
陈随易10 小时前
AI时代,你还在坚持手搓文章吗
前端·后端·程序员
里欧跑得慢13 小时前
17. Flutter Hero动画实现:让界面过渡更加优雅
前端·css·flutter·web