JSpdf,前端下载大量表格数据pdf文件,不创建dom

news2024/11/17 13:19:17

数据量太大使用dom=》canvas=》image=》pdf.addimage方法弊端是canvas超出

浏览器承受像素会图片损害,只能将其切割转成小块的canvas,每一次调用html2canvas等待时间都很长累积时间更长,虽然最终可以做到抽取最小dom节点转canvas拼接数据,但是死卡

jspdf提供了不需要操作dom的方法,

Global - Documentation

 使用line方法和text方法可以通过传递线坐标和文字位置在pdf页上画线和文字,组成表格

function getStrLen(cItem, strLen) {
  let str = typeof cItem === 'string' || typeof cItem === 'number' ? cItem : 'null'
  let len = Math.ceil(str.length / strLen)
  if (len <= 1) {
    return str
  }
  str = String(str)
  let strn = ''

  for (let i = 0; i < len; i++) {
    strn = strn + str.substring(i * strLen, (i + 1) * strLen) + '\n'
  }
  return strn
}

async function downPDF(list, columns) {
  // 1in = 2.54cm = 25.4 mm = 72pt = 6pc
  let tablePdf = null
//绘制表格的参数
  let cardTop = 10, cardLeft = 7, textLeft = 9, textTop = 14, oneColumnNum = 35, oneRowNum = 7, oneCellWidth = 28, oneCellHeight = 8, oneStrLen = 5, pdfWidth = 203, pdfHeight = 290, strLen = 8
  let endPageNum = 0
//表格数据的整理
//整理格式成一个二维数组,第一层以列为单个元素,元素是整列的值组成的数组
  let testList = columns[0].children
  let propList = testList.map((item) => {
    return { prop: item.props.prop, label: item.props.label }
  })
  let dataList = []
  propList.forEach((item, index) => {
    let cArr = []
    cArr.push(item.label)
    list.forEach((cItem, cIndex) => {
      cArr.push(cItem[item.prop])
    })
    dataList.push(cArr)
  })
  console.log(dataList)

  //处理好表格数据的二维数组,配置pdf对象
  tablePdf = new jsPDF('p', 'mm', 'a4');
//解决中文乱码
  tablePdf.addFont("/fonts/SourceHanSansCN-Normal.ttf", "SourceHanSans", "normal")
  tablePdf.setFont("SourceHanSans");//1)doc中设置
  font: "SourceHanSans" // 2)style中设置
  tablePdf.setLineWidth(0.1)
  tablePdf.setFontSize(8)
  tablePdf.line(cardLeft, cardTop, pdfWidth, cardTop);
  let columnPages = Math.ceil(dataList.length / oneRowNum) + 1
  let rowPages = Math.ceil(dataList[0].length / oneColumnNum) + 1
  let currentData = []
  for (let i = 1; i < columnPages; i++) {
//横向分页
    let currentColumnData = dataList.slice((i - 1) * oneRowNum, i * oneRowNum)
//纵向分页
    for (let rowInddex = 1; rowInddex < rowPages; rowInddex++) {
      currentData = currentColumnData.map((item, index) => {
        return item.slice((rowInddex - 1) * oneColumnNum, rowInddex * oneColumnNum)
      })
      currentData.forEach((item, index) => {
        item.forEach((cItem, cIndex) => {

          cItem = getStrLen(cItem, strLen)
          //填文字,超过长度换行
          tablePdf.text(cItem, textLeft + index * oneCellWidth, textTop + cIndex * oneCellHeight, 'left')
          //画一次横线
          if (index === currentData.length - 1) {
            tablePdf.line(cardLeft, cardTop + cIndex * oneCellHeight, pdfWidth, cardTop + cIndex * oneCellHeight);
            //画最后一条横线
            if (cIndex === item.length - 1) {
              tablePdf.line(cardLeft, cardTop + (cIndex + 1) * oneCellHeight, pdfWidth, cardTop + (cIndex + 1) * oneCellHeight);
              endPageNum = item.length
              let ks = (pdfHeight - cardTop) / oneColumnNum
              for (let l = 0; l < oneRowNum + 1; l++) {
                tablePdf.line(cardLeft + l * oneCellWidth, cardTop, cardLeft + l * oneCellWidth, endPageNum * ks + cardTop);
              }
            }
          }

        })
      });
      if (rowInddex + 1 !== rowPages) {
        tablePdf.addPage();
      }
    }
    if (i + 1 !== columnPages) {
      tablePdf.addPage();
    }
  }
  tablePdf.save('dd.pdf')
}

 数组datalist结构

