Html转PDF,前端JS实现Html页面导出PDF(html2canvas+jspdf)

这篇具有很好参考价值的文章主要介绍了Html转PDF,前端JS实现Html页面导出PDF(html2canvas+jspdf)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

Html转PDF,前端JS实现Html页面导出PDF(html2canvas+jspdf)

一、背景介绍

​ 当我们在不想改变后端代码的同时想是纯html页面导出PDF,那么(html2canvas+jspdf)就是无疑最好的选择,导出时它不占用我们服务器的资源,而是由用户本地自行执行js文件下载PDF,不占用我们系统的带宽,所以这无非是最好的选择方式。

二、疑问

1、为什么要使用html2canvas,单jspdf也能实现pdf下载?

​ HTML2Canvas 和 jsPDF 是 JavaScript 库,用于在浏览器中生成 PDF 文件。

​ HTML2Canvas 用于将 HTML 元素渲染成图像,可以将整个页面或特定区域以图像形式进行捕获。这对于将复杂的 HTML 结构转换为 PDF 格式非常有用,因为它可以捕获 HTML 中的样式、布局和图像等细节。 jsPDF 是一个 PDF 生成库,它允许你通过 JavaScript 代码创建和编辑 PDF 文档。与 HTML2Canvas 结合使用,你可以将 HTML 元素渲染成图像,然后将图像插入到 jsPDF 创建的 PDF 文档中。 虽然单独使用 jsPDF 也可以实现 PDF 下载,但是在某些情况下,使用 HTML2Canvas 可能更方便。例如,当你需要将整个页面转换为 PDF 或以图像形式捕获特定区域时,HTML2Canvas 提供了更灵活的选项。然后,你可以将 HTML2Canvas 生成的图像插入到 jsPDF 中,进一步编辑和操作 PDF。 综上所述,使用 HTML2Canvas 结合 jsPDF 可以更容易地将 HTML 转换为 PDF,并提供更多灵活性和控制力。

三、所使用技术

html2canvas+jspdf

js引入:引入线上js直接使用

<!--pdf下载 -->
<script src="https://html2canvas.hertzen.com/dist/html2canvas.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/jspdf/1.5.3/jspdf.min.js"></script>
<!--jquery 方便后续使用jquery原生函数,可不引入-->
<script src="https://code.jquery.com/jquery-3.6.0.min.js"></script>

四、展示开始

1、效果展示

html页面

html2canvas导出pdf 设置边框,前端,html,pdf

下载成PDF

html2canvas导出pdf 设置边框,前端,html,pdf

2、代码部分

js引入:

<!--pdf下载 -->
<script src="https://html2canvas.hertzen.com/dist/html2canvas.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/jspdf/1.5.3/jspdf.min.js"></script>
<!--jquery 方便后续使用jquery原生函数,可不引入-->
<script src="https://code.jquery.com/jquery-3.6.0.min.js"></script>

整体流程:

  1. 先将页面通过html2canvas转换成图片
  2. (jsPDF)将转换成的图片导出成PDF的形式
<!--pdf下载 -->
<script src="assets/js/jspdf/html2canvas.js"></script>
<script src="assets/js/jspdf/jspdf.umd.min.js"></script>
<script src="https://code.jquery.com/jquery-3.6.0.min.js"></script>
<script>
    $('#downloadPDF').click(function() {
    	console.log('开始下载PDF');
    	htmlToPdf();
    });
    function htmlToPdf() {
        // 获取HTML元素
        const element = document.getElementById("layout-wrapper");
        const options = {
            dpi: 192,  //dpi属性的值为192,表示图像的分辨率
            scale: 2, //scale属性的值为2,表示图像的缩放比例。
            backgroundColor: "#F1F6FE"  //backgroundColor属性的值为"#F1F6FE",表示图像的背景颜色。
        };
        // 将元素转换为canvas对象
        html2canvas(element, options).then((canvas) => {
            var contentWidth = canvas.width;   //获取Canvas(上面元素id 'layout-wrapper')对象的宽度
            var contentHeight = canvas.height; //获取Canvas(上面元素id 'layout-wrapper')对象的高度
            // 创建jsPDF对象	
            jsPDF = jspdf.jsPDF;  //导入jsPDF库,用于创建PDF文件
            const pdf = new jsPDF('1', 'pt', [contentWidth, contentHeight]); //创建一个新的PDF对象,参数包括页面格式('1'表示A4纸张)、单位('pt')和页面尺寸([contentWidth, contentHeight])
            var pageData = canvas.toDataURL('image/jpeg', 1.0);  //将Canvas对象转换为JPEG格式的数据,并将其存储在pageData变量中。1.0表示图片质量
            pdf.addImage(pageData, 'JPEG', 0, 0, contentWidth, contentHeight);  //将JPEG格式的图片添加到PDF文件中,图片的左上角坐标为(0, 0),宽度为contentWidth,高度为contentHeight
            pdf.save("test.pdf");
        });
    }
</script>

html2canvas导出pdf 设置边框,前端,html,pdf

3、参数说明
3.1、html2canvas常用参数

html2canvas 函数接受一些常用的参数,用于配置转换后的 canvas 元素的行为和样式。以下是一些常用的参数:

  • element: 必需参数,表示需要转换为 canvas 的 HTML 元素。
  • widthheight: 可选参数,分别表示转换后的 canvas 元素的宽度和高度。如果不设置这些参数,则 canvas 元素会自动调整大小以适应所包含的 HTML 元素。
  • scale: 可选参数,表示 canvas 元素的比例。默认值为 1,表示 canvas 元素会保持原始大小。
  • border: 可选参数,表示 canvas 元素的边框宽度。默认值为 0,表示没有边框。
  • backgroundColor: 可选参数,表示 canvas 元素的背景颜色。默认值为 “#ffffff”,表示白色。
  • foregroundColor: 可选参数,表示 canvas 元素的前景色颜色。默认值为 “#000000”,表示黑色。
  • imageQuality: 可选参数,表示转换后的图像的质量。默认值为 1,表示高质量。
  • jsPDF: 可选参数,表示需要使用的 jsPDF 对象。如果不设置这个参数,则不会将 canvas 转换为 PDF 文件。

以下是一个使用 html2canvas 函数的示例,其中包含了上述参数:

html2canvas(document.getElementById("my-element"), {
 width: 800,
 height: 600,
 scale: 2,
 border: 1,
 backgroundColor: "#cccccc",
 foregroundColor: "#000000",
 imageQuality: 0.9,
 jsPDF: pdf
}).then(function(canvas) {
 // 处理转换后的 canvas 元素
});
3.2、jsPDF常用参数

jsPDF 是一个用于创建 PDF 文件的 JavaScript 库。以下是 jsPDF 常用的参数:

  1. jsPDF('1', 'pt', [width, height]): 创建一个新的 PDF 对象,其中 '1' 表示 A4 纸张(l:竖向,p:横向),'pt' 表示单位为 point,widthheight 分别表示页面宽度和高度。
  2. pdf.setFont(font, size): 设置 PDF 文件的字体和大小。其中 font 表示字体名称,如 'Helvetica''Times'size 表示字体大小。
  3. pdf.setLineWidth(width): 设置 PDF 文件的线宽。其中 width 表示线宽的像素值。
  4. pdf.drawLine(x1, y1, x2, y2): 在 PDF 文件中绘制一条直线。其中 x1y1x2y2 分别表示直线的起点和终点坐标。
  5. pdf.drawRect(x, y, width, height): 在 PDF 文件中绘制一个矩形。其中 xy 分别表示矩形左上角的坐标,widthheight 分别表示矩形的宽度和高度。
  6. pdf.drawText(text, x, y): 在 PDF 文件中绘制一段文本。其中 text 表示要绘制的文本,xy 分别表示文本的左上角坐标。
  7. pdf.save('filename.pdf'): 将 PDF 文件保存为指定的文件名。其中 'filename.pdf' 表示要保存的 PDF 文件的文件名。
  8. pdf.addImage(imageData, type, x, y, width, height): 在 PDF 文件中添加一个图像。其中 imageData 表示图像的数据,type 表示图像的类型,如 'JPEG''PNG'xy 分别表示图像左上角的坐标,widthheight 分别表示图像的宽度和高度。
  9. pdf.rotate(angle, x, y): 旋转 PDF 文件中的图像或文本。其中 angle 表示旋转的角度,xy 分别表示旋转中心的位置。
  10. pdf.translate(x, y): 将 PDF 文件中的文本或图像移动到指定位置。其中 xy 分别表示要移动的坐标。

