前端将网页转换为pdf并支持下载与上传

1.pdf下载


handleExport() {const fixedH = document.getElementById("fixed-h");const pageOne = document.getElementById("mix-print-box-one");const pageTwo = document.getElementById("mix-print-box-two");fixedH.style.height = '30vh';pageOne.style.display = 'block';pageTwo.style.display = 'block';// 禁止滚动document.body.addEventListener('touchmove', this.preventDefaultScroll, { passive: false });document.body.addEventListener('wheel', this.preventDefaultScroll, { passive: false });html2canvas(pageOne).then((canvasOne) => {const imgOne = canvasOne.toDataURL("image/png");const pdf = new jsPDF();const propsOne = pdf.getImageProperties(imgOne);const widthOne = pdf.internal.pageSize.getWidth();const heightOne = (propsOne.height * widthOne) / propsOne.width;pdf.addImage(imgOne, "PNG", 0, 0, widthOne, heightOne);html2canvas(pageTwo).then(canvasTwo => {const imgTwo = canvasTwo.toDataURL("image/png");const propsTwo = pdf.getImageProperties(imgTwo);const widthTwo = pdf.internal.pageSize.getWidth();const heightTwo = (propsTwo.height * widthTwo) / propsTwo.width;pdf.addPage(); // 分页pdf.addImage(imgTwo, "PNG", 0, 0, widthTwo, heightTwo);const title = `${this.formOne.application}测试的.pdf`;pdf.save(title);fixedH.style.height = 'auto';pageOne.style.display = 'none';pageTwo.style.display = 'none';// 恢复滚动document.body.removeEventListener('touchmove', this.preventDefaultScroll);document.body.removeEventListener('wheel', this.preventDefaultScroll);});});
}

2.pdf上传


