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文档效果如下:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值