当前位置:首页 > VUE

vue实现pdf打印开单

2026-01-23 15:59:48VUE

使用vue实现PDF打印开单功能

安装依赖库

需要安装html2canvasjspdf两个库用于将HTML转换为PDF

npm install html2canvas jspdf --save

创建打印组件

创建一个可复用的PDF打印组件,包含需要打印的内容区域和打印按钮

<template>
  <div>
    <div id="printArea" class="print-content">
      <!-- 这里是需要打印的内容 -->
      <h1>销售单据</h1>
      <table>
        <tr>
          <th>商品名称</th>
          <th>数量</th>
          <th>单价</th>
          <th>金额</th>
        </tr>
        <tr v-for="(item, index) in items" :key="index">
          <td>{{ item.name }}</td>
          <td>{{ item.quantity }}</td>
          <td>{{ item.price }}</td>
          <td>{{ item.price * item.quantity }}</td>
        </tr>
      </table>
    </div>
    <button @click="generatePDF">打印单据</button>
  </div>
</template>

<script>
import html2canvas from 'html2canvas'
import jsPDF from 'jspdf'

export default {
  data() {
    return {
      items: [
        { name: '商品A', quantity: 2, price: 100 },
        { name: '商品B', quantity: 1, price: 200 }
      ]
    }
  },
  methods: {
    generatePDF() {
      const element = document.getElementById('printArea')
      html2canvas(element).then(canvas => {
        const imgData = canvas.toDataURL('image/png')
        const pdf = new jsPDF('p', 'mm', 'a4')
        const imgWidth = 190
        const imgHeight = canvas.height * imgWidth / canvas.width

        pdf.addImage(imgData, 'PNG', 10, 10, imgWidth, imgHeight)
        pdf.save('销售单据.pdf')
      })
    }
  }
}
</script>

<style>
.print-content {
  width: 100%;
  padding: 20px;
  background: white;
}
table {
  width: 100%;
  border-collapse: collapse;
}
th, td {
  border: 1px solid #ddd;
  padding: 8px;
  text-align: left;
}
</style>

优化打印样式

为打印内容添加专用样式,确保打印效果符合预期

@media print {
  body * {
    visibility: hidden;
  }
  #printArea, #printArea * {
    visibility: visible;
  }
  #printArea {
    position: absolute;
    left: 0;
    top: 0;
    width: 100%;
  }
}

添加打印参数配置

扩展生成PDF方法,支持自定义文件名、纸张方向和边距

generatePDF(fileName = '销售单据', orientation = 'p', margin = 10) {
  const element = document.getElementById('printArea')
  html2canvas(element, {
    scale: 2,
    logging: false,
    useCORS: true
  }).then(canvas => {
    const imgData = canvas.toDataURL('image/png')
    const pdf = new jsPDF(orientation, 'mm', 'a4')
    const imgWidth = pdf.internal.pageSize.getWidth() - margin * 2
    const imgHeight = canvas.height * imgWidth / canvas.width

    pdf.addImage(imgData, 'PNG', margin, margin, imgWidth, imgHeight)
    pdf.save(`${fileName}.pdf`)
  })
}

处理长内容分页

对于超出一页的内容,自动分页处理

generatePDF() {
  const element = document.getElementById('printArea')
  const pdf = new jsPDF('p', 'mm', 'a4')
  const margin = 10
  const pageWidth = pdf.internal.pageSize.getWidth()
  const pageHeight = pdf.internal.pageSize.getHeight()

  html2canvas(element, {
    scale: 2
  }).then(canvas => {
    const imgData = canvas.toDataURL('image/png')
    const imgWidth = pageWidth - margin * 2
    const imgHeight = canvas.height * imgWidth / canvas.width

    let heightLeft = imgHeight
    let position = margin
    let page = 1

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

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

    pdf.save('销售单据.pdf')
  })
}

使用注意事项

确保打印区域的内容在DOM加载完成后才执行转换操作,避免内容未完全渲染导致的打印不完整问题。对于动态数据,建议在数据加载完成后再触发打印操作。

vue实现pdf打印开单

打印样式建议使用固定单位(如mm、pt)而非响应式单位(如%、vw),以确保打印尺寸的准确性。测试不同浏览器的兼容性,特别是IE浏览器可能需要额外的polyfill支持。

标签: vuepdf
分享给朋友:

相关文章

vue element实现

vue element实现

Vue Element UI 实现 Vue Element UI 是基于 Vue.js 的组件库,提供丰富的 UI 组件,适合快速开发企业级中后台产品。以下是一些关键实现方法和步骤: 安装 Vue…

vue实现类别

vue实现类别

Vue 实现类别的几种方法 在 Vue 中实现类别功能可以通过多种方式完成,以下是一些常见的方法: 使用 v-bind:class 动态绑定类名 通过对象语法或数组语法动态绑定类名,根据条件添加或移…

vue实现 toast

vue实现 toast

Vue 实现 Toast 组件 在 Vue 中实现 Toast 组件可以通过多种方式完成,以下是几种常见的方法: 使用全局组件和事件总线 创建一个全局的 Toast 组件,并通过事件总线或 Vue…

vue底部实现

vue底部实现

Vue 底部实现方法 在 Vue 项目中实现底部布局可以通过多种方式完成,以下是一些常见的方法: 使用固定定位 将底部元素固定在页面底部,适用于单页应用或需要始终显示的底部栏。 <temp…

实现vue message

实现vue message

实现 Vue 消息提示组件 创建 Message 组件 在 src/components 目录下创建 Message.vue 文件,内容如下: <template> <tran…

vue实现穿梭框

vue实现穿梭框

Vue 穿梭框实现方法 穿梭框(Transfer)是一种常见的UI组件,用于在两个列表之间移动数据项。以下是基于Vue的实现方法。 基础结构搭建 创建两个列表容器和一个操作按钮区域,使用v-mode…