当前位置:首页 > VUE

vue实现转成pdf实现打印功能

2026-02-20 14:55:48VUE

使用html2canvas和jspdf实现Vue转PDF

安装依赖库

npm install html2canvas jspdf

创建PDF生成工具函数

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

export const exportToPDF = (element, filename = 'document.pdf') => {
  html2canvas(element).then(canvas => {
    const imgData = canvas.toDataURL('image/png')
    const pdf = new jsPDF('p', 'mm', 'a4')
    const imgWidth = 210
    const pageHeight = 295
    const imgHeight = canvas.height * imgWidth / canvas.width
    let heightLeft = imgHeight
    let position = 0

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

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

    pdf.save(filename)
  })
}

在Vue组件中使用

<template>
  <div ref="content">
    <!-- 需要转换为PDF的内容 -->
  </div>
  <button @click="generatePDF">导出PDF</button>
</template>

<script>
import { exportToPDF } from './pdfUtils'

export default {
  methods: {
    generatePDF() {
      exportToPDF(this.$refs.content, 'my-document.pdf')
    }
  }
}
</script>

使用vue-html2pdf插件

安装插件

npm install vue-html2pdf

在组件中使用

<template>
  <div>
    <vue-html2pdf
      :show-layout="true"
      :float-layout="false"
      :enable-download="true"
      :preview-modal="true"
      filename="document"
      :paginate-elements-by-height="1400"
      pdf-content-width="800px"
      pdf-orientation="portrait"
      pdf-format="a4"
      ref="html2Pdf"
    >
      <template v-slot:pdf-content>
        <!-- PDF内容 -->
      </template>
    </vue-html2pdf>

    <button @click="generatePDF">生成PDF</button>
  </div>
</template>

<script>
import VueHtml2pdf from 'vue-html2pdf'

export default {
  components: {
    VueHtml2pdf
  },
  methods: {
    generatePDF() {
      this.$refs.html2Pdf.generatePdf()
    }
  }
}
</script>

使用浏览器打印API实现打印功能

创建打印方法

export const printElement = (element) => {
  const printWindow = window.open('', '_blank')
  printWindow.document.write('<html><head><title>打印</title></head><body>')
  printWindow.document.write(element.innerHTML)
  printWindow.document.write('</body></html>')
  printWindow.document.close()
  printWindow.focus()

  setTimeout(() => {
    printWindow.print()
    printWindow.close()
  }, 500)
}

在Vue组件中使用

<template>
  <div ref="printContent">
    <!-- 需要打印的内容 -->
  </div>
  <button @click="print">打印</button>
</template>

<script>
import { printElement } from './printUtils'

export default {
  methods: {
    print() {
      printElement(this.$refs.printContent)
    }
  }
}
</script>

使用CSS媒体查询优化打印样式

添加打印样式

@media print {
  body * {
    visibility: hidden;
  }
  .print-content, .print-content * {
    visibility: visible;
  }
  .print-content {
    position: absolute;
    left: 0;
    top: 0;
    width: 100%;
  }
  .no-print {
    display: none !important;
  }
}

注意事项

PDF生成质量取决于HTML内容的复杂度,复杂布局可能需要额外调整

图片需要完全加载后才能正确转换为PDF,建议添加加载状态处理

打印功能可能受浏览器安全策略限制,某些内容可能无法打印

对于大量数据分页处理,需要计算合适的分页高度参数

vue实现转成pdf实现打印功能

考虑添加加载指示器和错误处理机制提升用户体验

标签: 转成功能
分享给朋友:

相关文章

vue 实现筛选功能

vue 实现筛选功能

实现筛选功能的基本思路 在Vue中实现筛选功能通常涉及以下几个核心步骤:数据绑定、筛选逻辑处理、结果展示。以下是具体实现方法。 数据准备 准备需要筛选的数据源,通常是一个数组,可以存储在Vue组件的…

vue实现轨道功能

vue实现轨道功能

实现轨道功能的基本思路 轨道功能通常指在界面中创建可滑动的轨道,用户可以通过拖动或点击轨道上的元素进行交互。Vue.js结合其响应式特性和组件化开发方式,可以高效实现这一功能。 核心实现步骤 创建轨…

前端实现拖拽功能vue

前端实现拖拽功能vue

使用 HTML5 拖放 API 在 Vue 中可以通过 HTML5 的原生拖放 API 实现拖拽功能。需要监听 dragstart、dragover 和 drop 事件。 <template&…

vue实现轨道功能

vue实现轨道功能

Vue 实现轨道功能的方法 轨道功能通常指在界面中实现元素沿特定路径移动的效果,例如进度条、时间轴或动画轨迹。以下是几种常见的实现方式: 使用 CSS 动画与 Vue 结合 通过 Vue 动态绑定样…

vue实现换页功能

vue实现换页功能

Vue 实现分页功能 使用第三方库(如 Element UI) 安装 Element UI: npm install element-ui 在 main.js 中引入: import Vue fr…

vue实现退出功能

vue实现退出功能

Vue 实现退出功能的方法 在 Vue 中实现退出功能通常涉及清除用户登录状态、跳转登录页等操作。以下是几种常见的实现方式: 清除登录状态并跳转 使用 Vue Router 进行页面跳转,同时清除本…