pdfMake 1.60版本pageBreakBefore不生效,如何实现多内容块各自独立分页
解决方案
问题原因
你当前配置的pageBreakBefore回调未生效,是因为触发条件设置不合理:
- 回调内要求当前节点的
headlineLevel等于1,同时当前页剩余节点为空才会分页,正常生成的内容节点默认不会携带headlineLevel属性,自然不会触发返回true的逻辑 - 你在根配置中添加的
unbreakable: true不属于全局生效配置,该属性仅作用于单个内容块,无法全局生效
可行实现方案
两种方案都可以实现每份PDF内容单独分页的需求,推荐优先用第一种:
方案1:直接给每份内容添加分页标记(无需回调)
不需要保留pageBreakBefore配置,只需对getContent返回的内容数组做简单处理即可:
let rawContent = this.getContent(checkedOrders, selectedLabOrders); let processedContent = []; rawContent.forEach((pdfItem, index) => { // 如果单份PDF内容是多个节点组成的数组,就用stack包裹,保证整体不可拆分+分页属性生效 const contentBlock = Array.isArray(pdfItem) ? { stack: pdfItem } : pdfItem; processedContent.push({ ...contentBlock, unbreakable: true, // 防止单份PDF内容被自动拆分到两页 // 最后一份内容不需要加后置分页 pageBreak: index === rawContent.length - 1 ? undefined : 'after' }) }) this.docDefinition = { info: { title: 'Title', subject: 'labOrder-' }, pageSize: 'LETTER', pageOrientation: 'landscape', pageMargins: [40, 30, 40, 30], content: processedContent, // 原有的pageBreakBefore配置可以删除 styles: { titleHeader: { fontSize: 16, bold: true, margin: [0, 10, 0, 0], }, tableHeader: { bold: true, fontSize: 13, color: 'black' } }, defaultStyle: { fontSize: 9, lineHeight: .9 } };
方案2:调整pageBreakBefore回调逻辑
如果需要用回调实现,只需给除第一份外的所有内容块添加自定义标识,回调识别到标识就返回true触发分页:
let rawContent = this.getContent(checkedOrders, selectedLabOrders); let processedContent = rawContent.map((pdfItem, index) => { const contentBlock = Array.isArray(pdfItem) ? { stack: pdfItem } : pdfItem; return { ...contentBlock, unbreakable: true, // 给第二份及以后的内容加自定义标记 isNewPdfBlock: index > 0 } }) this.docDefinition = { // 其他原有配置不变 content: processedContent, pageBreakBefore: function(currentNode) { // 识别到自定义标记就触发分页 return currentNode.isNewPdfBlock === true; }, // 其他原有配置不变 };
内容的提问来源于stack exchange,提问作者Mike
相关产品推荐
相关产品推荐

