当前位置:首页 > VUE

vue实现打印插件

2026-02-20 08:36:05VUE

Vue 打印插件实现方案

在Vue项目中实现打印功能,可通过原生API或第三方库完成。以下是几种常见方案:

使用原生window.print()方法

直接调用浏览器打印API实现基础打印功能:

// 在Vue组件中
methods: {
  printContent() {
    window.print()
  }
}

需配合CSS媒体查询控制打印样式:

@media print {
  .no-print {
    display: none;
  }
}

使用vue-print-nb插件

安装流行打印插件vue-print-nb:

npm install vue-print-nb --save

全局注册或局部使用:

// 全局注册
import Print from 'vue-print-nb'
Vue.use(Print)

// 局部使用
import print from 'vue-print-nb'
export default {
  directives: {
    print
  }
}

模板中使用指令:

vue实现打印插件

<button v-print="printObj">打印</button>
<div id="printContent">需要打印的内容</div>

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

使用html2canvas + jsPDF实现PDF打印

组合使用两个库实现HTML转PDF打印:

npm install html2canvas jspdf

组件实现代码:

import html2canvas from 'html2canvas'
import jsPDF from 'jspdf'

methods: {
  async printPDF() {
    const element = document.getElementById('print-area')
    const canvas = await html2canvas(element, {
      scale: 2 // 提高分辨率
    })

    const pdf = new jsPDF('p', 'mm', 'a4')
    const imgData = canvas.toDataURL('image/png')
    const imgWidth = 190 // A4纸宽度
    const pageHeight = 277 // A4纸高度
    const imgHeight = canvas.height * imgWidth / canvas.width

    let heightLeft = imgHeight
    let position = 10 // 页边距

    pdf.addImage(imgData, 'PNG', 10, position, imgWidth, imgHeight)
    heightLeft -= pageHeight

    while (heightLeft >= 0) {
      position = heightLeft - imgHeight
      pdf.addPage()
      pdf.addImage(imgData, 'PNG', 10, position, imgWidth, imgHeight)
      heightLeft -= pageHeight
    }

    pdf.save('document.pdf')
  }
}

打印优化技巧

添加打印专用样式表确保布局正确:

vue实现打印插件

<link rel="stylesheet" media="print" href="/print.css">

处理分页问题:

@media print {
  .page-break {
    page-break-after: always;
  }
}

处理背景打印:

@media print {
  * {
    -webkit-print-color-adjust: exact !important;
    print-color-adjust: exact !important;
  }
}

特殊场景处理

打印动态内容前确保数据加载:

async printWithData() {
  await this.loadData()
  this.$nextTick(() => {
    window.print()
  })
}

处理iframe打印:

printIframe() {
  const iframe = document.createElement('iframe')
  iframe.style.display = 'none'
  document.body.appendChild(iframe)

  const doc = iframe.contentWindow.document
  doc.write('<html><body>' + document.getElementById('content').innerHTML + '</body></html>')
  doc.close()

  iframe.contentWindow.focus()
  iframe.contentWindow.print()

  setTimeout(() => {
    document.body.removeChild(iframe)
  }, 1000)
}

以上方案可根据具体需求选择使用,vue-print-nb适合简单场景,html2canvas+jsPDF组合适合需要生成PDF的场景,原生API适合基础打印需求。

标签: 插件vue
分享给朋友:

相关文章

vue 实现菜单

vue 实现菜单

Vue 实现菜单的方法 使用 Vue 实现菜单可以通过多种方式,以下是几种常见的方法: 使用 Vue Router 实现动态路由菜单 通过 Vue Router 可以动态生成菜单,根据路由配置自动渲…

vue实现iframe

vue实现iframe

Vue 中实现 iframe 的方法 在 Vue 项目中,可以通过多种方式实现 iframe 的嵌入。以下是几种常见的方法: 使用原生 HTML iframe 标签 直接在 Vue 组件的模板中使用…

vue实现xss

vue实现xss

XSS 攻击简介 XSS(跨站脚本攻击)是一种常见的安全漏洞,攻击者通过注入恶意脚本到网页中,当其他用户访问该页面时,脚本会在其浏览器中执行,可能导致数据泄露或会话劫持。 Vue 中的 XSS…

vue实现flbook

vue实现flbook

Vue 实现类似 Flbook 的翻页效果 要实现类似 Flbook 的翻页效果,可以使用 Vue 结合 CSS 动画和 JavaScript 事件处理。以下是实现方法: 安装依赖 需要安装 vue…

vue 实现分屏

vue 实现分屏

Vue 实现分屏的方法 使用 CSS Flexbox 或 Grid 布局 通过 CSS Flexbox 或 Grid 布局可以轻松实现分屏效果。在 Vue 组件中定义两个或多个区域,并使用 CSS 控…

vue计算属性 实现

vue计算属性 实现

Vue 计算属性的实现 计算属性(Computed Properties)是 Vue 中的一个核心功能,用于声明式地定义依赖其他属性的值。计算属性会缓存结果,只有当依赖的响应式数据发生变化时才会重新计…