相关文章推荐
寂寞的日光灯  ·  laravel 对查询结果的二次筛选-CSDN博客·  12 月前    · 
骑白马的海龟  ·  javax.validation.const ...·  1 年前    · 
风流倜傥的饭卡  ·  安卓可拖拽悬浮按钮二 - 简书·  1 年前    · 
光明磊落的镜子  ·  在MailBody中发送Excel表格 - ...·  1 年前    · 
Code  ›  前端导出pdf功能 - 墨天轮
pdf canvas canvas元素 html2canvas
https://www.modb.pro/db/45880
伤情的毛巾
1 年前
  • 学习
    • 课程中心
      推荐优质内容、热门课程
    • 学习路径
      预设学习计划、达成学习目标
    • 知识图谱
      综合了解技术体系知识点
    • 课程库
      快速筛选、搜索相关课程
    • 视频学习
      专业视频分享技术知识
    • 电子文档
      快速搜索阅览技术文档
  • 文档
  • 工具
    • SQLRUN
      在线数据库即时SQL运行平台
    • 数据库在线实训平台
      实操环境、开箱即用、一键连接
    • Oracle巡检
      简单两步,查看报告分析
    • AWR分析
      上传AWR报告,查看分析结果
    • SQL格式化
      快速格式化绝大多数SQL语句
    • SQL审核
      审核编写规范,提升执行效率
    • PLSQL解密
      解密超4000字符的PL/SQL语句
    • OraC函数
      查询Oracle C 函数的详细描述
    • Bethune X
      数据库智能监控巡检平台,90天试用
  • 暂无图片
    • 数据库
    • 云计算
    • 数据产品
    • 中间件
    • 操作系统
    • 芯片
  • 我的订单
  • 登录后可立即获得以下权益
    免费培训课程
    收藏优质文章
    疑难问题解答
    下载专业文档
    签到免费抽奖
    提升成长等级
    立即登录
    登录 注册
      • 登录 注册
    • 首页
    • 资讯
    • 数说
    • 活动
    • 大会
    • 课程
    • 文档
    • 排行
    • 问答
    • 云市场
    • 我的订单
    暂无图片
    觉得内容不错?
    一键收藏 方便随时查看
    暂无图片
    暂无图片
    微信扫码
    复制链接
    新浪微博
    分享数说
    暂无图片
    采集到收藏夹
    分享到数说
    首页 / 前端导出pdf功能

    前端导出pdf功能

    瘦七斤改名字 2021-03-02
    838

    实现思路:将html页面生成pdf文件,需首先将页面转换为图片,然后再输出成pdf。

    一、先引入html2canvas

    npm install html2canvas
    

    二、项目内引入

    import html2canvas from 'html2canvas'
    

    三、生成方法

    <div v-if="detail.type === 'article'" class="popover-item flex" @click="$emit('downPdf')"> <div>导出PDF</div> downPdf () { let _this = this document.documentElement.scrollTop = 0 let canvas = document.createElement("canvas") // 生成canvas上下文 let context = canvas.getContext("2d") let _articleHtml = document.getElementById('article-content') let _w = _articleHtml.clientWidth //获取需要导出pdf区域的宽度和高度 let _h = _articleHtml.clientHeight let scale = 3 将画布宽&&高放大三倍,提高清晰度 if(_w >_h){ _h = _w canvas.width = _w * scale canvas.height = _h * scale context.scale(scale, scale) let opts = { scale: 1, width: _w,//dom 原始宽度 height: _h, canvas: canvas, useCORS: true //允许canvas画布内可以跨域请求外部链接图片, 允许跨域请求。 // 以上部分都是为了强化清晰度的,放大canvas画布 html2canvas(_articleHtml, opts).then(canvas => { _this.createPdfAll(canvas, scale)

    将获取到的图片转为pdf有两种方案,一种是自定义宽高,一种是转为a4大小。

    自定义宽高
    createPdfAll (canvas, scale) {
          let contentWidth = canvas.width / scale 
          let contentHeight = canvas.height / scale
          let pdf = new jsPDF('', 'pt', [contentWidth, contentHeight])  //自定义宽高
          let pageData = canvas.toDataURL('image/jpeg', 1.0) //转换图片为dataURL
          pdf.addImage(pageData, 'JPEG', 0, 0, contentWidth, contentHeight) //添加图像到页面
          pdf.save(`${this.detail.title}.pdf`)
    

    转为A4(有个坑)

    createPdfPage (canvas) {
       let contentWidth = canvas.width
       let contentHeight = canvas.height
       let pageHeight = contentWidth / 592.28 * 841.89
       let leftHeight = contentHeight
       // pdf页面向上偏移
       let position = 0
       // a4纸的尺寸[595.28,841.89],html页面生成的canvas在pdf中图片的宽高
       let imgWidth = 595.28
       let imgHeight = 592.28 / contentWidth * contentHeight
       let pageData = canvas.toDataURL('image/jpeg', 1.0)  //转换图片为dataURL
       let pdf = new jsPDF('', 'pt', 'a4')
       // 有两个高度需要区分,一个是html页面的实际高度,和生成pdf的页面高度(841.89)
       // 当内容未超过pdf一页显示的范围,无需分页
       if (leftHeight < pageHeight) {
         pdf.addImage(pageData, 'JPEG', 0, 0, imgWidth, imgHeight)
       } else {
         while(leftHeight > 0) {
           pdf.addImage(pageData, 'JPEG', 0, position, imgWidth, imgHeight)
           leftHeight -= pageHeight
           position -= 841.89
           //避免添加空白页
           if(leftHeight > 0) {
             pdf.addPage()
       pdf.save(`${this.detail.title}.pdf`)
    

    转换成A4纸大小,有个严重的bug:
    jspdf 他是不会自己换页的,所以他可能会把字从中间截断了,解决方案有三种:
    1、如果内容是固定的,那么你就可以计算好每一页的高度了,A4纸的高度大概是840px,那你就在差不多的高度的时候留出空白,那就不会存在截断的问题
    2、如果内容高度是后台返回前端循环出来的,那么内容是不固定的,高度也是不固定的,有三种方式解决

  • 找到需要打印的 var element = document.getElementById(“pdfDom”); 然后取到他的 childrenNodes 去循环判断每一个元素距离顶部body的高度是不是整数比,如果正好是整数的时候也就是到了换页的地方,那就直接在这里换页,剩下的换到下一页
  •  
    推荐文章
    寂寞的日光灯  ·  laravel 对查询结果的二次筛选-CSDN博客
    12 月前
    骑白马的海龟  ·  javax.validation.constraints包的注解实现校验小结_51CTO博客_javax validation constraints
    1 年前
    风流倜傥的饭卡  ·  安卓可拖拽悬浮按钮二 - 简书
    1 年前
    光明磊落的镜子  ·  在MailBody中发送Excel表格 - 问答 - 腾讯云开发者社区-腾讯云
    1 年前
    今天看啥   ·   Py中国   ·   codingpro   ·   小百科   ·   link之家   ·   卧龙AI搜索
    删除内容请联系邮箱 2879853325@qq.com
    Code - 代码工具平台
    © 2024 ~ 沪ICP备11025650号