效果

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1656053.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

[附源码+视频教程]暗黑纪元H5手游_架设搭建_畅玩三网全通西方3D世界_带GM

本教程仅限学习使用&#xff0c;禁止商用&#xff0c;一切后果与本人无关&#xff0c;此声明具有法律效应&#xff01;&#xff01;&#xff01;&#xff01; 教程是本人亲自搭建成功的&#xff0c;绝对是完整可运行的&#xff0c;踩过的坑都给你们填上了 一. 演示视频 暗黑纪…

Android 查看CUP占用率

查看每个进程CUP占用率的几种方式,由于自己充电界面老是导致整机温度过高&#xff0c;后面发现自己的线程一直在跑&#xff0c;相当于死循环&#xff0c;后面加上sleep才得以改善&#xff1b;先看看几种查询方式吧。 1、adb shell top 2、adb shell busybox top 3、adb shell …

C++类和对象中篇

&#x1f407; &#x1f525;博客主页&#xff1a; 云曦 &#x1f4cb;系列专栏&#xff1a;[C] &#x1f4a8;路漫漫其修远兮 吾将而求索 &#x1f49b; 感谢大家&#x1f44d;点赞 &#x1f60b;关注&#x1f4dd;评论 文章目录 &#x1f4d4;前言&#x1f4d4;1、类的六个…

微服务学习笔记

微服务学习笔记 文章目录 微服务学习笔记认识微服务微服务技术栈微服务学习要点微服务远程调用1)注册RestTemplate2) 服务远程调用RestTemplate Eureka注册中心简介操作过程搭建EurekaServer注册user-service在order-service完成服务拉取 Ribbon负载均衡IRule负载均衡策略饥饿加…

在线扭蛋机小程序:商家稳占市场的新突破口

近几年&#xff0c;扭蛋机进入了爆发期&#xff0c;动漫、游戏的发展更是推动了市场的发展&#xff0c;我国扭蛋机正在蓬勃发展中。 不过&#xff0c;在市场规模扩大下&#xff0c;扭蛋机行业的竞争力也在同时加大&#xff0c;企业商家需要在市场竞争中寻求发展新思路&#xf…

SEQUENTIAL CONSISTENCY----SC

SC模型是最直观的memory consistency model; 什么是single core sequential? 真正的执行顺序&#xff0c;和PO的顺序&#xff0c;是相同的&#xff1b; 什么是multi core sequential consistent? the operations of each individual processor (core) appear in this seq…

【知识碎片】2024_05_08

记录了两个代码和一个C语言switch的题。代码【错误的集合】使用到了hash&#xff0c;【密码检查】是对多个字符串输入的检查&#xff0c;有一些条件细节。两个代码都是关于数组内容操作的题目。 每日代码 1.错误的集合 错误的集合-力扣&#xff08;LeetCode 也是数组的操作&…

EOS智慧营销系统:突破传统,引领智慧营销新潮流

在数字化时代&#xff0c;智慧营销被誉为企业提升竞争力的关键。而EOS智慧营销系统作为一款领先于时代潮流的创新软件&#xff0c;正以其卓越的功能和不可替代的优势&#xff0c;引领着营销智能化的新时代。 EOS智慧营销系统的独特之处在于其全面而细致的市场分析能力。通过大数…

印染工厂5G智能制造数字孪生可视化平台,推进行业数字化转型

印染工厂5G智能制造数字孪生可视化平台&#xff0c;推进行业数字化转型。印染工厂正迈入一个全新的时代&#xff0c;这个时代以5G智能制造数字孪生可视化平台为核心&#xff0c;推动整个行业的数字化转型。不仅是一场技术革命&#xff0c;更是一次产业变革&#xff0c;为印染工…

IP SSL证书申请教程:实现HTTPS加密访问

随着网络安全意识的提高&#xff0c;HTTPS加密访问已经成为网站安全性的重要标准。通过安装SSL证书&#xff0c;网站可以实现数据的加密传输&#xff0c;有效保护用户隐私和数据安全。本文将详细介绍如何为IP地址申请SSL证书&#xff0c;并实现HTTPS加密访问。 一、准备工作 …

