pdfmake pagebreakBefore params показывает неправильное расположение разрыва страницы (одна дополнительная строка таблицы) - PullRequest
0 голосов
/ 01 апреля 2020

Параметры pdfmake pagebreakBefore часто кажутся l ie, говоря, что на текущей странице будет включено еще одна строка таблицы, чем на самом деле. Когда генерируется фактический PDF, эта «последняя» строка таблицы фактически появляется вверху следующей страницы.

Ниже приведен пример (https://jsfiddle.net/yue65kfb/7/). Если вы откроете инструменты разработки браузера перед запуском, он начнет сеанс отладки, а затем вы можете установить точку останова в пользовательской функции pagebreakBefore. Вы увидите, что третий аргумент для pagebreakBefore (next_page) показывает, что страница 2 начинается с новой таблицы, но документ фактически заканчивается строкой завершающей таблицы с первой страницы на этой второй странице.

function test() {
  doc_def = {}
  doc_def.styles = {table: {margin: [20, 20, 10, 10]}};
  doc_def.pageMargins = [40, 55, 40, 40]; 
  doc_def.pageBreakBefore = function(cur, next, next_page, prev) {
    let pb = false;
    if (cur.headlineLevel === 1) {      // Each table row has headlineLevel 1, last row has headlineLevel 2
      if (!next.find(node => node.headlineLevel) && next_page.length) { // If last row, test further
        let next_row = next_page.find(node => node.headlineLevel);
        pb = (next_row && (next_row.headlineLevel === 2));  // Page break if 1st row on next page is last row of table
      }
    }
    return pb;
  }

  doc_def.content = [];

  // Create several tables.  In call to pagebreakBefore, it appears that 2nd page starts with a new table.  But in the
  // generated document, the last row of current table appears at the top of 2nd page
  [10, 2, 3, 0, 0, 3, 4].forEach(num_rows => doc_def.content.push(add_table(num_rows)));
  let doc = pdfMake.createPdf(doc_def);
  doc.download('Test.pdf');
}

// Generate a simple table with requested number rows
function add_table(num_rows) {
  let table = {
    layout: 'standard',
    style: 'table',
    table: {
      headerRows: 1,
      dontBreakRows: true,
      widths: [30, '*', 66],
      body: [['Item', '', 'Value']]     // Header row
    }
  }
  for (let i = 0; i <= num_rows; i++) {
    let row_str = i.toString();
    table.table.body.push([
       {text: row_str, headlineLevel: (i === num_rows) ? 2 : 1},    // Give last row headlineLevel 2
      'Item name ' + row_str,
      {text: row_str, alignment: 'right'}
    ]);
  }
  return(table);
}
...