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

数据量太大使用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结构

效果

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

字节码基础

基本概念 java中的字节码&#xff0c;英文bytecode。是java代码编译后的中间代码格式。JVM需要读取并解析字节码才能执行相应的任务。java字节码是JVM的指令集。JVM加载字节码格式的class文件。校验之后通过JIT编译器转换成本机机器代码执行。 java字节码简介 1、java byteco…

指针的奥秘(四):回调函数+qsort使用+qsort模拟实现冒泡排序

指针 一.回调函数是什么&#xff1f;二.qsort函数使用1.qsort介绍2.qsort排序整型数据3.qsort排序结构体数据1.通过结构体中的整形成员排序2.通过结构体中的字符串成员排序 三.qsort模拟实现冒泡排序 一.回调函数是什么&#xff1f; 回调函数就是一个通过函数指针调用的函数。 …

华为机试打卡 HJ2 计算某字符出现次数

要机试了&#xff0c;华孝子求捞&#xff0c;功德 描述 写出一个程序&#xff0c;接受一个由字母、数字和空格组成的字符串&#xff0c;和一个字符&#xff0c;然后输出输入字符串中该字符的出现次数。&#xff08;不区分大小写字母&#xff09; 数据范围&#xff1a; 1≤&a…

47.乐理基础-音符的组合方式-连线

连线与延音线长得一模一样 它们的区别就是延音线的第三点&#xff0c;延音线必须连接相同的音 连线在百分之九十九的情况下&#xff0c;连接的是不同的音&#xff0c;如下图的对比&#xff0c;连线里的百分之1&#xff0c;以现在的知识无法理解&#xff0c;后续再写 在乐谱中遇…

Linux提权--定时任务--打包配合 SUID(本地)文件权限配置不当(WEB+本地)

免责声明:本文仅做技术交流与学习... 目录 定时任务 打包配合 SUID-本地 原理: 背景: 操作演示: 分析: 实战发现: 定时任务 文件权限配置不当-WEB&本地 操作演示: 定时任务 打包配合 SUID-本地 原理: 提权通过获取计划任务执行文件信息进行提权 . 1、相对路径和…

Linux常见指令2️⃣

目录 cp指令&#xff08;重要&#xff09; mv指令&#xff08;重要&#xff09; cat、tac head、tail指令&#xff08;重要&#xff09; 知识点 时间相关的指令 知识点&#xff1a; Cal指令 grep 指令 zip/unzip指令 知识点 cp指令&#xff08;重要&#xff09; 语法…

K-CU12和利时工控单元

K-CU12和利时工控单元。控制策略组态&#xff0c;使用专用的组态软件 人机界面HMI设计&#xff1a;操作员站画面设计&#xff0c;使用专用的组态软件 K-CU12和利时工控单元文件组态 2文档管理软件 在工程师站上进行系统组态的主要工作&#xff1a; K-CU12和利时工控单元。系统配…

1067: 有向图的邻接表存储强连通判断

解法&#xff1a; 定理&#xff1a;有向图G是强连通图的充分必要条件是G中存在一条经过所有节点的回路 跟上道题一样 这是错误代码 #include<iostream> #include<vector> using namespace std; int arr[100][100]; void dfs(vector<bool>& a,int u) {a…

数据分析的统计推断

数据分析的统计推断 前言一、提出问题二、统计归纳方法三、统计推断四、统计推断步骤如何进行统计推断统计推断的基本问题点估计区间估计总体方差已知总体方差未知 假设检验假设检验的假设显著性水平 五、检验统计量常见的检验统计量 六、检验方法七、拒绝域八、假设检验步骤九…

如何使用活字格批量导入照片到数据表

活字格是一款功能强大的电子表格软件&#xff0c;除了基本的表格计算功能之外&#xff0c;还提供了丰富的扩展功能&#xff0c;可以用来实现各种自动化操作。例如&#xff0c;我们可以使用活字格来批量导入照片到数据表中。 以下是具体的操作步骤&#xff1a; 在活字格工作表…

