避免在行跨度不起作用的标题表中出现分页符(打印)

Posted

技术标签:

【中文标题】避免在行跨度不起作用的标题表中出现分页符(打印)【英文标题】:Avoid page break inside in header table with rowspan not working (printing) 【发布时间】:2020-01-02 11:42:55 【问题描述】:

我正在尝试使用 Puppeteer chrome 生成 pdf。 pdf 中的数据是动态的。 pdf 包含我通过循环数据生成的多个表。 因此,有两个循环,循环表和循环每个表内的数据 (<td>)。

表的标题 - 在<thead> 内 - 有rowspan。不幸的是,<thead> 并没有像我预期的那样坏。

这是目前的情况:

预期结果

我希望<thead> 不会中断。 如果<thead> 不适合,则应转到下一页。 我使用车把创建了模板。

这是模板的代码:

<!DOCTYPE html>
<html lang="en">

<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <meta http-equiv="X-UA-Compatible" content="ie=edge">

  <style>
    html,
    body 
      min-height: 150mm !important;
      max-width: 297mm !important;
    

    @page 
      size: auto;
    
  </style>
</head>

<body>
  <div>
    #each array as |data|
    <table>
      <thead style="page-break-inside: avoid !important">
        <tr>
          <th rowspan="2">
            One
          </th>
          <th rowspan="2">
            Two
          </th>
          <th colspan="2">
            Three
          </th>
          <th rowspan="2">
            Four
          </th>
          <th rowspan="2">
            Five
          </th>
          <th colspan="2">
            Six
          </th>
          <th colspan="2">
            Seven
          </th>
        </tr>
        <tr>
          <th>
            Three child 1
          </th>
          <th>
            Three child 2
          </th>
          <th>
            Six child 1
          </th>
          <th>
            Six child 2
          </th>
          <th>
            Seven child 1
          </th>
          <th>
            Seven child 2
          </th>
        </tr>
      </thead>
      <tbody>
        #each data.innerArray as |innerData|
        <tr>
          <td>
            innerData.one
          </td>
          <td>
            innerData.two
          </td>
          <td>
            innerData.three.one
          </td>
          <td>
            innerData.three.two
          </td>
          <td>
            innerData.four
          </td>
          <td>
            innerData.five
          </td>
          <td>
            innerData.six.one
          </td>
          <td>
            innerData.six.two
          </td>
          <td>
            innerData.seven.one
          </td>
          <td>
            innerData.seven.two
          </td>
        </tr>
        /each
      </tbody>
    </table>
    /each
  </div>
</body>

</html>

我试过了

    我尝试在&lt;thead&gt;&lt;tr&gt;&lt;th&gt; 中设置page-break-inside: avoid !important,但它不起作用。 我尝试用&lt;div&gt; 包装&lt;thead&gt; 并将page-break-inside: avoid !important 提供给div,但仍然无法正常工作。

我不知道如何使它工作。请帮忙?

更新

我愿意接受与纯 javascript 混合来解决此问题的答案。我在想,我可以尝试检测&lt;thead&gt; 的位置,然后检查&lt;thead&gt; 是否靠近(精确距离)页面底部?如果它匹配条件,它只会在该表中添加样式 page-break-before true ?

【问题讨论】:

我想知道你是否可以让它在像 Firefox 这样的东西中工作,看看你的方法是否应该工作?我有一个应用程序必须避免进入 s,但我只需要等待 chrome 支持它。 @BillyHudson 所以你让结果“一团糟”,直到 chrome 自行修复,仪式? 提交了一个错误报告,并为用户找到了解决它的方法,因为它只是偶尔发生。 【参考方案1】:

尝试将每列的宽度限制为style="width: &lt;somevalue&gt;%;",它应该满足 100%,如下面的代码。根据您在每列中维护的内容量更改 % 值并拆分为列。

示例代码:

<tr>
  <th rowspan="2" style="width: 10%;">
    One
  </th>
  <th rowspan="2" style="width: 20%;">
    Two
  </th>
  <th colspan="2" style="width: 20%;">
    Three
  </th>
  <th rowspan="2" style="width: 5%;">
    Four
  </th>
  <th rowspan="2" style="width: 5%;">
    Five
  </th>
  <th colspan="2" style="width: 20%;">
    Six
  </th>
  <th colspan="2" style="width: 20%;">
    Seven
  </th>
</tr>

【讨论】:

那不行。感谢您的回复。但我仍然面临同样的问题【参考方案2】:

你试过了吗:

<thead style="page-break-before">

这将确保每个标题都在一个新页面上,并且如果每个表格只有一个标题,则应该可以工作。

此解决方案的唯一问题是,无论表格有多大/多小,每个页面上都会有一个新表格。但是,它会阻止标题中断。

另外还有This Article,它进一步描述了您可以采取哪些措施来阻止分页破坏表格。

【讨论】:

对不起,但正如您所说,每个新表都会放入一个新页面。这不是我所期望的。我读过你提到的那篇文章。我尝试将&lt;div&gt; 包裹两个&lt;tr&gt; 或将&lt;thead&gt; 包裹&lt;div&gt; 并赋予样式page-break-inside: avoid。但它不起作用。 您能尝试用page-break-inside: avoid!important 将整个表格包装在&lt;div&gt; 中吗?由于我没有 chrome 扩展,我无法复制您的 PDF。但是,page-break-inside 阻止它内部的元素破坏,所以我想知道它是否将h1 归类为元素。而如果元素是表格本身,则应避免破坏它。

以上是关于避免在行跨度不起作用的标题表中出现分页符(打印)的主要内容,如果未能解决你的问题,请参考以下文章

JQuery Mobile 中的分页符?

分页符在 Bootstrap 模式下不起作用

打印带有强制分页符的表格

mPDF page-break-inside 避免不起作用

插入分页符不起作用

避免表格行内的分页符