当前位置: 首页 > news >正文

实现点击按钮导出页面pdf

在Vue 3 + Vite项目中,你可以使用html2canvasjspdf库来实现将页面某部分导出为PDF文档的功能。以下是一个简单的实现方式:

1.安装html2canvasjspdf

pnpm install html2canvas jspdf

2.在Vue组件中使用这些库来实现导出功能:

<template><div><button @click="exportToPDF">导出PDF</button><div ref="pdfContent" class="pdf-content"><!-- 这里是你想要导出的页面部分 --></div></div>
</template><script lang="ts">
import { defineComponent, ref } from 'vue';
import html2canvas from 'html2canvas';
import jsPDF from 'jspdf';export default defineComponent({setup() {const pdfContent = ref<HTMLElement | null>(null);const exportToPDF = async () => {if (pdfContent.value) {const canvas = await html2canvas(pdfContent.value);const imgData = canvas.toDataURL('image/png');const doc = new jsPDF({orientation: 'portrait',unit: 'px',format: 'a4',});const imgProps = doc.getImageProperties(imgData);const pdfWidth = doc.internal.pageSize.getWidth();const pdfHeight = (imgProps.height * pdfWidth) / imgProps.width;doc.addImage(imgData, 'PNG', 0, 0, pdfWidth, pdfHeight);doc.save('exported.pdf');}};return {pdfContent,exportToPDF,};},
});
</script><style>
.pdf-content {/* 样式按需定制 */
}
</style>

最后点击导出按钮,即可成功按设置导出你想要导出的部分内容到pdf文档了,如下所以,打开pdf即可:

封装方法htmlToPdf.ts

