【html转pdf】html页面导出为pdf文件,纯html版本,简单实现pdf转换【html2canvas+jspdf】

article/2025/9/11 17:29:32

前言

最近遇到的需求,把html转成pdf文件下载导出。
目前网上看了下,有三种方法,但是其中两种需要后端配合
一种是纯前端实现的,比较简单。所以就使用了这种。
也就是html2canvas + jspdf 的这种方法
这种方法实现的思路就是,通过html2canvas 把元素内的数据截图出来成一个图片
然后把这个图片通过jspdf 方法转成pdf格式输出出来
但是也有缺点,就是只是一个图片,而且清晰度也没有那么高。
只能说勉强实现一个需求,先应付一下,后续会继续看其他的写法,然后更新

效果图

这里是导出来后的效果,pdf格式的。只有一页
在这里插入图片描述
这里是网页上的,这个报告都是我排班出来的,图片和数据都是网上随便复制的,点击导出后会生成一个pdf文件。右边一大串的是base64格式的图片地址。也就是截图。
在这里插入图片描述

代码

这是html版本的,然后引入了vue的框架。
这里核心的是要引入html2canvas.js和jspdf.debug.js
资源的话我上传了,可以点击我的资源去下载,我设置了0积分下载,应该是可以直接下载
如果你们用的是纯vue版本,那就简单了。直接npm 下载这两个插件就行。

第一个.将页面html转换成图片 npm install --save html2canvas
第二个.将图片生成pdf npm install jspdf --save