常用目标检测算法介绍

目录 1. 常用目标检测算法 2. R-CNN 模型 3. Fast R-CNN 模型 4. Faster R-CNN 模型 5. SSD 模型 1. 常用目标检测算法 在深度学习框架下&#xff0c;目标检测方法通常涉及图像定位和分类两个关键方面。有两种主要的解决方法&#xff1a;一种是一阶&#xff08;one-stage&…

【JAVA进阶篇教学】第十一篇:Java中ReentrantLock锁讲解

博主打算从0-1讲解下java进阶篇教学&#xff0c;今天教学第十篇&#xff1a;Java中ReentrantLock锁讲解。 在Java并发编程中&#xff0c;保证多线程环境下的数据安全是至关重要的。ReentrantLock 是Java中用于实现线程安全的一种锁机制。本篇博客将深入介绍 ReentrantLock 的原…

商场超市会员日活动怎么群发短信营销

商场超市会员日活动怎么群发短信营销 短信营销的优势 短信营销是一种直接有效的市场推广方式&#xff0c;它具有以下优势&#xff1a; 高开放率&#xff1a;相比于其他营销方式&#xff0c;具有较高的开放率&#xff0c;因为手机用户几乎每天都会查看。 即时性&#xff1a;群…

[单片机课设]十字路口交通灯的设计

题目要求&#xff1a; 模拟交通灯运行情况。南北绿灯亮30秒&#xff0c;南北黄灯亮3秒&#xff0c;东西红灯亮33秒&#xff1b;南北红灯亮33秒&#xff0c;东西绿灯亮30秒&#xff0c;东西黄灯亮3秒&#xff1b;要求数码管同步显示时间的倒计时&#xff0c;用定时器实现延时。…

DELL EMC unity存储系统如何初始化

在客户的存储使用过程中&#xff0c;经常会碰到一些场景需要对存储系统做重新初始化&#xff0c;就是回到出厂时候的配置。比如&#xff0c;客户设备要利旧&#xff0c;二次使用&#xff0c;一般都要回到出厂状态做重新配置的动作。存储严重故障&#xff0c;没有能力修复或者数…

Python AI库pandas读写数据库的应用操作——以sqlite3为例

Python AI库pandas读写数据库的应用操作——以sqlite3为例 本文默认读者具备以下技能&#xff1a; 熟悉python基础知识&#xff0c;vscode或其它编辑工具 已阅读Pandas基础操作文章,了解pandas常见操作 具备自主扩展学习能力 在数据分析和人工智能领域&#xff0c;pandas库和s…

用得助全媒体呼叫中心,让AI落到实处帮品牌做营销

怎么让人工智能落到实处的帮助到我们&#xff1f;我们今天来讲讲中关村科金得助全媒体呼叫中心是怎么让AI帮品牌。 这次聊的案例是知名的护肤品牌&#xff0c;该品牌在中国功能性护肤品市场占有率达到20.5%&#xff0c;这么高的市场占有率客户的咨询量也是非常庞大的&#xff0…

基于C++基础的函数模块

在C中&#xff0c;函数是一段封装了某种功能的代码块&#xff0c;可以在程序的不同地方重复使用。函数定义包含如下组成部分&#xff1a; 函数头&#xff1a;函数头包括函数返回类型、函数名和参数列表。函数返回类型规定了函数返回的数据类型&#xff0c;函数名是函数的唯一标…

【Git】Git在Gitee上的基本操作指南

文章目录 1. 查看 git 版本2. 从Gitee克隆仓库&#xff1a;3. 复制文件到工作目录&#xff1a;4. 将未跟踪的文件添加到暂存区&#xff1a;5. 在本地提交更改&#xff1a;6. 将更改推送到远程仓库&#xff08;Gitee&#xff09;&#xff1a;7. Windows特定提示&#xff1a; 1. …

中仕公考:你的专业在事业编招聘中适合报哪些岗位?

英语专业适合岗位:对外翻译、办公室行政助理、办公室秘书、文化和旅游厅、知识产权局对外纠纷、英语教师等部门 艺术设计适合岗位:电视台、艺术馆、美术馆、博物馆、建筑、市政规划、群艺馆、公共事业管理、水利厅等部门 计算机专业适合岗位:图书馆、气象部门、信息化中心、测…