如何用pdfmake从数据库多维数组数据分章节生成动态PDF表格?
使用pdfmake实现你的PDF表格需求
当然可以!pdfmake完全能搞定这个需求,根本不需要换其他方案。我来给你拆解下怎么用它处理你的多维数组数据,生成带两个章节表格的PDF。
1. 先理清楚数据处理逻辑
首先得把你的多维数组里对应章节的数据拆分出来——比如把以consentId开头、对应「同意状态」的对象数组单独提取,「许可状态」的同理。举个贴近你场景的示例数据:
// 你的原始多维数组数据 const consentData = { consentId_consentStatus: [ { userId: 'U001', userName: '张三', status: '已同意', updateTime: '2024-05-20' }, { userId: 'U002', userName: '李四', status: '已拒绝', updateTime: '2024-05-21' }, { userId: 'U003', userName: '王五', status: '待确认', updateTime: '2024-05-22' } ], consentId_permissionStatus: [ { userId: 'U001', permissionType: '数据读取', status: '已授权', expireTime: '2025-05-20' }, { userId: 'U002', permissionType: '数据修改', status: '未授权', expireTime: '-' }, { userId: 'U003', permissionType: '数据删除', status: '已授权', expireTime: '2024-12-31' } ] };
2. 用pdfmake构建带章节的PDF
pdfmake的核心是编写documentDefinition对象,你可以把两个章节作为独立区块,每个区块包含标题和对应的表格。下面是完整的可运行示例:
// 环境适配:Node.js需先npm install pdfmake;浏览器直接引入CDN即可 const pdfMake = require('pdfmake/build/pdfmake'); const pdfFonts = require('pdfmake/build/vfs_fonts'); pdfMake.vfs = pdfFonts.pdfMake.vfs; // 提取两个章节的目标数据 const consentStatusList = consentData.consentId_consentStatus; const permissionStatusList = consentData.consentId_permissionStatus; // 定义PDF文档结构 const documentDefinition = { content: [ // 第1章:同意状态 { text: '1. 同意状态', style: 'chapterTitle' }, { table: { headerRows: 1, widths: ['*', '*', '*', '*'], // 列宽用*表示自适应分配 body: [ // 表头行 ['用户ID', '用户名', '同意状态', '更新时间'], // 数据行:把对象数组转成表格需要的二维数组 ...consentStatusList.map(item => [item.userId, item.userName, item.status, item.updateTime]) ] }, layout: 'lightHorizontalLines' // 可选的表格边框样式 }, // 空行分隔两个章节 { text: '', margin: [0, 20, 0, 0] }, // 第2章:许可状态 { text: '2. 许可状态', style: 'chapterTitle' }, { table: { headerRows: 1, widths: ['*', '*', '*', '*'], body: [ ['用户ID', '许可类型', '许可状态', '到期时间'], ...permissionStatusList.map(item => [item.userId, item.permissionType, item.status, item.expireTime]) ] }, layout: 'lightHorizontalLines' } ], // 自定义样式:比如章节标题的字体和边距 styles: { chapterTitle: { fontSize: 16, bold: true, margin: [0, 0, 0, 10] } } }; // 生成并下载PDF(Node.js环境可改为保存到文件) pdfMake.createPdf(documentDefinition).download('同意与许可状态报告.pdf');
几个关键注意点
- 数据映射:只要把你的对象数组通过
map方法转换成表格需要的二维数组就行,每个对象的属性对应表格的一列,灵活调整即可适配你的实际数据结构。 - 样式定制:pdfmake支持丰富的样式配置,比如表头加粗、列宽手动指定、表格边框样式等,直接修改
styles和layout参数就能实现。 - 环境兼容:浏览器端直接引入pdfmake的CDN就能用;Node.js环境先安装依赖,再调用
fs模块把PDF保存到本地。
内容的提问来源于stack exchange,提问作者pkberlin
相关产品推荐
相关产品推荐