import html2Canvas from 'html2canvas'
import JsPDF from 'jspdf'
// title:下载文件的名称  htmlId:包裹的标签的id
const htmlToPdf = (title: string, htmlId: string) => {var element = document.querySelector(htmlId) as HTMLElementwindow.pageYOffset = 0document.documentElement.scrollTop = 0document.body.scrollTop = 0setTimeout(() => {// // 以下注释的是增加导出的pdf水印 !!!!!!!!!!!!!// const value = '我是水印'// //创建一个画布// let can = document.createElement('canvas')// //设置画布的长宽// can.width = 400// can.height = 500// let cans = can.getContext('2d') as any// //旋转角度// cans.rotate((-15 * Math.PI) / 180)// cans.font = '18px Vedana'// //设置填充绘画的颜色、渐变或者模式// cans.fillStyle = 'rgba(200, 200, 200, 0.40)'// //设置文本内容的当前对齐方式// cans.textAlign = 'left'// //设置在绘制文本时使用的当前文本基线// cans.textBaseline = 'Middle'// //在画布上绘制填色的文本(输出的文本,开始绘制文本的X坐标位置,开始绘制文本的Y坐标位置)// cans.fillText(value, can.width / 8, can.height / 2)// let div = document.createElement('div')// div.style.pointerEvents = 'none'// div.style.top = '20px'// div.style.left = '-20px'// div.style.position = 'fixed'// div.style.zIndex = '100000'// div.style.width = element.scrollHeight + 'px'// div.style.height = element.scrollHeight + 'px'// div.style.background =//   'url(' + can.toDataURL('image/png') + ') left top repeat'// element.appendChild(div) // 到页面中html2Canvas(element, {allowTaint: true,useCORS: true,scale: 2, // 提升画面质量,但是会增加文件大小height: element.scrollHeight, // 需要注意,element的 高度 宽度一定要在这里定义一下,不然会存在只下载了当前你能看到的页面   避雷避雷!!!windowHeight: element.scrollHeight,}).then(function (canvas) {var contentWidth = 1948var contentHeight = canvas.height*1948 / canvas.width// console.log('contentWidth', contentWidth)// console.log('contentHeight', contentHeight)// 一页pdf显示html页面生成的canvas高度;var pageHeight = (contentWidth * 841.89) / 592.28// 未生成pdf的html页面高度var leftHeight = contentHeight// console.log('pageHeight', pageHeight)// console.log('leftHeight', leftHeight)// 页面偏移var position = 0// a4纸的尺寸[595.28,841.89],html页面生成的canvas在pdf中图片的宽高  //40是左右页边距var imgWidth = 595.28-60var imgHeight = (592.28 / contentWidth) * contentHeightvar pageData = canvas.toDataURL('image/jpeg', 1.0)var pdf = new JsPDF('portrait', 'px', 'a4')// 有两个高度需要区分,一个是html页面的实际高度,和生成pdf的页面高度(841.89)// 当内容未超过pdf一页显示的范围,无需分页if (leftHeight < pageHeight) {// console.log('没超过1页')pdf.addImage(pageData, 'JPEG', 2, 2, imgWidth, imgHeight)// pdf.addImage(pageData, 'JPEG', 20, 20, imgWidth, imgHeight)} else {while (leftHeight > 0) {// console.log('超过1页')pdf.addImage(pageData, 'JPEG', 5, position, imgWidth, imgHeight)leftHeight -= pageHeightposition -= 841.89// 避免添加空白页if (leftHeight > 0) {pdf.addPage()}}}pdf.save(title + '.pdf')})}, 1000)
}export default htmlToPdf

相关文章:

  • Android super.img结构及解包和重新组包
  • Android Gradle开发与应用Gradle详细使用
  • STM32第十四课:低功耗模式和RTC实时时钟
  • 「C++系列」C++ 变量作用域
  • 谈谈检测浏览器类型
  • Jenkins 使用 Publish over SSH进行远程访问
  • p标签文本段落中因编辑器换行引起的空格问题完美解决方案
  • 【Element-UI】vue使用 this.$confirm区分取消与关闭,vue给this.$confirm设置多个按钮
  • WHAT - React Immer
  • QT学习(6)——QT中的定时器事件,两种实现方式;事件的分发event,事件过滤器
  • 【软件工程】计算机内存单位解析及换算
  • vue3中svg图标的封装与使用
  • 万字 | 菊花厂C语言编程10大规范
  • Python基础小知识问答系列-过滤列表元素
  • python 基础综合应用——小开发
  • [ 一起学React系列 -- 8 ] React中的文件上传
  • Angular6错误 Service: No provider for Renderer2
  • centos安装java运行环境jdk+tomcat
  • ComponentOne 2017 V2版本正式发布
  • leetcode388. Longest Absolute File Path
  • SQLServer之创建数据库快照
  • 排序算法之--选择排序
  • 普通函数和构造函数的区别
  • 浅谈web中前端模板引擎的使用
  • 推荐一款sublime text 3 支持JSX和es201x 代码格式化的插件
  • 微信小程序上拉加载:onReachBottom详解+设置触发距离
  • 阿里云服务器购买完整流程
  • 交换综合实验一
  • 微龛半导体获数千万Pre-A轮融资,投资方为国中创投 ...
  • ​​​【收录 Hello 算法】10.4 哈希优化策略
  • ​LeetCode解法汇总1410. HTML 实体解析器
  • ​软考-高级-系统架构设计师教程(清华第2版)【第1章-绪论-思维导图】​
  • #QT(一种朴素的计算器实现方法)
  • (04)Hive的相关概念——order by 、sort by、distribute by 、cluster by
  • (CVPRW,2024)可学习的提示:遥感领域小样本语义分割
  • (C语言)编写程序将一个4×4的数组进行顺时针旋转90度后输出。
  • (C语言)二分查找 超详细
  • (附源码)ssm经济信息门户网站 毕业设计 141634
  • (六)vue-router+UI组件库
  • (转载)OpenStack Hacker养成指南
  • .NET Core WebAPI中使用swagger版本控制,添加注释
  • .NET Core实战项目之CMS 第一章 入门篇-开篇及总体规划
  • .NET/C# 使用反射调用含 ref 或 out 参数的方法
  • .NET成年了,然后呢?
  • /tmp目录下出现system-private文件夹解决方法
  • @Autowired @Resource @Qualifier的区别
  • @Autowired标签与 @Resource标签 的区别
  • [ 常用工具篇 ] AntSword 蚁剑安装及使用详解
  • [Android]How to use FFmpeg to decode Android f...
  • [autojs]逍遥模拟器和vscode对接
  • [AutoSar]BSW_Com02 PDU详解
  • [BZOJ5250][九省联考2018]秘密袭击(DP)
  • [C#]C# OpenVINO部署yolov8图像分类模型
  • [CentOs7]iptables防火墙安装与设置
  • [ChromeApp]指南!让你的谷歌浏览器好用十倍!