
pdfmake 在并排渲染多个表格时,若复用同一组表头对象(而非独立副本),会导致右侧表格表头单元格内容丢失——这是因 pdfmake 内部对对象引用的浅拷贝处理引发的副作用。
pdfmake 在并排渲染多个表格时,若复用同一组表头对象(而非独立副本),会导致右侧表格表头单元格内容丢失——这是因 pdfmake 内部对对象引用的浅拷贝处理引发的副作用。
在使用 PDFMake 构建多列布局(如 columns)并嵌入多个带表头的表格时,一个常见却容易被忽视的问题是:只有第一张表格显示完整表头文字,第二张(或后续)表格的表头行虽存在,但单元格内文本为空。
根本原因在于:PDFMake 在解析 body 数组时,会对表头行(即 headerRows: 1 指定的第一行)进行内部状态标记与复用处理。当左右两个表格共用同一个 tableHeaders 数组(即同一内存引用)时,PDFMake 在处理第一个表格后已“消耗”或修改了该数组中对象的内部状态(例如 _pdfmake 相关元数据),导致第二个表格无法正确渲染其文本内容。
✅ 正确做法是为每个表格提供独立的、结构相同但引用不同的表头数组,避免对象共享。
以下为修复后的关键代码片段(仅展示核心变更部分):
// ❌ 错误:复用同一数组引用 → 导致右表表头文字消失
// const tableHeaders = [{ text: 'Last Name', style: 'tableHeader' }, ...];
// const leftTableBody = [tableHeaders, ['Doe', 'John', '5', 'A']];
// const rightTableBody = [tableHeaders, ['Smith', 'Jane', '6', 'B']];
// ✅ 正确:分别为左右表创建独立表头数组
const tableHeaderLeft = [
{ text: 'Last Name', style: 'tableHeader' },
{ text: 'First Name', style: 'tableHeader' },
{ text: 'Grade', style: 'tableHeader' },
{ text: 'Class', style: 'tableHeader' }
];
const tableHeaderRight = [
{ text: 'Last Name', style: 'tableHeader' },
{ text: 'First Name', style: 'tableHeader' },
{ text: 'Grade', style: 'tableHeader' },
{ text: 'Class', style: 'tableHeader' }
];
const leftTableBody = [tableHeaderLeft, ['Doe', 'John', '5', 'A']];
const rightTableBody = [tableHeaderRight, ['Smith', 'Jane', '6', 'B']];? 进阶建议:
- 若表头结构复杂或需动态生成,可封装为工厂函数,确保每次调用返回全新对象:
const createTableHeader = () => [ { text: 'Last Name', style: 'tableHeader' }, { text: 'First Name', style: 'tableHeader' }, { text: 'Grade', style: 'tableHeader' }, { text: 'Class', style: 'tableHeader' } ]; const leftTableBody = [createTableHeader(), ['Doe', 'John', '5', 'A']]; const rightTableBody = [createTableHeader(), ['Smith', 'Jane', '6', 'B']]; - 始终避免在多个
table.body中直接引用同一数组或对象字面量;PDFMake 不保证深拷贝行为,应默认按引用传递处理。
总结:这不是 bug,而是 PDFMake 基于性能与设计约束所采用的对象复用机制所致。通过保障表头数据的引用隔离性,即可稳定实现多表格并排且表头完整渲染。


















