js实现html转成pdf

在项目开发的时候,我们偶尔或者是经常会遇到一些难题,关于用js吧html页面转换成pdf也是一个难题,意思是说相当于把整个页面截下来,然后保存成pdf。

其实,能够实现html转pdf的方法还是挺多的,大概有以下几种:

1、大部分浏览器就有这个功能。然而我们客户要的可不是这个,人家要的是能够在系统中主动触发的导出为pdf功能,所以这种方案pass。

2、利用第三方工具。我找到了一种利用wkhtmltopdf这种工具来导出的方案,自己在我们的项目中试了一下,效果不好,而且对svg图片的支持也不行。pass。

3、还有一种是利用iText类后台生成java文件。但因为需要导出的这个页面是动态页面,而且直接把页面传给后台会丢失大量样式,所以还是pass。

立即学习“前端免费学习笔记(深入)”;

最后没什么好的办法,只能退而求其次,想着要不先把html页面转成图片,再把图片导出为pdf。因为要支持用户导出下载,而且要保留样式,所以最好是纯js前端实现。

html转canvas的话,就用html2canvas这个js,这个网上介绍比较多了,这里就不废话了。

比较麻烦的是svg图片,直接用html2canvas无法把svg标签的内容转成canvas,最后查了一圈资料后,锁定了canvg这个js。canvg是谷歌的一个插件,可以将svg标签内容转成canvas。具体到我们的项目,还有一个难点,就是如何把glyphicons这种字体图标也转成canvas,因为在不同浏览器下对这种字体图标的支持是完全不一样的。最后找到的方法是用char code来替换这些字体图标,重新绘制成canvas。由canvas生成图片不用废话。由图片生成pdf用jsPDF实现。 折腾了大半天,总算把整个流程打通了,接下来一步一步贴上代码。

第一步:把对应dom节点里所有的svg元素替换成canvas