离线修复.dll,Microsoft Visual C++

在安装mysql时遇到下面的问题&#xff0c;如果是有网络的情况下微软管网下载安装就行了&#xff0c;用的服务器不允许连接互联网。 后面经过寻找&#xff0c;找到了一个修复工具&#xff0c;可一次修复所有的问题&#xff0c;特别好用分享给宝子们。 下载链接&#xff1a;http…

SM935,SM942,SM150和利时备件

SM935,SM942,SM150和利时备件。组态软件&#xff0c;可组态控制图、机柜布置图、电源分配图等&#xff0c;可编辑、编译、SM935,SM942,SM150和利时备件。工程师站组态的基本步骤&#xff1a;SM935,SM942,SM150和利时备件。 1. 根据生产现场的控制方案画出控制系统原理图 2. 根据…

Request请求数据 (** kwargs参数)

这里写目录标题 &#x1f31f;前言&#x1f349;request入门1. params2. data3. json4. headers5. cookies6. auth7. files8. timeout9. proxies10. allow_redirects11. stream12. verify13. cert &#x1f31f;总结 &#x1f31f;前言 在Python中&#xff0c;发送网络请求是一…

设计模式——结构型模式——代理模式(静态代理、动态代理:JDK、CGLIB)

目录 代理模式 代理模式简介 代理模式的分类 代理模式组成 代理模式的优缺点 静态代理 背景前置 编写代码 JDK动态代理 编写代码 使用Arthas分析JDK动态代理底层原理 CGLIB动态代理 编写代码 三种代理的对比 代理模式使用场景 代理模式 代理模式简介 代理模式属…

数据可视化第五天(读取文件获得男生女生身高信息,并且可视化在一个图像)

文件 需要学生文件的可以私信我 过程 利用numpy的loadtxt文件读取学号&#xff0c;性别&#xff0c;和身高。 import numpy as np import matplotlib.pyplot as pltfilename/Users/oommnn/Desktop/python学习/数据分析/网课资料/第04天/student-data.txtuser_infonp.dtype(…

智慧公厕:数据驱动的公共厕所智慧化管理

公共厕所作为城市基础设施的重要组成部分&#xff0c;对于城市居民的生活质量和城市形象有着不可忽视的影响。然而&#xff0c;传统的公共厕所管理模式存在诸多问题&#xff0c;如设施老化、卫生状况不佳等&#xff0c;严重限制了公众对于公共厕所的使用体验。随着大数据和智能…

EDA设计学习笔记2:STM32F103C8T6最小系统板的仿绘

今日开始仿制练习一个STM32F103C8T6最小系统板&#xff0c;通过对这个最小系统板的仿制&#xff0c;达到对自己PCB设计的练习的目的&#xff0c;最终目标是自己设计出一块PCB&#xff0c;做一个OLED的桌面小摆件...... 也不知道画出来能不能用..... 目录 主控芯片的搜索与放置…

proteus示波器不弹出来

运行后示波器没有弹出来 点击调试&#xff08;Debug&#xff09;在点击Digital Oscilloscope 完成

SamFirm Reborn 0.3.6.8三星固件下载器 汉化版

介绍 在三星手机的维护和升级过程中&#xff0c;固件的获取往往成为了一个难题。幸运的是&#xff0c;有一群热爱技术的开发者们&#xff0c;他们开发了各种工具以简化这个过程。今天&#xff0c;我们要介绍的是一款名为SamFirm Reborn 0.3.6.8的三星固件下载器的汉化版。它旨在…

目前公认的一些好用AI工具

ChatGPT&#xff1a;这是一个广泛推荐和使用的AI聊天机器人&#xff0c;能够进行高效的文本生成和对话管理。它在多个证据中被提及&#xff0c;显示其普遍性和实用性。 Midjourney&#xff1a;这是一款强大的AI绘画工具&#xff0c;特别适合创意写作和图像生成。它在多个来源中…