handleUploadPdf(id) {const element = document.getElementById("myElementId");html2canvas(element).then((canvas) => {const imgData = canvas.toDataURL("image/png");const pdf = new jsPDF();const imgProps = pdf.getImageProperties(imgData);const pdfWidth = pdf.internal.pageSize.getWidth();const pdfHeight = (imgProps.height * pdfWidth) / imgProps.width;pdf.addImage(imgData, "PNG", 0, 0, pdfWidth, pdfHeight);// 将 PDF 转换为 Blob 对象const blob = pdf.output("blob");// 上传文件const fileName = "测试的.pdf";const formData = new FormData();formData.append("file", blob, fileName);uploadPdf(formData).then((res) => {// 将pdf地址传给后端uploadPdfUrl({id,fileName,path: res.fileName,});console.log("上传成功", res.url);});});
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.xdnf.cn/news/3410.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

产品思维笔记(一):打造用户喜爱的产品by Marty Cagan

全文摘要 《启示录:打造用户喜爱的产品》是由美国著名产品经理Marty Cagan所著,他曾经是eBay最出色的产品经理之一,也是Google X实验室的创始人之一。在这本书中,他分享了自己的经验和教训,帮助读者更好地理解如何打造…

推荐一款功能强大的电影格式转换器:Total Movie Converter

Coolutils Total Movie Converter(电影格式转换器)是一款可以将超清或者高清蓝光的视频电影进行格式转换的工具,高质量速度快操作简单就是软件最大的亮点,它可以转换几乎所有流行的视频编解码器。 基本简介 Coolutils Total Movie Converter 也可以使视…

掌声响起来——不确定性人工智能与高斯云方法的应用

✅作者简介:2022年博客新星 第八。热爱国学的Java后端开发者,修心和技术同步精进。 🍎个人主页:Java Fans的博客 🍊个人信条:不迁怒,不贰过。小知识,大智慧。 💞当前专栏…

P11232 [CSP-S 2024] 超速检测

P11232 [CSP-S 2024] 超速检测 难度:普及/提高。 考点:二分、贪心。 题意: 题意较长,没有题目大意,否则你也大意。 主干道长度为 L L L,有 n n n 辆车,看做左端点为 0 0 0,第 …

JSP九大内置对象和四大作用域

get和post区别: 比较项 get post 缓存 可以 不可以 收藏为书签 可以 不可以 数据长度 有限制(URL 的最大长度是 2048 个字符) 无限制 编码类型 application/x-www-form-urlencoded application/x-www-form-urlencoded 或 multi…

【java batik_使用BATIK解析SVG生成PNG图片】

矢量图的介绍及应用场景 矢量图是什么意思? 矢量图,也称为向量图,英文名字是Vector graphics。 矢量图是一种基于矢量的图形,由一系列的线段和曲线组成。由数学公式和算法生成的。这意味着矢量图可以在任何分辨率下清晰地显示&…

针对物联网边缘设备基于EIT的手部手势识别的1D CNN效率增强的组合模型压缩方法

论文标题:Combinative Model Compression Approach for Enhancing 1D CNN Efficiency for EIT-based Hand Gesture Recognition on IoT Edge Devices 中文标题:针对物联网边缘设备基于EIT的手部手势识别的1D CNN效率增强的组合模型压缩方法 作者信息&a…

0.STM32F1移植到F0的各种经验总结

1.结构体的声明需放在函数的最前面 源代码: /*开启时钟*/RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE); //开启USART1的时钟RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE); //开启GPIOA的时钟/*GPIO初始化*/GPIO_InitTypeDef GPIO_InitStructu…

【AIGC】ChatGPT提示词Prompt高效编写技巧:逆向拆解OpenAI官方提示词

博客主页: [小ᶻZ࿆] 本文专栏: AIGC | ChatGPT 文章目录 💯前言💯OpenAI官方提示词的介绍OpenAI官方提示词的结构与组成如何通过分析提示词找到其核心组件 💯OpenAI官方提示词分析案例一:制定教学计划案例二&…

Leetcode 62. 不同路径 动态规划+空间优化

原题链接&#xff1a;Leetcode 62. 不同路径 二维数组&#xff1a; class Solution { public:int uniquePaths(int m, int n) {int res 0;int box[m][n];for (int i 0; i < m; i) {box[i][0] 1;}for (int j 0; j < n; j) {box[0][j] 1;}for (int i 1; i < m;…

app的登录破解 frida jadx

今天收到了一个APP让我研究一下登录 登录已经研究完成 下面则是我的整体思路 为了安全考虑这个app我就不说是那个了 我就说整体的思路 仅供交流学习 严谨非法使用开始进行抓包 手机使用代理连接charles 之后开始点击app登录 进行抓包下面则是我抓到的包 抓包之后j进行改包 也…

【IEEE/CCF-C类】1区顶刊变水刊?发文量暴涨1600+,光速审稿,圆你顶刊梦!

&#x1f525; &#x1f525; &#x1f525; &#x1f525; 本期小编解析的是一本由IEEE旗下多个学会联合出版的计算机领域的TOP期刊《IEEE Internet of Things Journal》&#xff0c;该期刊自2014年创刊&#xff0c;专注于物联网&#xff08;IoT&#xff09;领域的研究…

django高校学生信息管理系统-计算机毕业设计源码02553

django高校学生信息管理系统 摘 要 本研究旨在设计和实现基于Django框架的高校学生信息管理系统&#xff0c;涵盖了系统用户、学生信息管理、教师信息管理、课程分类管理、开课信息管理、选课信息管理、课表信息管理、成绩信息管理、系统管理、网站公告管理和校园资讯等多个功能…

特殊矩阵的压缩存储

一维数组的存储结构 ElemType arr[10]; 各数组元素大小相同&#xff0c;且物理上连续存放。 数组元素a[i]的存放地址 LOC i * sizeof(ElemType)。&#xff08;LOC为起始地址&#xff09; 二维数组的存储结构 ElemType b[2][4];二维数组也具有随机存取的特性&#xff08;需…

中立性DEA交叉效率评价方法

今天推出中立性DEA模型的计算工具 参考文献&#xff1a;《中立性DEA交叉效率评价方法》袁剑波&#xff0c;吴立辉&#xff0c;魏思 中立性DEA交叉效率评价方法 在数据包络分析&#xff08;DEA&#xff09;对决策单元效率评价的方法中&#xff0c;对抗性DEA交叉效率方法把所有…

【Visual Studio】解决 CC++ 控制台程序 printf 函数输出中文和换行符显示异常

问题描述 C&C 控制台程序 printf 函数输出中文和换行符 \n 显示异常。 #include <stdio.h>int main() {int choice;printf("菜单:\n");printf("1. 选项一\n");printf("2. 选项二\n");printf("3. 选项三\n");printf("…

【dvwa靶场:XSS系列】XSS (Stored)低-中-高级别,通关啦

更改name的文本数量限制大小&#xff0c; 其他我们只在name中进行操作 【除了低级可以在message中进行操作】 一、低级low <script>alert("假客套")</script> 二、中级middle 过滤了小写&#xff0c;咱们可以大写 <Script>alert("假客套…

【Linux】深入理解进程控制:从创建到终止和进程等待

文章目录 进程创建fork函数如何用fork函数创建子进程写实拷贝 进程终止错误信息exit_exit 进程等待waitwaitpid 总结 进程创建 fork函数 fork 函数是 Unix/Linux 系统中用于创建新进程的系统调用。调用 fork 后&#xff0c;当前进程&#xff08;父进程&#xff09;会被复制&a…

【java】对象的内存存储

目录 对象在内存中的分配设计到的内存结构(理论)类中对象的内存解析创建类的一个对象&#xff0c;属性赋值创建类的多个对象&#xff0c;属性赋值 对象在内存中的分配设计到的内存结构(理论) 栈&#xff1a;方法内定义的变量&#xff0c;存储在栈中 堆&#xff1a;new出来的结…

【wrl2stl】WRL文件转STL文件-Python

之前有一篇博客写了Avizo自动化批量导出wrl文件&#xff1a;【Avizo&Python】离散颗粒的分割、网格化与单颗粒批量自动保存wrl文件_avizo python-CSDN博客 还有一篇写了wrl转为xyz格式文件&#xff1a; Wrl文件转XYZ文件-Python_python 打开wrl三维模型-CSDN博客 在这篇…