9

对于我在 javascript 中使用 pdfmake 即时提供报价和发票 pdf 的项目。我面临的问题是文本块在中间离开页面。我想要的是检查某个文本块或表格是否将在页面之间拆分,如果是,则在块之前添加分页符以确保文本或表格将完全在一页上。

我的 pdf docDefinition 是这样构建的:

return {
                content: [
                    getOfferLogo(), //Get the logo or empty string
                    getHeading(), //get the customer and business data (adress etc)
                    //the above is always the same
                    getText(), //get the textblock, created by user and always different
                    getSpecifics(), //get a table of payment specifications
                    getSignature() //get last textblock contaning signature fields etc, always the same
                ],
                styles: {
                    subheader: {
                        fontSize: 15,
                        bold: true,
                        alignment: 'center'
                    }
                },
                defaultStyle: {
                    columnGap: 20,
                    fontSize: 12
                }
            };

所以简而言之,我如何在创建pdf之前检查文本是否会离开页面并相应地添加分页符?

提前致谢。

4

4 回答 4

29

pageBreakBefore函数在确定是否需要分页时提供了很大的灵活性。但是,我发现了另一种解决方案,它更简单,文档更少,但自动完成所有魔法。这是0.1.32版本中的一个unbreakable: true属性。此外,它在以下线程中提到https://github.com/bpampuch/pdfmake/issues/1228#issuecomment-354411288

这个怎么运作? 例如,你想让一个标题和它下面的一些文本是牢不可破的。为了做到这一点,您必须将标题和内容包装在堆栈中并unbreakable: true在其上应用。

{
    stack: [
        // header
        {
            text: 'Lorem ipsum dolor sit amet',
            bold: true,
            fontSize: 13
        },
        // content
        {
            text: 'Nulla iaculis magna vitae luctus euismod. Sed arcu risus, mattis non molestie et, condimentum sit amet justo. Quisque vitae neque magna. Etiam in tellus vitae arcu volutpat bibendum. In ullamcorper ante tortor, a viverra libero cursus eu. Phasellus quis massa nec lorem feugiat ultricies. Aliquam erat volutpat. Nullam a purus tempus, feugiat elit vel, tincidunt tortor.'
        }
    ],
    unbreakable: true // that's the magic :)
}
于 2018-08-29T09:39:51.590 回答
13

找到了解决方案:)

在 DocDefinition 中,您可以为 pageBreakBefore 添加一个函数,如下所示:

content: [{
    text: getOfferClosingParagraph(),
    id: 'closingParagraph'
  }, {
    text: getSignature(),
    id: 'signature'
  }],
  pageBreakBefore: function(currentNode, followingNodesOnPage, nodesOnNextPage, previousNodesOnPage) {
    //check if signature part is completely on the last page, add pagebreak if not
    if (currentNode.id === 'signature' && (currentNode.pageNumbers.length != 1 || currentNode.pageNumbers[0] != currentNode.pages)) {
      return true;
    }
    //check if last paragraph is entirely on a single page, add pagebreak if not
    else if (currentNode.id === 'closingParagraph' && currentNode.pageNumbers.length != 1) {
      return true;
    }
    return false;
  },

有关此功能的更多信息和提供的信息,请查看

于 2015-12-11T10:12:47.867 回答
1

带有文本的简单示例:

var dd = {
    content: [
        'First paragraph',
        
        // page break before text
        {text: 'Text on the next page', pageBreak: 'before'},
        
        'Another paragraph, this time a little bit longer to make sure, this line will be divided into at least two lines',
        
        // page break after text
        {text: 'Text is lastest on the page', pageBreak: 'after'},
        
        'Another paragraph, this time a little bit longer to make sure, this line will be divided into at least two lines'
    ]
}
于 2021-03-14T13:36:33.967 回答
-1
pageBreakBefore: (currentNode, followingNodesOnPage, nodesOnNextPage, previousNodesOnPage) => {
    if (currentNode.id === 'yournodeid') {
        if(previousNodesOnPage[0].startPosition.pageNumber != followingNodesOnPage[0].pageNumbers) {
            return true;
        }
    }
    return false;
}
于 2019-08-29T10:11:22.203 回答