当前位置:首页 > VUE

vue实现打印和预览

2026-01-22 17:37:26VUE

Vue 实现打印功能

使用 window.print() 方法结合 CSS 控制打印样式是最基础的方式。可以创建一个隐藏的打印区域,仅在打印时显示。

<template>
  <div>
    <button @click="handlePrint">打印</button>
    <div class="print-content" ref="printContent">
      <!-- 需要打印的内容 -->
      <h1>打印标题</h1>
      <p>打印内容...</p>
    </div>
  </div>
</template>

<script>
export default {
  methods: {
    handlePrint() {
      const printContent = this.$refs.printContent.innerHTML;
      const originalContent = document.body.innerHTML;

      document.body.innerHTML = printContent;
      window.print();
      document.body.innerHTML = originalContent;
    }
  }
}
</script>

<style>
@media print {
  body * {
    visibility: hidden;
  }
  .print-content, .print-content * {
    visibility: visible;
  }
  .print-content {
    position: absolute;
    left: 0;
    top: 0;
  }
}
</style>

使用 vue-print-nb 插件

安装插件:

npm install vue-print-nb --save

使用方式:

vue实现打印和预览

<template>
  <div>
    <button v-print="printObj">打印</button>
    <div id="printContent">
      <!-- 打印内容 -->
    </div>
  </div>
</template>

<script>
import print from 'vue-print-nb'

export default {
  directives: {
    print
  },
  data() {
    return {
      printObj: {
        id: 'printContent',
        popTitle: '打印标题', // 打印标题
        extraCss: 'https://example.com/print.css', // 额外CSS
        extraHead: '<meta http-equiv="Content-Language"content="zh-cn"/>' // 额外head标签
      }
    }
  }
}
</script>

Vue 实现预览功能

对于预览功能,可以使用对话框或新窗口展示待打印内容。

<template>
  <div>
    <button @click="showPreview = true">预览</button>
    <button @click="handlePrint">打印</button>

    <div v-if="showPreview" class="preview-modal">
      <div class="preview-content">
        <button @click="showPreview = false">关闭</button>
        <div ref="printContent">
          <!-- 预览内容 -->
          <h1>文档标题</h1>
          <p>文档内容...</p>
        </div>
      </div>
    </div>
  </div>
</template>

<script>
export default {
  data() {
    return {
      showPreview: false
    }
  },
  methods: {
    handlePrint() {
      // 打印逻辑同上
    }
  }
}
</script>

<style>
.preview-modal {
  position: fixed;
  top: 0;
  left: 0;
  right: 0;
  bottom: 0;
  background: rgba(0,0,0,0.5);
  display: flex;
  align-items: center;
  justify-content: center;
  z-index: 1000;
}

.preview-content {
  background: white;
  padding: 20px;
  max-width: 80%;
  max-height: 80vh;
  overflow: auto;
}
</style>

使用 PDF 预览

如果需要生成 PDF 预览,可以使用 jsPDF 或 html2pdf 等库。

vue实现打印和预览

安装 html2pdf:

npm install html2pdf.js

使用示例:

<template>
  <div>
    <button @click="generatePDF">生成PDF</button>
    <div id="pdfContent">
      <!-- PDF内容 -->
    </div>
  </div>
</template>

<script>
import html2pdf from 'html2pdf.js'

export default {
  methods: {
    generatePDF() {
      const element = document.getElementById('pdfContent');
      const opt = {
        margin: 10,
        filename: 'document.pdf',
        image: { type: 'jpeg', quality: 0.98 },
        html2canvas: { scale: 2 },
        jsPDF: { unit: 'mm', format: 'a4', orientation: 'portrait' }
      };

      html2pdf().from(element).set(opt).save();
    }
  }
}
</script>

打印样式优化

通过 CSS 的 @media print 可以优化打印效果:

@media print {
  @page {
    size: A4;
    margin: 0;
  }

  body {
    font-size: 12pt;
    line-height: 1.5;
  }

  .no-print {
    display: none !important;
  }

  .page-break {
    page-break-after: always;
  }
}

注意事项

  • 打印时隐藏不需要的元素,使用 @media print 控制显示
  • 考虑分页问题,可以使用 page-break-beforepage-break-after
  • 复杂布局可能需要使用专门的打印模板
  • 图片打印需要确保分辨率足够
  • 测试不同浏览器的打印兼容性

标签: vue
分享给朋友:

相关文章

vue实现添加用户

vue实现添加用户

Vue 实现添加用户功能 数据绑定与表单设计 在 Vue 中实现添加用户功能,首先需要设计一个表单,用于收集用户输入的数据。通过 v-model 实现双向数据绑定,确保表单数据与 Vue 实例中的数据…

vue实现访问量

vue实现访问量

Vue 实现访问量统计的方法 使用前端计数 在 Vue 中可以通过简单的计数器实现页面访问量的统计。这种方法适合小型项目或演示用途。 // 在 Vue 组件中 data() { return…

vue设计与实现目录

vue设计与实现目录

以下是《Vue设计与实现》一书的典型目录结构(根据常见技术书籍及Vue核心内容整理): 响应式系统 响应式数据的基本原理 依赖收集与触发更新 实现简易响应式系统 Proxy与Reflec…

vue实现矩阵

vue实现矩阵

Vue 实现矩阵的方法 在 Vue 中实现矩阵操作可以通过多种方式完成,以下是一些常见的方法: 使用二维数组表示矩阵 矩阵可以用二维数组来表示,每个元素对应矩阵中的一个值。在 Vue 的 data…

vue实现钟表

vue实现钟表

使用 Vue 实现动态钟表 以下是一个基于 Vue 3 的动态钟表实现方案,包含时分秒指针和数字时间显示。 模板部分 <template> <div class="clock…

vue实现visual

vue实现visual

Vue 实现可视化(Visual)的常见方法 在 Vue 中实现可视化通常涉及数据可视化库的集成,以下是几种主流方案: 使用 ECharts ECharts 是一个强大的 JavaScript 图表…