五、常见问题

1、图片跨域

解决方案:

  • 设置配置项 allowTaint: false

    canvas 的 CanvasRenderingContext2D 属于浏览器的对象,如果渲染过跨域资源,浏览器就认定 canvas 已经被污染了 Taint:污点

  • 设置配置项 useCORS: false

    表示允许跨域资源共享,注意不能与 allowTaint 同时配置为 true

  • img 标签中添加 crossOrigin = "anonymous"

    anonymous:如果使用这个值的话就会在请求 header 中带上 Origin 属性,但请求不会带上 cookie 和客户端 ssl 证书等其他的一些认证信息

  • 图片服务器配置 Access-Control-Allow-Origin: *

    重要的配置项,是跨域问题的根本源泉,需要后端配合

2、截图锯齿

解决方案:根据设备像素比进行缩放

// 设置放大倍数
const scale = window.devicePixelRatio;

4、对 css3 支持不好

html2canvas 暂不支持的 CSS 样式属性:

background-blend-mode、background-clip: text、box-decoration-break、repeating-linear-gradient()、font-variant-ligatures、mix-blend-mode、writing-mode、writing-mode、border-image、box-shadow、filter、zoom、transform

解决方案:

对于一些必要的样式,可以选择使用图片做兜底实现

box-shadow 可以参考 这个pr,修改源码解决,但是,实际效果也不是太理想……

5、svg 标签

问题原因:vue-lottie 动画库渲染的标签是 svg(也可能是你自己写的 svg 标签)

html2canvas 对于 svg 标签的支持也不尽人意,解决办法同样是用图片做兜底

在项目中,我们是用 svg 做动画,截图的时候把动画换成一张静态图,这样只要设置要静态图的样式,截图效果还是可以接受的文章来源地址https://www.toymoban.com/news/detail-817064.html

想……

5、svg 标签

问题原因:vue-lottie 动画库渲染的标签是 svg(也可能是你自己写的 svg 标签)

html2canvas 对于 svg 标签的支持也不尽人意,解决办法同样是用图片做兜底

在项目中,我们是用 svg 做动画,截图的时候把动画换成一张静态图,这样只要设置要静态图的样式,截图效果还是可以接受的

