Динамическая проверка перехода текста на следующую страницу и добавление разрыва страницы в pdf с помощью pdfmake

Для проекта я делаю предложения и выставляю счета в формате PDF на лету, используя pdfmake в javascript. Проблема, с которой я столкнулся, заключается в том, что текстовые блоки выходят за пределы страницы посередине. Я хочу проверить, будет ли определенный блок текста или таблицы разделен между страницами, и если это так, добавьте разрыв страницы перед блоком, чтобы убедиться, что текст или таблица будут полностью на одной странице.

Мой 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-файла, и соответственно добавить разрывы страниц?

Заранее спасибо.


person André Kool    schedule 30.11.2015    source источник


Ответы (3)


Функция pageBreakBefore дает большую гибкость в определении того, требуется разрыв страницы или нет. Тем не менее, я нашел еще одно решение, которое является более простым и менее документированным, но делает все волшебство автоматически. Это атрибут unbreakable: true, появившийся в версии 0.1.32. Кроме того, это упоминается в следующем потоке 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 :)
}
person Vitalii Bratok    schedule 29.08.2018
comment
Я перешел к другим проектам после того, как задал этот вопрос несколько лет назад, поэтому, к сожалению, я не смогу это подтвердить. Но, глядя на этот ответ и предоставленную вами связанную информацию, это звучит как очень хорошее решение. - person André Kool; 29.08.2018
comment
Я могу подтвердить, что это решение работает так, как рекламируется. - person MazBeye; 29.10.2018
comment
Работает как шарм. Я использую pdfmake v0.1.58 - person svaj; 25.08.2019
comment
Если вы используете машинописный текст и используете типы PDFmake, вам может потребоваться установить тип объекта на ContentStack - person Ramtin; 01.03.2021

Решение найдено :)

В 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;
  },

Для получения дополнительной информации об этой функции и предоставленной информации см. эту

person André Kool    schedule 11.12.2015
comment
Получение разрыва страницы с приведенным выше кодом, но без добавления содержимого на следующую страницу. Вы можете помочь мне здесь? - person Nikhil Radadiya; 13.07.2017

Простой пример с текстами:

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'
    ]
}
person Sushil    schedule 14.03.2021