前端处理导出PDF。Vue导出pdf

前言:该篇主要是解决一些简单的页面内容导出为PDF

1.安装依赖

使用到两个依赖,项目目录下运行这两个

javascript 复制代码
//页面转换成图片
npm install --save html2canvas 
//图片转换成pdf
npm install jspdf --save 

2.创建通用工具类exportPdf.js文件

可以保存在工具类目录下;

javascript 复制代码
// 导出页面为PDF格式
import html2Canvas from 'html2canvas'
import JsPDF from 'jspdf'

export function getPdf(title, id) {
  // 参数校验
  if (!title || !id) {
    console.error('Title and ID are required.')
    return
  }

  const element = document.querySelector(`#${id}`)
  if (!element) {
    console.error(`Element with ID "${id}" not found.`)
    return
  }

  html2Canvas(element, {
    allowTaint: true,
    useCORS: true,
    scale: 2
  }).then(function (canvas) {
    const contentWidth = canvas.width
    const contentHeight = canvas.height

    // A4纸尺寸 (单位: pt)
    const a4Width = 595.28
    const a4Height = 841.89

    // 设置外边距 (单位: pt)
    const marginLeft = 20
    const marginTop = 20
    const marginRight = 20
    const marginBottom = 20

    // 计算可用内容区域
    const availableWidth = a4Width - marginLeft - marginRight
    const availableHeight = a4Height - marginTop - marginBottom

    // 计算缩放比例,使内容宽度适配可用区域
    const scale = availableWidth / contentWidth

    // 按比例计算图像在页面上的尺寸
    const imgWidth = contentWidth * scale
    const imgHeight = contentHeight * scale

    // 计算每页可容纳的高度(考虑上下边距)
    const pageHeight = availableHeight
    let leftHeight = imgHeight
    let position = 0

    const pageData = canvas.toDataURL('image/jpeg', 0.95)
    const PDF = new JsPDF('', 'pt', 'a4')

    if (leftHeight < pageHeight) {
      // 内容高度小于页面可用高度,直接添加图片(带外边距)
      PDF.addImage(pageData, 'JPEG', marginLeft, marginTop, imgWidth, imgHeight)
    } else {
      // 内容高度大于页面可用高度,分页处理
      while (leftHeight > 0) {
        // 添加当前页面图像(带外边距)
        PDF.addImage(pageData, 'JPEG', marginLeft, marginTop + position, imgWidth, imgHeight)
        leftHeight -= pageHeight
        position -= a4Height

        // 如果还有剩余内容,添加新页面
        if (leftHeight > 0) {
          PDF.addPage()
        }
      }
    }

    PDF.save(title + '.pdf')
  }).catch(function (error) {
    console.error('PDF导出失败:', error)
  })
}

3.Demo例子

javascript 复制代码
<template>
    <div>
        <!-- 容器 -->
        <div id="pdfHtml" ref="printHtml">
            <h1>这是一个Demo。</h1>
        </div>
        <button @click="exportPDF">PDF导出</button>
    </div>
</template>
<script>
import { getPdf } from '@/utils/exportPdf';
export default {
    methods: {
        // 导出pdf
        exportPDF() {
            getPdf('关键因素', 'pdfHtml');
        }
    }
}
</script>
相关推荐
浩星2 分钟前
iframe引入界面有el-date-picker日期框,点击出现闪退问题处理
前端·vue.js·elementui
技术钱4 分钟前
element plus 多个form校验
前端
yume_sibai13 分钟前
HTML HTML基础(3)
前端·html
米花丶20 分钟前
JSBridge安全通信:iOS/Android桥对象差异与最佳实践
前端·webview
星空的资源小屋24 分钟前
网易UU远程,免费电脑远程控制软件
人工智能·python·pdf·电脑
萌萌哒草头将军1 小时前
🚀🚀🚀 Oxc 恶意扩展警告;Rolldown 放弃 CJS 支持;Vite 发布两个漏洞补丁版本;Rslib v0.13 支持 ts-go
前端·javascript·vue.js
接着奏乐接着舞。1 小时前
3D地球可视化教程 - 第1篇:基础地球渲染系统
前端·javascript·vue.js·3d·three.js
龙傲天6661 小时前
Scala的面向对象和函数式编程特性 Idea环境搭建和输入输出
前端
蓝色海岛1 小时前
element-ui表格嵌套表格,鼠标移入时样式错乱-问题调研及处理办法
前端
薄雾晚晴1 小时前
Rspack 实战:用 SWC Loader 搞定 JS 兼容(支持 IE 11 + 现代浏览器,兼顾构建速度)
前端·vue.js