到了这里,关于Html转PDF,前端JS实现Html页面导出PDF(html2canvas+jspdf)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • vue中使用html2canvas+jsPDF实现pdf的导出

    html2canvas依赖 jspdf依赖 pdf导出 以导出横向,A4大小的pdf为例 规律:1. html2canvas 中,在保持jsPDF中的宽高不变的情况下,设置html2canvas中的 width 和 height 值越小,导出的pdf越显示不全(会被放大,只能看到局部),反之值越大,导出的pdf越显示完整(值也不能过大,过大在pdf中就显

    2024年02月12日
    浏览(30)
  • vue前端实现将页面显示内容生成pdf文件的几种方法,html2canvas、dom-to-image、jspdf(带分页)基本使用以及介绍

    实际开发需求:vue项目中,根据数据结构生成echarts图表组件,生成带有样式的图表以后,点击下载按钮,把图表以pdf格式的文件下载到本地 实现思路:将vue界面的echarts组件生成图片,然后使用插件将生成的图片放入pdf中,再实现pdf文件的下载 涉及框架以及插件:vue、echar

    2024年01月25日
    浏览(38)
  • 前端生成pdf之html2canvas+jsPDF,以及解决图片不显示bug

    开发背景: 需要给页面中相应的内容生成pdf,查找文档后发现要用到两个插件。html2canvas 以及 jsPDF html2canvas 给dom结构转化为canvas,然后生成各种类型图片 jsPDF 把canvas 生成的图片url 转化为pdf 参数 image:表示要插入的图片资源,可以是图片文件的路径或者base64编码字符串。

    2024年02月02日
    浏览(35)
  • 【前端】html2canvas生成图片空白排查data:;(js vue react uniapp)

    因为要做一个分享图,就用到了html2canvas,一开始是好好的,今天随便测了下,发现图片显示不出来了。打印了下,生成的图片链接变成了 data:; 。后面一步一步地排查,发现是页面内容太多了,删减一点内容就能显示出来。然后我又去认真看了下html2canvas的各个参数,发现可

    2024年02月03日
    浏览(44)
  • js将html页面转为pdf

    在 JavaScript 中,可以使用以下两种方法将 HTML 页面转换为 PDF 文件: 使用第三方库,如 jsPDF 或 html2canvas。 使用浏览器的内置功能,如 window.print() 方法,可以将 HTML 页面转换为 PDF 文件。 下面是使用 jsPDF 的例子: 使用 window.print() 方法的例子: 在浏览器中,你可以使用快捷键

    2024年02月15日
    浏览(39)
  • vue 前端导出页面图表保存为Html格式文档

    问题描述: 图一 解决思路: 想要达到要求的效果,网上找了很久,最后记录下2种方案: 方案一、使用html2canvas组件,html2canvas的作用就是允许我们直接在用户浏览器上拍摄网页或某一部分的截图。它的屏幕截图是基于DOM元素的,实际上它不会生成实际的屏幕截图,而是基于

    2024年02月03日
    浏览(27)
  • 前端html2canvas生成截图【实现步骤与踩坑】

    需求 :点击下载可以导出组件的 截图 及数据信息文件 分析 :前端生成组件截图,带着其他参数传给后端,拿到excel文件并下载。关键在于生成组件的截图,这里通过 html2canvas 插件来实现。 1.下载插件 npm install html2canvas 2.引入 3.通过ref拿到要下载组件的dom元素 4.通过html2ca

    2024年04月11日
    浏览(33)
  • 若依vue 多table前端HTML页面导出一张Excel表

    导入依赖,具体前端vue配置就不介绍了,直接晒具体细节代码 js代码 点个赞吧!

    2024年02月15日
    浏览(41)
  • 前端html2canvas和dom-to-image实现截图功能

    目录 需求 历劫过程 截图知识点 html2canvas 文档地址 封装 使用教程  dom-to-image-more 文档地址 封装 使用教程 解决跨域问题 以下是我花了大把时间,薅秃头得出来的最终结果, dom-to-image-more截图时间快到可以让复杂的页面仅需2-3S就能完成截图,内容有点多,请保持耐心慢慢看

    2024年02月15日
    浏览(43)
  • VUE通用后台管理系统(四)前端导出文件(CSV、XML、HTML、PDF、EXCEL)

    常见的导出格式:CSV、XML、HTML、PDF、EXCEL 1)准备工作 安装所需相关依赖 前两个是PDF格式需要的依赖,后两个是excel格式所需,如果没有需求这两种格式的可以忽略这一步 然后画页面   页面效果 2)导出CSV格式的文件 新建src/utils/utils.js文件 写入exportCsv方法,columns为表头,

    2024年02月05日
    浏览(39)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包