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

新网免费做网站天琥设计培训

新网免费做网站,天琥设计培训,最新注册域名查询,大连房地产网站建设jspdf html2canvas 此方案有很多的css兼容问题,比如虚线边框、svg、页数多了内容显示不全、部分浏览器兼容问题,光是解决这些问题就耗费了我不少岁月和精力 后面了解到新的技术方案: jspdf html-to-image npm install --save html-to-i…

jspdf + html2canvas

此方案有很多的css兼容问题,比如虚线边框、svg、页数多了内容显示不全、部分浏览器兼容问题,光是解决这些问题就耗费了我不少岁月和精力

后面了解到新的技术方案:

jspdf + html-to-image

npm install --save html-to-image
npm install --save jspdf 

原理都是一样,先将html转成图片,再分页生成pdf

区别在于html-to-image可以生成多种格式,并且没有发现html2canvas上的css兼容问题
可根据自己需求来调用对应的api
我这里用的是toCanvas
新建公共js文件

// 导出页面为PDF格式
import JSPDF from "jspdf";
import { toCanvas  } from 'html-to-image'/**** elementName: 需要输出PDF的DOM的id*/
export const  ExportSavePdf = (elementName,pageTotal) =>{var element = document.getElementById(elementName)return new Promise((resolve) => {toCanvas(element,{ useCORS: true ,allowTaint:true}).then(function(canvas) {var pdf = new JSPDF("p", "mm", "a4") // A4纸,纵向var ctx = canvas.getContext("2d")ctx.scale(2, 2);var a4w = 210;var a4h = 297 // A4大小,210mm x 297mm,四边各保留20mm的边距var imgHeight = Math.floor(a4h * canvas.width / a4w) // 按A4显示比例换算一页图像的像素高度var renderedHeight = 0let pageNum = 0;while (renderedHeight < canvas.height ) {pageNum ++ var page = document.createElement("canvas")page.width = canvas.widthpage.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", 0, 0, a4w, Math.min(a4h, a4w * page.height / page.width)) // 添加图像到页面,保留10mm边距renderedHeight += imgHeightif (renderedHeight < canvas.height && pageNum < pageTotal) { pdf.addPage() } // 如果后面还有内容,添加一个空页// delete page;}//这里可根据自己需求返回不同类型的数据resolve(pdf.output('blob'))}).catch(function (error) {console.error(error)resolve(false)})})
}

在vue页面引入后调用

//pageTotal表示当前pdf的总页数,这个可以在预览的时候计算出来
ExportSavePdf('pdfBox', _this.pageTotal).then((res) => {if (res === false) {this.$message.error('保存失败!');return;}//获取的blob格式数据let pdfBlob = res;//后面是将blob数据上传到oss,这里的可以根据自己需求来getOss({})});

当然也有部分兼容问题,下面是我项目中遇到的问题以及我的解决方案:

// 解决兼容问题,在保存之前调用,注意使用$nextTickcompatibilityProblem() {// 去掉所有标签中的包含“v:”的属性const elements = Array.from(document.querySelector('#pdfBox').getElementsByTagName('*'));for (var i = 0; i < elements.length; i++) {var attributes = elements[i].attributes;// 遍历当前标签的所有属性for (var j = attributes.length - 1; j >= 0; j--) {var attributeName = attributes[j].name;// 如果属性名称中包含 "v:",则移除该属性if (attributeName.includes('v:')) {elements[i].removeAttribute(attributeName);}}}// 去掉拼音a的宋体样式const songSpan = Array.from(document.querySelectorAll('#pdfBox span[style*="font-family:SimSun"]'));const aList = ['a', 'ā', 'á', 'ǎ', 'à'];const aSpan = songSpan.filter((item) => aList.indexOf(item.innerText) !== -1);for (let a of aSpan) {a.style.fontFamily = 'inherit';}// 解决图片跨域问题let imgs = Array.from(document.querySelectorAll('#pdfBox img'));for (let item of imgs) {item.onload = function () {const protocol = window.location.protocol.replace(':', '');if (item.getAttribute('src').split('://').length) {const imgProtocol = item.getAttribute('src').split('://')[0];const src = item.getAttribute('src');if (imgProtocol !== protocol) {item.setAttribute('src', src.replace(imgProtocol, protocol));}}item.setAttribute('crossorigin', 'anonymous');};}},
http://www.yayakq.cn/news/118126/

相关文章:

  • 自己在本地建的网站 别人怎么访问教程做一个网站需要哪些资源
  • 网站开发微信小程序需求量大吗做手机网站兼容
  • 石家庄建站模板厂家网站美观界面
  • 如何做旅游攻略网站建设银行 上海 招聘网站
  • 网站建设对旅游意义建网站有什么用
  • 送菜网站制作全网营销推广软件
  • 响应式网站模板代码织梦xml网站地图
  • 哪些网站可以做网站企业网站icp备案申请
  • 网站备案填写网站名称wordpress系统怎么样
  • 郑州网站建设伟置如何在百度搜索到自己的网站
  • 南海网站设计电影网站app怎么做的
  • 西安 网站 制作erp系统排行榜
  • 关于色彩搭配的网站网站建设市场调查报告
  • 建站服务器多少钱女教师遭网课入侵视频大全集
  • 网站收录下降原因省建设厅网站查询
  • 潍坊网站建设 世纪环球16楼企业老板培训课程
  • 崇信门户网站留言回复美工培训班学校
  • 全屏网站模版如何建立一个自己的网站?
  • seo优化网站技术排名百度推广网站建设服务周到
  • 宁夏自治区住房城乡建设厅网站wordpress左右滑动插件
  • 做配件出口上什么网站浏览器打开自己做的网站
  • WordPress网站远程访问seo优化的方法有哪些
  • 做网站 什么后缀wordpress怎么加目录
  • 网站建设企业合作邀请函大一网页设计个人网站代码
  • 村建站属于哪个部门朋友要给我做网站
  • 网站建设的书籍程序员能转行做网站维护不
  • 莱芜营销型网站制作云南品牌网站开发
  • 如何联系网站wordpress 类似的
  • 常州网站seo全屋定制十大名牌是哪些
  • 株洲网站制作与设计杭州最好的网站设计公司