<!DOCTYPE html>
<html><head><meta charset='UTF-8'><!-- 先引入 Vue --><script src='vue.js'></script><!-- 引入element-UI组件 --><script src='element.js'></script><link rel='stylesheet' href='element-index.css'><!-- 引入axios --><script src='axios.min.js'></script><!-- 引入html2canvas 和 jspdf.debug--><script src='./node_modules/html2pdf/js/html2canvas.js'></script><script src='./node_modules/html2pdf/js/jspdf.debug.js'></script></head><body><div id="app"><div class="layout"><div><button @click="downBtn" style="width: 70px; height: 30px" id="download-paper">pdf导出</button></div><div ref="html2canvas" id="html2canvas"><div class="title"><div class="title_img"><img src="https://img2.baidu.com/it/u=384718229,1745978279&fm=253&fmt=auto&app=138&f=JPEG?w=500&h=461" alt="" style="width: 70px;"  crossorigin="anonymous"></div><div class="title_text"><p class="yiyuan">第一人民医院</p><p style="font-size: 18px;font-weight:bold">消化内镜检查及手术记录报告</p></div></div><div class="info1"><div class="info1left">检查号:12-10266</div><div class="info1right">仪器型号:12-10266</div></div><div class="info2"><div class="info2top"><div>姓名:王小天</div><div>性别:男</div><div>年龄:34</div><div>科别:内科</div><div>申请医师:黄小燕</div></div><div class="info2bottom"><div>病历号:12312313546546464</div><div>住院号:y229397</div><div>病区号:四病区</div><div>床位号:409</div></div></div><div class="info3"><div>检查图像:</div><div><img :src="item" alt="" class="changimg" v-for="item,index in img2" :key="index"  crossorigin="anonymous"></div></div><div class="info4"><div style="font-weight: bold;margin-bottom: 5px;">内镜所见</div><div style="font-size:14px;">食管:黏膜光滑柔软,血管纹理清晰,扩张度好,齿状线清晰。贲门:粘膜光滑,未见异常。 胃底:见一枚0.4*0. 4cm大小息肉,表面充血,予以摘除送检,粘液湖黄色,大量。胃体:粘膜色泽潮红,下部窦体交界后壁见粘膜凹陷不平,片状发红,子以活检。胃角:后壁见片状发红糜烂灶,予以活检。胃窦: 胃窦后壁见大片状食管:黏膜光滑柔软,血管纹理清晰,扩张度好,齿状线清晰。贲门:粘膜光滑,未见异常。 胃底:见一枚0.4*0. 4cm大小息肉,表面充血,予以摘除送检,粘液湖黄色,大量。胃 体:粘膜色泽潮红,下部窦体交界后壁见粘膜凹陷不平,片状发红,子以活检。胃角:后壁见片状发红糜烂灶,予以活检。胃窦: 胃窦后壁见大片状发红病灶,表面不平,部分隆起、部分凹陷,染色表面结构紊乱,予以活检。幽门: 呈圆形,开闭尚可,粘膜色泽淡红,未见出血及渍疡。十二指肠: 球部及降部未见异常。活检。幽门: 呈圆形,开闭尚可,粘膜色泽淡红,未见出血及渍疡。十二指肠: 球部及降部未见异常。</div><div style="font-weight: bold;margin-bottom: 5px;margin-top: 10px;">镜下诊断</div><div style="font-size:14px;">1,胃多发病灶性质待定2,胃底息肉镜下摘除3,胆汁反流性胃炎</div><div style="font-weight: bold;margin-bottom: 5px;margin-top: 10px;">病理号:</div><div style="font-weight: bold;margin-bottom: 5px;margin-top: 10px;">活检部位:胃底、窦体交界后壁、胃窦后壁、</div><div style="font-weight: bold;margin-bottom: 5px;margin-top: 10px;">病理诊断:</div><div style="font-weight: bold;margin-bottom: 5px;margin-top: 10px;">医生建议:</div></div><div class="info5"><div>南京索图科技有限公司</div><div>手术及诊断医师:王晓</div><div>助手:</div><div>检查日期:2022/8/27</div></div><div style="text-align:center;font-weight: bold;font-size: 14px;">仅供临床参考,不做证明材料!</div></div></div></div>
</body>
<script>new Vue({el: '#app',data() {return {img2: ['https://pics6.baidu.com/feed/562c11dfa9ec8a13d9cd9e4f08e1e488a2ecc0b1.jpeg?token=687c57c1c319d6c576d27df01e88c2cb','https://pics6.baidu.com/feed/562c11dfa9ec8a13d9cd9e4f08e1e488a2ecc0b1.jpeg?token=687c57c1c319d6c576d27df01e88c2cb','https://pics6.baidu.com/feed/562c11dfa9ec8a13d9cd9e4f08e1e488a2ecc0b1.jpeg?token=687c57c1c319d6c576d27df01e88c2cb','https://pics6.baidu.com/feed/562c11dfa9ec8a13d9cd9e4f08e1e488a2ecc0b1.jpeg?token=687c57c1c319d6c576d27df01e88c2cb','https://pics6.baidu.com/feed/562c11dfa9ec8a13d9cd9e4f08e1e488a2ecc0b1.jpeg?token=687c57c1c319d6c576d27df01e88c2cb','https://pics6.baidu.com/feed/562c11dfa9ec8a13d9cd9e4f08e1e488a2ecc0b1.jpeg?token=687c57c1c319d6c576d27df01e88c2cb','https://pics6.baidu.com/feed/562c11dfa9ec8a13d9cd9e4f08e1e488a2ecc0b1.jpeg?token=687c57c1c319d6c576d27df01e88c2cb','https://pics6.baidu.com/feed/562c11dfa9ec8a13d9cd9e4f08e1e488a2ecc0b1.jpeg?token=687c57c1c319d6c576d27df01e88c2cb',]};},mounted() {},methods: {downBtn() {let dom = document.getElementById("html2canvas");//调用方法下载html2canvas(dom, {useCORS: true, //允许跨域allowTaint: false,logging: false,letterRendering: true,ddpi: window.devicePixelRatio * 4, //将分辨率提高到特定的DPI 提高四倍scale: 4, //按比例增加分辨率background: '#fff'//pdf背景色为白色,默认是黑色的}).then((canvas) => {//返回图片dataURL,参数:图片格式和清晰度(0-1)var pageData = canvas.toDataURL('image/jpeg', 1.0);//方向默认竖直,尺寸ponits,格式a4[595.28,841.89]var pdf = new jsPDF('', 'pt', 'a4');//addImage后两个参数控制添加图片的尺寸,此处将页面高度按照a4纸宽高比列进行压缩pdf.addImage(pageData, 'JPEG', 0, 0, 595.28, 592.28 / canvas.width * canvas.height);//保存到pdf,名字是stonepdf.save('stone.pdf');});},},})
</script>
<style>#html2canvas {width: 800px;height: 1280px;padding: 20px;}.title {display: flex;justify-content: center;align-items: center;height: 100px;}.title_text {display: flex;flex-direction: column;align-items: center;}.yiyuan {font-size: 20px;font-weight: bold;color: blue;}.info1 {height: 30px;display: flex;justify-content: space-between;border-bottom: 1px solid #222;}.info2 {height: 100px;border-bottom: 1px solid #222;}.info3 {border-bottom: 1px solid #222;}.info4{border-bottom: 1px solid #222;}.info5{display: flex;justify-content: space-around;align-items: center;height: 50px;}.info2top {display: flex;justify-content: space-around;align-items: center;height: 40px;}.info2bottom {display: flex;justify-content: space-around;align-items: center;height: 40px;}.changimg {width: 180px;margin-right: 15px;}
</style></html>

细节事项

1,模糊问题通过html2canvas方法内的ddpi和scale放大控制清晰度
2,你下载的时候,导出按钮要放在上面,不能放在最下面,因为可能会由于你页面长了有滚动条,当你滚动到下面点击按钮的时候,上面滚动条看不到的部分是不会被截图的,也就是截图不全。但是如果你把按钮放在顶部,那就可以截全,哪怕下面的滚动部分看不到也可以截全,不知道是为啥。反正这个坑我是踩了,提醒你们一下。
3,这里是简单版本,所以没有分页功能,如果需要分页功能可以去网上找一下,pdf.addPage();这个方法就是添加新的分页,可以通过判断是否后面还有内容来触发这个方法,网上到处都是可以直接复制使用
这里给你们随便复制一个人的代码做参考

getPdf(title,url) {html2Canvas(document.querySelector('#pdfDom'), {allowTaint: false,taintTest: false,logging: false,useCORS: true,dpi: window.devicePixelRatio*4, //将分辨率提高到特定的DPI 提高四倍scale:4 //按比例增加分辨率}).then(canvas=>{var pdf = new jsPDF('p', 'mm', 'a4');    //A4纸,纵向var ctx = canvas.getContext('2d'),a4w = 190, a4h = 277,    //A4大小,210mm x 297mm,四边各保留10mm的边距,显示区域190x277imgHeight = Math.floor(a4h * canvas.width / a4w),    //按A4显示比例换算一页图像的像素高度renderedHeight = 0;while(renderedHeight < canvas.height) {var page = document.createElement("canvas");page.width = canvas.width;page.height = Math.min(imgHeight, canvas.height - renderedHeight);//可能内容不足一页//用getImageData剪裁指定区域,并画到前面创建的canvas对象中page.getContext('2d').putImageData(ctx.getImageData(0, renderedHeight, canvas.width, Math.min(imgHeight, canvas.height - renderedHeight)), 0, 0);pdf.addImage(page.toDataURL('image/jpeg', 1.0), 'JPEG', 10, 10, a4w, Math.min(a4h, a4w * page.height / page.width));    //添加图像到页面,保留10mm边距renderedHeight += imgHeight;if(renderedHeight < canvas.height) {pdf.addPage();//如果后面还有内容,添加一个空页}// delete page;}//保存文件pdf.save(title + '.pdf')})}————————————————
版权声明:本文为CSDN博主「inticaler」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/MICHAEL_PRINCE/article/details/118667848

4,注意这里页面的图片都是需要添加 crossorigin=“anonymous” 这句话的,这句话的意思是图片允许跨域,不然会出现图片空白的情况。
5,图片的地址如果你要测试,他只能接受http的那种或者base64格式的。不可以本地引入,像 . /xxx/xxx/xxx.png这种的路径是会报错的,我这里用的测试图片都是网络上的地址。

2023/5/22更新,如果需要导出图片格式,用这个方法就行了。其他啥也不用动

clickGeneratePicture() {let ref = this.$refs.html2canvas; // 截图区域html2canvas(ref, {backgroundColor: "#142E48"}).then(canvas => {let dataURL = canvas.toDataURL("image/png");this.dataURL = dataURL;let creatDom = document.createElement("a");document.body.appendChild(creatDom);creatDom.href = dataURL;creatDom.download = "导出的图片名";creatDom.click();}).catch(err => {this.$message({message: "图片生成失败",type: "error"});});}

http://chatgpt.dhexx.cn/article/FTK5TOZ5.shtml

相关文章

HTML页面导出为PDF(JSPDF、ITEXT、WKHTMLTOPDF)

html页面导出pdf&#xff0c;本来是一件很简单的事情&#xff0c;在浏览器直接打印(Mac快捷键为⌘p&#xff1b;Windows快捷键为ctrlp)&#xff0c;就可以把页面另存为pdf文件&#xff0c;但对于要经常把页面导出为pdf的用户来说并不友好&#xff0c;一个合格程序员的标准就是&…

html转pdf(总结五种方法Java)

html转pdf&#xff08;总结五种方法Java&#xff09; Java 实现html转pdf&#xff0c;总结五种方法。 推荐使用wkhtmltopdf,Itext 方法一&#xff1a;使用wkhtmltopdf 1、下载插件wkhtmltopdf https://wkhtmltopdf.org/downloads.html 2、本机测试 本目录下cmd进入 输入命…

Java 动态规划

Java中的动态规划 介绍 动态规划典型的被用于优化递归算法&#xff0c;因为它们倾向于以指数的方式进行扩展。动态规划主要思想是将复杂问题&#xff08;带有许多递归调用&#xff09;分解为更小的子问题&#xff0c;然后将它们保存到内存中&#xff0c;这样我们就不必在每次…

PDF如何转换成jpg图片

PDF文件转换成jpg&#xff0c;有些人一看到问题可能有点懵逼&#xff0c;其实就是PDF转换成图片了&#xff0c;只要转换器中的PDF转图片功能中图片格式支持jpg格式&#xff0c;就可以直接转换成jpg图片了&#xff0c;比如奥凯丰 PDF转换大师&#xff0c;支持PDF转jpg、PDF转png…

数据结构和算法Java实现(韩顺平)

目录 稀疏数组 队列 数组模拟队列思路 数组模拟环形队列 链表 单链表的翻转 单链表的逆序输出&#xff08;栈&#xff09; 双向链表 Jasephu 问题 栈 数组模拟 栈实现计算器 中缀表达式 计算器 逆波兰表达式 &#xff08;后缀表达式&#xff09; 中缀转后缀实现计算…

pdf文件转图片(java实现)

项目中pdf文件太大&#xff0c;在手机端打开缓慢。需要将pdf文件转换成图片。加载比较快&#xff0c;增加用户体验。话不多说&#xff0c;直接上干货。 一、在pom引入依赖的jar <!-- https://mvnrepository.com/artifact/org.apache.pdfbox/fontbox --><dependency&g…

袋鼠云与中航金网达成战略合作并成立信创大数据联合实验室

当前&#xff0c;加快推进“新基建”已成为新形势下国家稳定经济发展的重要方针&#xff0c;而作为“新基建底座”的信创产业&#xff0c;有望成为未来中国十年科技发展的核心领域。纵观信创产业近五年发展&#xff0c;产品和技术已从“基本可用”向“好用易用”大跨步迈进&…

基于java实现PDF转图片图片合成PDF

平常在工作中&#xff0c;经常需要用到pdf转换成图片或者图片转换成pdf的功能。能将pdf转换成图片的工具比较多&#xff0c;比如wps就支持转换为图片&#xff0c;不过高清的转换需要开通会员才行&#xff0c;比较麻烦。免费的转换不光清晰度有问题&#xff0c;还存在水印等&…

《Java语言程序设计(第三版 沈泽刚)》编程练习2

编程练习 2 2.1 编写程序&#xff0c;从键盘上输入一个double类型的华氏温度&#xff0c;然后将其转换为摄氏温度输出。转换公式为&#xff1a; 摄氏度 &#xff08; 5 / 9 &#xff09;&#xff08;华氏度 − 32 &#xff09; 摄氏度&#xff08;5/9&#xff09;&#xff08…

PDF怎么转换成jpg图片保存?简单几步就能解决。

在我们的日常工作和生活中&#xff0c;我们经常会和别人在线传输各种文件。但是在传输Word文档、Excel表格、PPT等格式的文件时&#xff0c;文件内容排版和布局容易出现变化。因此&#xff0c;人们在传输文件时一般都将文件转换为PDF&#xff0c;但PDF文件在手机上观看并不方便…

pdf如何转换成jpg图片?

pdf如何转换成jpg图片&#xff1f;PDF&#xff08;Portable Document Format&#xff09;是一种常见的文件格式&#xff0c;由Adobe Systems创建。与其他文档格式相比&#xff0c;它具有固定页面布局和跨平台兼容性等优点&#xff0c;因此广泛应用于电子书、论文、技术手册、合…

PDF怎么转换成jpg图片

PDF怎么转换成jpg图片&#xff1f;在日常工作中&#xff0c;PDF文件是一种非常常用的格式类型。文件存储安全性高&#xff0c;可以保护用户文件的内容&#xff0c;文件的转换也很方便。支持多种文件类型&#xff0c;可自由切换。有的朋友还是比较习惯查阅图片格式的内容&#x…

动态规划(Java)

文章目录 前言一、背包问题二、字符串转化问题三、纸牌问题四、最少贴纸数总结 前言 动态规划的目的就是避免重复计算&#xff0c;在暴力递归的过程中若在计算过程中产生了重复计算那么就可以进行动态规划的优化。以空间换时间&#xff0c;可以根据暴力递归的过程写出动态规划…

袋鼠云与中航金网达成战略合作,成立信创大数据联合实验室

当前&#xff0c;加快推进“新基建”已成为新形势下国家稳定经济发展的重要方针&#xff0c;而作为“新基建底座”的信创产业&#xff0c;有望成为未来中国十年科技发展的核心领域。纵观信创产业近五年发展&#xff0c;产品和技术已从“基本可用”向“好用易用”大跨步迈进&…

北京市委书记蔡奇调研 PingCAP 立足自主研发和开源战略,助推产业数字化转型

2021 年 3 月&#xff0c;开源正式被列入国家十四五规划发展纲要&#xff0c;可以预期&#xff0c;开源将成为中国未来发展基础软硬件技术的关键路径。**3 月 23 日上午&#xff0c;北京市委书记蔡奇一行参观考察 PingCAP&#xff08;平凯星辰&#xff09;&#xff0c;专题调研…

如何把pdf转成图片?

怎么把pdf转成图片&#xff1f;作为上班族&#xff0c;能熟练的使用各种办公软件是职场必备技能&#xff0c;特别是在处理各种类型的文件时候&#xff0c;如果能熟练的将文件格式进行相互转换&#xff0c;那不仅能提升自己的工作效率&#xff0c;也会方便跟自己对接工作的人。就…

袋鼠云与沃趣科技达成战略合作,共同驱动企业数字化升级

12月3日,袋鼠云与沃趣科技正式达成战略合作,并于袋鼠云总部举行签约仪式。沃趣科技创始人&CEO 陈栋、联合创始人&CTO 李建辉、合伙人&总裁 郭华、技术中心负责人 魏兴华,袋鼠云创始人&董事长 陈吉平、联合创始人&CEO 徐进挺、联合创始人&易知微CEO 宁海…

袋鼠云陈吉平:深耕国产自研数字化技术与服务,持续为客户创造价值

在经济面临下行压力、疫情反复等不确定因素之下&#xff0c;推动数字化转型就成为了许多企业的“救命稻草”。然而&#xff0c;较高的数字化转型门槛、不成系统的数据服务&#xff0c;以及缺乏规范的行业标准等都成了企业数字化转型路上的“绊脚石”。 ​ 2015年&#xff0c;…

陈吉平-阿里巴巴离职DBA在35岁总结的职业生涯

导读&#xff1a;去年很多朋友私下或新浪微博上在总结自己的职业生涯与职业规划&#xff0c;也感觉到很纠结与彷徨&#xff0c;尤其技术人的职业生涯&#xff0c;随年龄增加&#xff0c;一些优势逐渐丧失。4月 13 日数据库技术大会的主办方举行的晚宴上&#xff0c;也让本人支持…

从产品到平台和生态,数据中台「竞争」升级

据可靠信源&#xff0c;中国首家数据中台公司袋鼠云已于去年年底完成C轮融资&#xff0c;由中信证券领投&#xff0c;东方富海、杭州凯泰资本跟投。 这意味着自去年以来颇受争议的数据中台赛道已经有公司率先突破C轮魔咒、迈上新台阶。 创投圈存在一个“C轮死”的魔咒&#xff…