1.生成pdf:

1.使用的插件:jspdfjspdf-autotablehtml2canvas
2.插件介绍:

2.1 jspdf:前端生成和导出pdf的插件;
2.2 jspdf-autotable:可以更方便的在jspdf中生成表格,可以直接传入表格数据也可以直接传入表格dom标签;jspdf本身也有生成表格的API,只是没有jspdf-autotable方便,可以根据需要选择;
2.3 html2canvas:可以截取网页中的dom元素为canvas对象,来构建屏幕截图,如果不需要此功能,可以不使用这个插件

3.jspdf API地址、jspdf-autotable样式配置参考这两个地址可以找到jspdf的大部分使用方法和配置介绍
4.demo

使用这个demo前需要注意:
1.需要自己生成simhei-normal.js/ts文件,生成方法查看上一篇文章;
如果导出内容不包含中文可以不需要这个导入,相应的注释掉下面的 doc.setFont(‘simhei’) 以及 font: ‘simhei’,
2.html2canvas中获取了相应的dom元素,需要改成自己的标签元素。


import { jsPDF } from 'jspdf'
import 'jspdf-autotable'
import './simhei-normal' //jspdf自定义字体,生成步骤参见上一篇博文
const html2canvas = window['html2canvas']export function exportPDF(filename: string) {const doc = new jsPDF() as any;doc.setFont('simhei');//simhei是自定义字体名//获取文件单页的宽高,单位mmvar pageWidth = Math.floor(doc.internal.pageSize.width || doc.internal.pageSize.getWidth());var pageHeight = Math.floor(doc.internal.pageSize.height || doc.internal.pageSize.getHeight());const logoData = new Image()logoData.src = '../../../../../public/images/product/logo.jpg'//添加图片,参数依次为:imageData(string|HTMLImageElement|HTMLCanvasElement|Uint8Array),x(水平位置),y(垂直位置),w(宽),h(高)//位置、宽、高的单位都为mmdoc.addImage(logoData, 10, 5, 21, 21)doc.setFontSize(38)//字体大小配置,在需要配置的文本上方设置。doc.setTextColor('red')//字体颜色配置//添加文本,参数为('文本内容',x,y)doc.text('this is a textContent', 35, 20)doc.setFontSize(15)doc.setTextColor('black')doc.text('this is a textContent too', 10, 35)doc.setLineWidth(0.5) //设置线条宽度doc.setDrawColor('red')//设置线条颜色//绘制线条(X1,Y1,X2,Y2)doc.line(5, 38, 205, 38)html2canvas(document.getElementById('chart-total'), {background: "#ffffff",dpi: 140}).then((canvas: HTMLCanvasElement) => {doc.addImage(canvas, 10, 55, pageWidth - 30, pageHeight - 90)//新增一页doc.addPage()const data = [  { time: '202103011000', address: '上海' }, { time: '202103011000', address: '上海' },{ time: '202103011000', address: '上海' }]const header = [{ header: '时间', dataKey: 'time' }, { header: '地址', dataKey: 'address' }]doc.autoTable({body: data,columns: header,//表格全局样式styles: {fillColor: [255, 255, 255],//背景色font: 'simhei', //字体,如果不配置,中文仍会乱码textColor: [0, 0, 0],//字体颜色halign: 'center', // 文字水平布局left, center, rightvalign: 'middle',//垂直布局},//表头样式配置headStyles: {fillColor: [220, 220, 220],lineColor: 200,lineWidth: 0.5,},//列的样式,key值对应header的dataKeycolumnStyles: {'time': { columnWidth: 35 },},theme: 'grid',      // 主题})const pageSize = doc.getNumberOfPages()doc.setLineWidth(0.3)doc.setFontSize(12)//设置页脚for (let page = 1; page <= pageSize; page++) {doc.setPage(page)doc.setDrawColor('#f16c6c')doc.line(25, pageHeight - 10, pageWidth - 25, pageHeight - 10)doc.text('制作:某某某   审合:某某某  签发:某某某   电话:XXXXXXXXXXX', 40, pageHeight - 5)}doc.save(`${filename}.pdf`);})}

2.生成word:

1.使用的插件:docxjs

docx的安装和API、不同功能的案例demo此demo几乎包括了所有API的使用和配置。

2.demo
import {Document,TextRun,Footer,TabStopType,AlignmentType,TabStopPosition,VerticalPositionRelativeFrom,VerticalPositionAlign,HorizontalPositionRelativeFrom,HorizontalPositionAlign,Media,Packer,Paragraph,
} from "docx";export function exportForecastWord(filename) {const doc = new Document();//页脚const footers = {default: new Footer({children: [new Paragraph({children: [new TextRun('电话:010-68400565'), new TextRun('\t传真:010-58991637 ')],//实现第一个text左对齐,第二个text右对齐tabStops: [{type: TabStopType.RIGHT,position: TabStopPosition.MAX,},],border: {top: { color: '000', value: 'dashed', size: 10, space: 5 }}})],}),}formUrlGetDataUrl('../public/images/logo.jpg', (dataUrl) => {const logoImge = Media.addImage(doc, dataUrl, 70, 70, {//设置float样式主要是为了让图片和其水平相邻的文字垂直居中,可以去掉对比效果floating: {zIndex: 5,horizontalPosition: {relative: HorizontalPositionRelativeFrom.COLUMN,align: HorizontalPositionAlign.LEFT,},verticalPosition: {relative: VerticalPositionRelativeFrom.PARAGRAPH,align: VerticalPositionAlign.CENTER,},},});   doc.addSection({children: [new Paragraph({children: [logoImge, new TextRun({text: "this is a wordTitle", bold: true,color: "red",size: 60})],alignment: AlignmentType.RIGHT,spacing: {before: 150,after: 150}}),],footers: footers});Packer.toBlob(doc).then(blob => {var a = document.createElement('a');a.href = URL.createObjectURL(blob);a.download = `${filename.replace(/\s/g, '')}.docx`setTimeout(function () {a.click();URL.revokeObjectURL(a.href);a = null}, 0);});})
}/*** 根据图片路径得到dataurl* @param url 图片路径* @param cb 回调函数*/
function formUrlGetDataUrl(url, cb) {var canvas = document.createElement("canvas");var ctx = canvas.getContext("2d");var img = new Image();img.src = url;img.onload = () => {canvas.width = img.width;canvas.height = img.height;ctx.drawImage(img, 0, 0);cb(canvas.toDataURL())canvas=null};
}

使用这个demo时需要注意:文件中使用了一个图片相对路径,所以需要在对应路径下添加一个图片。
补充1:doxcjs生成表格时单元格文本的水平垂直居中实现:

function docxTable(tableData:any[]){let data = removeNullData([...tableData])const rows = data.map((row ,rowIndex)=> {return new TableRow({children: row.map((col)=>{return new TableCell({children: [new Paragraph({ children: [new TextRun({ text: String(col),size:20,bold:rowIndex===0?true:false })],alignment:AlignmentType.CENTER//文本水平居中})],verticalAlign: VerticalAlign.CENTER,margins: {//为文本上下设置相同的间距,实现垂直居中,默认文本和上下边界没有空白top: convertInchesToTwip(0.1),bottom: convertInchesToTwip(0.1),left: 0,right: 0,},})})})})return new Table({rows,width: {size: 100,type: WidthType.PERCENTAGE},});
}
const tableData=[['header1','header2'],['text1','text2']]

补充2:使用WPS打开生成的word文件部分格式不兼容问题解决:
1.包含表格时,如果设置width属性的type值为PERCENTAGE时,用WPS打开word文件,出现单元格width变窄的情况,
2.文本,border等设置的color未生效,显示都是黑色
解决:1. 可以不设置Table的width属性,如果需要固定表格的宽度可以设置Table或者TableCell的width属性的type值为WidthType.DXA

return new Table({rows,width: {size: 9000,type: WidthType.DXA},});

附上单位换算关系:参考:

2.color的值不要设置为red等单词而要使用16进制数值,且前面不要加#

new Paragraph({children: [logoImge, new TextRun({text: "天气预报",bold: true,color: "fa0202",size: 60,})],alignment: AlignmentType.RIGHT,spacing: {before: 150,after: 150}}),

前端js生成自定义内容的PDF及word文件的实现相关推荐

  1. 前端js实现在线预览pdf、word、xls、ppt等文件

    昨天遇到一个需求,公司的视频项目都是视频类型,如果是文件类型就直接打开预览,或者下载查看 项目把请求的资源都作为视频资源处理,直接赋值给 video 标签解析.所以我新增了一个功能函数,方法很简单 文 ...

  2. 在 Vue2 Annotate 中通过 Annotate JS 生成自定义注解(面向切面编程)

    在 Vue2 Annotate 中通过 Annotate JS 生成自定义注解(面向切面编程) 本文基于在了解 Vue2 Annotate 框架基本用法后的进阶使用技巧 Vue2 Annotate 简 ...

  3. Jsoup获取动态js生成的内容

    Jsoup本身是只能获取到静态页面的数据,并无法获取动态生成的内容,所以单单使用jsoup是无法获取到js生成的内容的.我这里使用了htmlunit来获取网页内容后,将网页转换成xml格式,再通过js ...

  4. Java根据word 模板,生成自定义内容的word 文件

    处理思路: 将word模板以xml格式另存一份,得到xml格式模板 在xml 文件中,使用freemark标签,替换一些自定义值 使用freemark 解析xml ,输出到.doc 文件 在处理的时候 ...

  5. vuejs项目纯js导出word、在线下载富文本内容或者网页另存为word文件

    所有前端导入导出方法集合: 前端必备技能知识:JS导出Blob流文件为Excel表格.Vue.js使用Blob的方式实现excel表格的下载(流文件下载)_勤动手多动脑少说多做厚积薄发-CSDN博客_ ...

  6. 【word】使用VBA代码,自定义页面数拆分大Word文件为多个小文档并指定名称保存

    使用VBA代码,自定义页面数拆分大Word文件为多个小文档并指定名称保存 alt+F11打开开发选项-->选择[插入]-->[模块]-->弹出代码编辑窗口,插入下面代码,按照需要修改 ...

  7. 找到几款绝好的离线版PDF to Word文件转换器

    昨天写的<推荐几个免费的PDF to Word文件转换器>,谈到的是离线完美版.经常本人百度加google辛苦的追击,终于找到几款比较完美的离线转换器. 1. E-PDF To Word ...

  8. 推荐几个免费的PDF to Word文件转换器

    SAP的很多教材包括标准教材.PA教材好多都是PDF格式的,看好但不好编辑.本人喜欢涂鸦,喜欢翻译,所以一般都会先转成WORD格式.换过很多软件,都没有一个效果比较好的,大都是加入了千百万的文本框来定 ...

  9. pdf to word文件转换器,出自著名的PDF解决方案供应商NitroPDF

    PDFtoWord.com 号称是目前最为精准的pdf to word文件转换器,出自著名的PDF解决方案供应商NitroPDF. PDFtoWord.com是在线应用,完全免费,使用方便: - 访问 ...

  10. Pdftoword:最精准的pdf to word文件转换器

    转载自:http://www.web20share.com/2009/02/pdftoword.html Pdftoword 号称是目前最为精准的pdf to word文件转换器,简单的作了一下对比分 ...

最新文章

  1. linux sw状态,linux 下查看性能状态命令
  2. android-menudrawer 和SlidingMenu 用法
  3. 怎么把json数据转化为数组_RESTful API 返回统一JSON数据格式是怎么实现的?
  4. PP后台配置-定义工作中心标准值
  5. ckeditor_学习(2) 功能概览
  6. 机器学习结构化学习模型_生产化机器学习模型
  7. 判断字符串是不是application/x-www-form-urlencoded字符串(URL编码格式的字符串)
  8. 脚本解决.NET MVC按钮重复提交问题
  9. aes模式_AES的完整形式是什么?
  10. eclipse弃坑记第一篇之在idea上配置Tomcat环境并创建Javaweb项目的详细步骤原创
  11. python中集合变量_详解python的变量缓存机制
  12. flex if(a is b){},flex if(a as b){} 意思
  13. 20961操作系统接口
  14. 如何将驱动程序静态编译进内核
  15. “0x005346c4”指令引用的“0x00786000”内存,该内存不能为读
  16. 苹果服务器装系统教程视频教程,苹果“雪豹”服务器系统安装傻瓜教程(多图)...
  17. HTML和CSS小知识点笔记
  18. linux ntfs 3g 格式化,linux使用ntfs-3g操作ntfs格式硬盘
  19. 勇敢猿猿不怕困难!为去大厂我把这个Java大厂面试真题刷了几十遍!(2021最新版)
  20. 测量标准误(Standard Error of Measurement;SEm)

热门文章

  1. html 图片放大保证不失真,图片放大不失真的几种方法
  2. 拆解全笔记 | 《高阶运营:从小编到新媒体操盘手》
  3. 腾讯云买服务器密码,腾讯云服务器初始密码是什么?
  4. matlab插值实验目的,matlab插值实验报告数学实验.doc
  5. 【虹科车用总线技术】PCAN-USB使用手册
  6. android上获取屏幕高度,在Android中获取屏幕高度
  7. 光学动作捕捉系统原理
  8. 5G NR首版标准R15解读
  9. Eclipse中英文对照表(整理笔记)
  10. python读取并显示图片