vue2使用pdfmake
前言
电脑操作系统:windows11
node.js版本:v14.21.3
pdfmake版本:^0.2.20
pdfmake官网文档:https://pdfmake.github.io/docs/0.1/
包下载与引入
下载
npm install pdfmake
引入
import pdfMake from "pdfmake/build/pdfmake";
import pdfFonts from "pdfmake/build/vfs_fonts";
pdfMake.addVirtualFileSystem(pdfFonts);
引入字体
系统默认给的字体(Roboto)仅支持英文,使用中文会出现乱码,对于国内来说没有中文是不可能的,所以需要引入字体来支持中文。
url链接方式引入(不推荐)
第一步,添加字体:
pdfMake.addFonts({Roboto: {normal: 'https://cdnjs.cloudflare.com/ajax/libs/pdfmake/0.1.66/fonts/Roboto/Roboto-Regular.ttf',bold: 'https://cdnjs.cloudflare.com/ajax/libs/pdfmake/0.1.66/fonts/Roboto/Roboto-Medium.ttf',italics: 'https://cdnjs.cloudflare.com/ajax/libs/pdfmake/0.1.66/fonts/Roboto/Roboto-Italic.ttf',bolditalics: 'https://cdnjs.cloudflare.com/ajax/libs/pdfmake/0.1.66/fonts/Roboto/Roboto-MediumItalic.ttf'}
})
第二步,使用字体:
let docDefinition = {content: (...),defaultStyle: {font: 'Roboto'}
}
这种方式仅适用于个人学习,实际生活中项目都是部署在内网环境中的,与外网隔绝,不可能做到随时下载字体的要求。
本地字体文件引入(推荐)
创建vfs_fonts.js文件
1、本文以“仿宋”字体为例,项目中创建文件夹“src/utils/fonts/simfang”,将 simfang.ttf 字体文件放在该目录下;
2、打开命令窗口,进入"项目目录/node_modules/pdfmake"目录下,执行以下命令:
node build-vfs.js "D:\pdfmakeTest\src\utils\fonts\simfang" "D:\pdfmakeTest\src\utils\fonts\simfang\vfs_fonts.js"
第一个路径指存放本地字体文件的目录,只需要指定到目录级别,就会自动识别加载该目录下所有的字体文件;第二个目录指生成的js文件路径,具体到文件名,文件名可以自定义。
3、上述命令执行后,就会生成字体js文件,如下图所示:
js中使用 pdfMake.addFonts(...) 加载本地字体
pdfMake.addFonts({Roboto: {normal: 'Roboto-Regular.ttf',bold: 'Roboto-Medium.ttf',italics: 'Roboto-Italic.ttf',bolditalics: 'Roboto-Italic.ttf'},simfang: {normal: 'simfang.ttf',bold: 'simfang.ttf',italics: 'simfang.ttf',bolditalics: 'simfang.ttf'}
})
pdfMake全局设置默认字体
let docDefinition = {content: (...),defaultStyle: {font: 'simfang'}
}
设置pdf文档内容
可以自定义对pdf文档内容添加普通文字、链接、表格等,具体可参考文档。完整代码如下:
<template><div><el-button @click="exportPdf">导出PDF</el-button></div>
</template><script>
import pdfMake from "pdfmake/build/pdfmake";
import pdfFonts from "@/utils/fonts/simfang/vfs_fonts";export default {name: "PdfTest",methods: {exportPdf() {pdfMake.addFonts({Roboto: {normal: 'simfang.ttf',bold: 'simfang.ttf',italics: 'simfang.ttf',bolditalics: 'simfang.ttf'},simfang: {normal: 'simfang.ttf',bold: 'simfang.ttf',italics: 'simfang.ttf',bolditalics: 'simfang.ttf'}})let docDefinition = {header: '这是页眉',footer: {text: '这是页脚', alignment: 'right'},watermark: {text: '水印123', opacity: 0.5, angle: 30},content: [{text: '标题', style: 'header'},{text: '第一行文字!', fontSize: 16, bold: true},{text: '第二行文字', fontSize: 12, bold: false, alignment: 'justify'},{columns: [{width: 'auto',text: '第一列'},{width: '*',text: '第二列'},{width: 100,text: '第三列'},{width: '20%',text: '第四列'}],columnGap: 10},{qr: '二维码', fit: '150'},{table: {headerRows: 1,widths: ['25%', '25%', '25%', '25%'],body: [['姓名', '性别', '年龄', '身高'],['张三', '男', '22', '55kg'],['李四', '女', '18', '45kg']]}}],styles: {header: {fontSize: 30,bold: true,margin: [0, 0, 0, 10]}}};pdfMake.addVirtualFileSystem(pdfFonts);pdfMake.createPdf(docDefinition).open();// pdfMake.createPdf(docDefinition).download();}}
}
</script>
pdf文档效果如下: