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>

四、效果图

相关推荐
xy34539 分钟前
Axure 9.0 中继器创建与设置步骤
前端·ui·html·axure·原型·产品设计
FEF前端团队9 分钟前
01# Vibe Coding工作流设计思维:前端开发者的协作框架
前端·cursor·vibecoding
计算机魔术师17 分钟前
OpenAI 发布模型错位报告框架,披露未发布模型自行修改自身指令案例
前端
特创数字科技20 分钟前
公文Word一键批量排版工具|批量统一公文标准格式,办公自动化桌面小工具
前端·python
流水白开25 分钟前
JavaScript的原型链、类与类的继承
前端·javascript
PedroQue9928 分钟前
修复 .uvue 页面路径残留问题
前端·vite
颜进强36 分钟前
从零搭一套 WorkBuddy Skill 骨架:调接口 → 生成 HTML 报告的分层设计与流转拆解
前端·后端·ai编程
YHL41 分钟前
🔍 结构化输出:从 `JSON.parse` 到 `withStructuredOutput` 的三级火箭
前端·深度学习
YHL43 分钟前
🚰流式输出:把 LLM 的每个字,像水一样送到浏览器
前端·javascript