svg2canvas: function(targetElem) {  var svgElem = targetElem.find('svg');  svgElem.each(function(index, node) {    var parentNode = node.parentNode;    //由于现在的IE不支持直接对svg标签node取内容,所以需要在当前标签外面套一层div,通过外层div的innerHTML属性来获取    var tempNode = document.createElement('div');    tempNode.appendChild(node);    var svg = tempNode.innerHTML;    var canvas = document.createElement('canvas');    //转换    canvg(canvas, svg);    parentNode.appendChild(canvas);  });}

第二步:把glyphicons字体转成canvas。如果项目中没有用到glyphicons字体图标,可忽略这一步

glyphicons2canvas: function(targetElem, fontClassName, fontFamilyName) {  var iconElems = targetElem.find('.' + fontClassName);  iconElems.each(function(index, inconNode) {    var fontSize = $(inconNode).css("font-size");    var iconColor = $(inconNode).css("color");    var styleContent = $(inconNode).attr('style');    //去掉"px"    fontSize = fontSize.replace("px", "");    var charCode = getCharCodeByGlyphiconsName(iconName);    var myCanvas = document.createElement('canvas');    //把canva宽高各增加2是为了显示图标完整    myCanvas.width = parseInt(fontSize) + 2;    myCanvas.height = parseInt(fontSize) + 2;    myCanvas.style = styleContent;    var ctx = myCanvas.getContext('2d');    //设置绘图内容的颜色    ctx.fillStyle = iconColor;    //设置绘图的字体大小以及font-family的名字    ctx.font = fontSize + 'px ' + fontFamilyName;    ctx.fillText(String.fromCharCode(charCode), 1, parseInt(fontSize) + 1);    $(inconNode).replaceWith(myCanvas);  });}//根据glyphicons/glyphicon图标的类名获取到对应的char codegetCharCodeByGlyphiconsName: function(iconName) {  switch (iconName) {  case("glyphicons-resize-full"):    return "0xE216";  case ("glyphicons-chevron-left"):    return "0xE225";  default:    return "";  }  }

第三步:html转canvas转图片再转pdf。

html2canvas($("#myExportArea"), {  onrendered: function(canvas) {    var imgData = canvas.toDataURL('image/jpeg');    var img = new Image();    img.src = imgData;    //根据图片的尺寸设置pdf的规格,要在图片加载成功时执行,之所以要*0.225是因为比例问题    img.onload = function() {      //此处需要注意,pdf横置和竖置两个属性,需要根据宽高的比例来调整,不然会出现显示不完全的问题      if (this.width > this.height) {        var doc = new jsPDF('l', 'mm', [this.width * 0.225, this.height * 0.225]);      } else {        var doc = new jsPDF('p', 'mm', [this.width * 0.225, this.height * 0.225]);      }      doc.addImage(imgData, 'jpeg', 0, 0, this.width * 0.225, this.height * 0.225);      //根据下载保存成不同的文件名      doc.save('report_pdf_' + new Date().getTime() + '.pdf');    }  },  background: "#fff",  //这里给生成的图片默认背景,不然的话,如果你的html根节点没设置背景的话,会用黑色填充。  allowTaint: true //避免一些不识别的图片干扰,默认为false,遇到不识别的图片干扰则会停止处理html2canvas});

虽然这种方法可以将html页面转换成pdf样式,但是生成的pdf效果明显不如正常截图来的清晰,如果大家有更好的办法,欢迎指点。

相关推荐:

C#怎么将 HTML转换为图片或 PDF?

关于C#如何将Word转换成PDF的方法汇总

使用HTML生成一个PDF实例代码

以上就是js实现html转成pdf的详细内容,更多请关注创想鸟其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/1545191.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2025年12月21日 16:40:08
下一篇 2025年12月21日 16:40:19

相关推荐

  • 原生js实现下拉列表框

    模仿qq列表点击下拉,js原生实现,免费源码提供研究,拿去吧!关注创想鸟给你更多好看的! 代码: PHP中文网–下拉框ul , h2 { padding:0; margin:0; }li { list-style:none; }#list { width:240px; border:1px sol…

    2025年12月21日
    000
  • 添加或删除 HTML dom元素

    文档对象模型(document object model,简称dom),是w3c组织推荐的处理可扩展标志语言的标准编程接口。在网页上,组织页面(或文档)的对象被组织在一个树形结构中,用来表示文档中对象的标准模型就称为dom,本章内容我们就分享给大家关于添加或删除 html dom元素的教程,赶紧来学…

    好文分享 2025年12月21日
    000
  • Emmet 的 HTML 语法详解

    本文主要介绍 emmet 的 html 语法,看完之后,你就会看懂并且会写出那句代码了。现在,打开你的 st2 然后新建一个 html 文档,跟着文章,即时输入对应的指令然后亲自尝试一下!生成 html 文档初始结构html 文档的初始结构,就是包括 doctype、html、head、body 以…

    2025年12月21日
    000
  • 在HTML中插入空格的几种方法

    关于html,基本上作为程序员我们都会用到,本篇内容我们主要是针对刚入门的学员们,介绍两种在html中插入空格的方法。 方法1、插入单个空格和制表符 1、插入一个非间断空格。一般来说,无论你按多少次空格键,HTML也只会在单词之间显示一个空白间隔。当你需要插入多个空格时,请输入 或 代码。 它们名为…

    好文分享 2025年12月21日
    000
  • jquery实现手势解锁源码

    手势解锁对于我们来说肯定是很常见的,用jquery实现的手势解锁见过嘛~免费提供源码哦~~拿去研究吧~~ 代码: PHP中文网正确的密码是一个字母“Z”的形状哦!<!—-> $(“#gesturepwd”).GesturePasswd({backgroundColor:”#25273…

    2025年12月21日
    000
  • html中由元素上的鼠标点击触发的事件属性onclick

    实例 当点击按钮时执行一段 javascript: Copy Text 浏览器支持 IE Firefox Chrome Safari 立即学习“前端免费学习笔记(深入)”; Opera 所有主流浏览器都支持 onclick 属性。 定义和用法 onclick 属性由元素上的鼠标点击触发。 注释:on…

    好文分享 2025年12月21日
    000
  • html中在鼠标双击元素时触发的事件属性ondblclick

    实例 当双击鼠标按钮时执行一段 javascript: Copy Text 浏览器支持 IE Firefox Chrome Safari 立即学习“前端免费学习笔记(深入)”; Opera 所有主流浏览器都支持 ondblclick 属性。 定义和用法 ondblclick 属性在鼠标双击元素时触发…

    好文分享 2025年12月21日
    000
  • html在鼠标按钮在元素上按下时触发的事件属性onmousedown

    实例 当在段落上按下鼠标按钮时执行一段 javascript: 请点击此文本! 浏览器支持 IE Firefox Chrome Safari 立即学习“前端免费学习笔记(深入)”; Opera 所有主流浏览器都支持 onmousedown 属性。 定义和用法 onmousedown 属性在鼠标按钮在…

    好文分享 2025年12月21日
    000
  • html在鼠标指针移动到元素上时触发的函数onmousemove

    实例 当鼠标指针移动到图像上时执行一段 javascript: @@##@@ 浏览器支持 IE Firefox Chrome Safari 立即学习“前端免费学习笔记(深入)”; Opera 所有主流浏览器都支持 onmousemove 属性。 定义和用法 onmousemove 属性在鼠标指针移动…

    好文分享 2025年12月21日
    000
  • html中在鼠标指针移动到元素外时触发的事件属性onmouseout

    实例 当鼠标指针移动到图像之外时执行一段 javascript: @@##@@ 浏览器支持 IE Firefox Chrome Safari 立即学习“前端免费学习笔记(深入)”; Opera 所有主流浏览器都支持 onmouseout 属性。 定义和用法 onmouseout 属性在鼠标指针移动到…

    好文分享 2025年12月21日
    000
  • html中在鼠标指针移动到元素上时触发的事件属性onmouseover

    实例 当鼠标指针移动到图像上时执行一段 javascript: @@##@@ 浏览器支持 IE Firefox Chrome Safari 立即学习“前端免费学习笔记(深入)”; Opera 所有主流浏览器都支持 onmouseover 属性。 定义和用法 onmouseover 属性在鼠标指针移动…

    好文分享 2025年12月21日
    000
  • html中在松开鼠标按钮时触发的事件属性onmouseup

    实例 当在段落上松开鼠标按钮时执行 javascript: Click the text! 浏览器支持 IE Firefox Chrome Safari 立即学习“前端免费学习笔记(深入)”; Opera 所有主流浏览器都支持 onmouseup 属性。 定义和用法 onmouseup 属性在松开鼠…

    好文分享 2025年12月21日
    000
  • html中会在图像加载被中断时发生的事件onabort

    定义和用法 onabort 事件会在图像加载被中断时发生。 当用户在图像完成载入之前放弃图像的装载(如单击了 stop 按钮)时,就会调用该句柄。 语法 onabort=”SomeJavaScriptCode” 参数描述SomeJavaScriptCode必需。规定该事件发生时执行的 JavaScr…

    好文分享 2025年12月21日
    000
  • 几种html编辑器的优缺点总结

    不论在做前端开发还是后端开发的时候,我们都会用到编辑器,那么随之而来的就是各种各样的编辑器出现,关于html编辑器也有很多,那么哪种html编辑器最好用呢?他们的优点缺点又有那些呢?这篇文章我们主要讲了几种主流html编辑器优缺点比较 。  1. FckEditor: 优点:开源免费,完整的二次开发…

    好文分享 2025年12月21日
    000
  • html规定元素的tab(用于导航时)键控制次序的属性tabindex

    实例 带有指定 tab 键顺序的链接: W3SchoolGoogleMicrosoft 浏览器支持 几乎所有浏览器均 tabindex 属性,除了 Safari。 定义和用法 tabindex 属性规定元素的 tab 键控制次序(当 tab 键用于导航时)。 提示和注释 注释:以下元素支持 tabi…

    好文分享 2025年12月21日
    000
  • html规定关于元素的额外信息的属性title

    实例 在 html 文档中使用 title 属性: PRC was founded in 1949.W3School.com.cn 定义和用法 title 属性规定关于元素的额外信息。 这些信息通常会在鼠标移到元素上时显示一段工具提示文本(tooltip text)。 提示:title 属性常与 f…

    好文分享 2025年12月21日
    000
  • html规定是否应该翻译元素内容的translate元素

    实例 规定不应翻译某些元素: 请勿翻译本段。本段可被译为任意语言。 浏览器支持 所有主流浏览器都无法正确地支持 translate 属性。 定义和用法 translate 规定是否应该翻译元素内容。 提示:请使用 class=”notranslate” 替代。 立即学习“前端…

    好文分享 2025年12月21日
    000
  • html设置或返回用于填充绘画的颜色渐变或模式的属性fillStyle

    实例 定义用蓝色填充的矩形: JavaScript: var c=document.getElementById(“myCanvas”);var ctx=c.getContext(“2d”);ctx.fillStyle=”#0000ff”;ctx.fillRect(20,20,150,100); 浏…

    2025年12月21日
    000
  • html在源代码中插入注释标签

    实例 html 注释: 这是一段普通的段落。 浏览器支持 IE Firefox Chrome 立即学习“前端免费学习笔记(深入)”; Safari Opera 所有浏览器都支持注释标签。 定义和用法 注释标签用于在源代码中插入注释。注释不会显示在浏览器中。 您可使用注释对您的代码进行解释,这样做有助…

    好文分享 2025年12月21日
    000
  • html在元素失去焦点时触发的事件属性onblur

    实例 当用户离开输入字段时对其进行验证: 浏览器支持 IE Firefox Chrome Safari 立即学习“前端免费学习笔记(深入)”; Opera 所有主流浏览器都支持 onblur 属性。 定义和用法 onblur 属性在元素失去焦点时触发。 onblur 常用于表单验证代码(例如用户离开…

    好文分享 2025年12月21日
    000

发表回复

登录后才能评论
关注微信