当前位置:首页 > 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

在组件中使用

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

<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媒体查询优化打印样式

添加打印样式

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

@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,建议添加加载状态处理

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

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

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

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

相关文章

php实现留言板功能

php实现留言板功能

PHP 留言板功能实现 数据库设计 创建数据库表 messages,包含以下字段: id:自增主键 name:留言者姓名(VARCHAR) email:留言者邮箱(VARCHAR) content:…

js实现 功能

js实现 功能

在 JavaScript 中实现功能通常涉及多个关键步骤,具体取决于功能需求。以下是常见功能的实现方法和示例: 基本功能实现 使用函数封装逻辑是最直接的方式。例如,实现一个计算两数之和的函数: f…

h5能实现抽题功能吗

h5能实现抽题功能吗

H5实现抽题功能的技术方案 H5完全能够实现抽题功能,主要通过前端技术结合后端数据交互完成。以下是具体实现方式: 前端技术实现 HTML5结合JavaScript可以动态生成和展示题目,利用DOM操…

h5实现手机摇一摇功能

h5实现手机摇一摇功能

实现原理 手机摇一摇功能基于设备加速度传感器(DeviceMotionEvent),通过监听设备的加速度变化来判断用户是否进行了摇晃动作。HTML5提供了相关API获取设备传感器数据。 基本…

vue各种功能实现

vue各种功能实现

Vue 基础功能实现 数据绑定与响应式更新 使用 v-model 实现表单元素与数据的双向绑定,数据变更自动更新视图。 示例: <input v-model="message"> &…

php实现分享功能实现

php实现分享功能实现

实现PHP分享功能的方法 在PHP中实现分享功能可以通过多种方式完成,以下是一些常见的实现方法: 使用社交媒体分享按钮 社交媒体平台如Facebook、Twitter、LinkedIn等提供了现成…