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>

四、效果图

相关推荐
老华带你飞17 小时前
茶叶商城|基于SprinBoot+vue的茶叶商城系统(源码+数据库+文档)
java·前端·javascript·数据库·vue.js·spring boot
烛阴17 小时前
不只是Public与Private:C#访问修饰符全方位解读
前端·c#
涔溪17 小时前
Vue3常用的组合式API 超详细讲解
前端·javascript·vue.js
秋邱17 小时前
AR + 离线 AI 实战:YOLOv9+TensorFlow Lite 实现移动端垃圾分类识别
开发语言·前端·数据库·人工智能·python·html
蜡笔小嘟17 小时前
使用gemini 3 pro实现可视化大屏
前端·ai·gemini·gemini3peo
马玉霞17 小时前
vue3很丝滑的table表格向上滚动效果,多用于统计页面
前端·vue.js
用户9520816117917 小时前
百度地图JSAPI THREE Label 组件使用指南,轻松实现地图标签渲染
前端
SVIP1115917 小时前
webpack入门 精细版
前端·webpack·node.js
畅畅畅哥哥17 小时前
Next.js App Router 实战避坑:状态、缓存与测试
前端·前端框架
一水鉴天17 小时前
整体设计 定稿 之20 拼语言表述体系之3 dashboard.html完整代码
java·前端·javascript