html - 打破 PDF 中的 html 表格

标签 html css pdf

我需要使用 puppeteer 呈现发票 PDF,其中包含一个包含元素的表格。这些元素可以包含描述/评论/等。 表格溢出到它下面的下一个 div 上。以防溢出,行为应该进入下一页。

我已经尝试了很多 css break-* 和 @page ,但都没有成功,最大高度但是表格不完全可见以及许多其他事情。我应该跳过表格而只使用 div 吗?

.pdf {
  background-color: #FFF;
  overflow: hidden !important;
  display: grid;
  grid-template-rows: 190px minmax(10px, 246px) 786px 212px 1fr;
  grid-row-gap: 1em;
}

.table-container {
  table { page-break-inside: auto }
  tr    { page-break-inside: avoid; page-break-after: auto }
  thead { display: table-header-group }
  tfoot { display: table-footer-group }
}

table {
  width: 100%;
  border-spacing: 0;
  border-collapse: collapse;
}

// ... other elms ...
<div class="pdf">
    <header>
        ... company header logo and other details ...
    </header>
    <div class="details">
        ... invoice details ...
    </div>
    <div class="table-container">
        <table>
            <thead>
            <tr>
                <th class="text-left">PRODUCT</th>
                <th class="text-left">DESCRIPTION</th>
                <th class="text-right">PRICE</th>
                <th class="text-right">UNIT</th>
                <th class="text-right">QUANTITY</th>
                <th class="text-right">TOTAL</th>
            </tr>
            </thead>
            <tbody>
                <tr></tr>
            </tbody>
        </table>
    </div>
    <div class="details">
        this div gets overflowed
    </div>
</div>

最佳答案

像这样尝试:

.pdf {
  background-color: #FFF;
  overflow: hidden !important;
  display: grid;
  grid-template-rows: 190px minmax(10px, 246px) auto 212px 1fr;
  grid-row-gap: 1em;
}

table {
  width: 100%;
  border-spacing: 0;
  border-collapse: collapse;
  min-height: 786px;
}

@media print {
  .table-container table {
      page-break-inside: auto;
  }
  .table-container tr {
    page-break-inside: avoid;
    page-break-after: auto;
  }
  .table-container thead {
    display: table-header-group;
  }
  .table-container tfoot {
    display: table-footer-group;
  }
}
<div class="pdf">
  <header>
    ... company header logo and other details ...
  </header>
  <div class="details">
    ... invoice details ...
  </div>
  <div class="table-container">
    <table>
      <thead>
        <tr>
          <th class="text-left">PRODUCT</th>
          <th class="text-left">DESCRIPTION</th>
          <th class="text-right">PRICE</th>
          <th class="text-right">UNIT</th>
          <th class="text-right">QUANTITY</th>
          <th class="text-right">TOTAL</th>
        </tr>
      </thead>
      <tbody>
        <tr>
          <td>test</td>
          <td>test</td>
          <td>test</td>
          <td>test</td>
          <td>test</td>
          <td>test</td>
        </tr>
        <tr>
          <td>test</td>
          <td>test</td>
          <td>test</td>
          <td>test</td>
          <td>test</td>
          <td>test</td>
        </tr>
        <tr>
          <td>test</td>
          <td>test</td>
          <td>test</td>
          <td>test</td>
          <td>test</td>
          <td>test</td>
        </tr>
        <tr>
          <td>test</td>
          <td>test</td>
          <td>test</td>
          <td>test</td>
          <td>test</td>
          <td>test</td>
        </tr>
        <tr>
          <td>test</td>
          <td>test</td>
          <td>test</td>
          <td>test</td>
          <td>test</td>
          <td>test</td>
        </tr>
        <tr>
          <td>test</td>
          <td>test</td>
          <td>test</td>
          <td>test</td>
          <td>test</td>
          <td>test</td>
        </tr>
        <tr>
          <td>test</td>
          <td>test</td>
          <td>test</td>
          <td>test</td>
          <td>test</td>
          <td>test</td>
        </tr>
        <tr>
          <td>test</td>
          <td>test</td>
          <td>test</td>
          <td>test</td>
          <td>test</td>
          <td>test</td>
        </tr>
        <tr>
          <td>test</td>
          <td>test</td>
          <td>test</td>
          <td>test</td>
          <td>test</td>
          <td>test</td>
        </tr>
        <tr>
          <td>test</td>
          <td>test</td>
          <td>test</td>
          <td>test</td>
          <td>test</td>
          <td>test</td>
        </tr>
        <tr>
          <td>test</td>
          <td>test</td>
          <td>test</td>
          <td>test</td>
          <td>test</td>
          <td>test</td>
        </tr>
        <tr>
          <td>test</td>
          <td>test</td>
          <td>test</td>
          <td>test</td>
          <td>test</td>
          <td>test</td>
        </tr>
        <tr>
          <td>test</td>
          <td>test</td>
          <td>test</td>
          <td>test</td>
          <td>test</td>
          <td>test</td>
        </tr>
        <tr>
          <td>test</td>
          <td>test</td>
          <td>test</td>
          <td>test</td>
          <td>test</td>
          <td>test</td>
        </tr>
        <tr>
          <td>test</td>
          <td>test</td>
          <td>test</td>
          <td>test</td>
          <td>test</td>
          <td>test</td>
        </tr>
        <tr>
          <td>test</td>
          <td>test</td>
          <td>test</td>
          <td>test</td>
          <td>test</td>
          <td>test</td>
        </tr>
        <tr>
          <td>test</td>
          <td>test</td>
          <td>test</td>
          <td>test</td>
          <td>test</td>
          <td>test</td>
        </tr>
        <tr>
          <td>test</td>
          <td>test</td>
          <td>test</td>
          <td>test</td>
          <td>test</td>
          <td>test</td>
        </tr>
        <tr>
          <td>test</td>
          <td>test</td>
          <td>test</td>
          <td>test</td>
          <td>test</td>
          <td>test</td>
        </tr>
        <tr>
          <td>test</td>
          <td>test</td>
          <td>test</td>
          <td>test</td>
          <td>test</td>
          <td>test</td>
        </tr>
        <tr>
          <td>test</td>
          <td>test</td>
          <td>test</td>
          <td>test</td>
          <td>test</td>
          <td>test</td>
        </tr>
        <tr>
          <td>test</td>
          <td>test</td>
          <td>test</td>
          <td>test</td>
          <td>test</td>
          <td>test</td>
        </tr>
        <tr>
          <td>test</td>
          <td>test</td>
          <td>test</td>
          <td>test</td>
          <td>test</td>
          <td>test</td>
        </tr>
        <tr>
          <td>test</td>
          <td>test</td>
          <td>test</td>
          <td>test</td>
          <td>test</td>
          <td>test</td>
        </tr>
        <tr>
          <td>test</td>
          <td>test</td>
          <td>test</td>
          <td>test</td>
          <td>test</td>
          <td>test</td>
        </tr>
        <tr>
          <td>test</td>
          <td>test</td>
          <td>test</td>
          <td>test</td>
          <td>test</td>
          <td>test</td>
        </tr>
        <tr>
          <td>test</td>
          <td>test</td>
          <td>test</td>
          <td>test</td>
          <td>test</td>
          <td>test</td>
        </tr>
        <tr>
          <td>test</td>
          <td>test</td>
          <td>test</td>
          <td>test</td>
          <td>test</td>
          <td>test</td>
        </tr>
        <tr>
          <td>test</td>
          <td>test</td>
          <td>test</td>
          <td>test</td>
          <td>test</td>
          <td>test</td>
        </tr>
        <tr>
          <td>test</td>
          <td>test</td>
          <td>test</td>
          <td>test</td>
          <td>test</td>
          <td>test</td>
        </tr>
        <tr>
          <td>test</td>
          <td>test</td>
          <td>test</td>
          <td>test</td>
          <td>test</td>
          <td>test</td>
        </tr>
        <tr>
          <td>test</td>
          <td>test</td>
          <td>test</td>
          <td>test</td>
          <td>test</td>
          <td>test</td>
        </tr>
        <tr>
          <td>test</td>
          <td>test</td>
          <td>test</td>
          <td>test</td>
          <td>test</td>
          <td>test</td>
        </tr>
        <tr>
          <td>test</td>
          <td>test</td>
          <td>test</td>
          <td>test</td>
          <td>test</td>
          <td>test</td>
        </tr>
        <tr>
          <td>test</td>
          <td>test</td>
          <td>test</td>
          <td>test</td>
          <td>test</td>
          <td>test</td>
        </tr>
        <tr>
          <td>test</td>
          <td>test</td>
          <td>test</td>
          <td>test</td>
          <td>test</td>
          <td>test</td>
        </tr>
        <tr>
          <td>test</td>
          <td>test</td>
          <td>test</td>
          <td>test</td>
          <td>test</td>
          <td>test</td>
        </tr>
        <tr>
          <td>test</td>
          <td>test</td>
          <td>test</td>
          <td>test</td>
          <td>test</td>
          <td>test</td>
        </tr>
        <tr>
          <td>test</td>
          <td>test</td>
          <td>test</td>
          <td>test</td>
          <td>test</td>
          <td>test</td>
        </tr>
        <tr>
          <td>test</td>
          <td>test</td>
          <td>test</td>
          <td>test</td>
          <td>test</td>
          <td>test</td>
        </tr>
        <tr>
          <td>test</td>
          <td>test</td>
          <td>test</td>
          <td>test</td>
          <td>test</td>
          <td>test</td>
        </tr>
        <tr>
          <td>test</td>
          <td>test</td>
          <td>test</td>
          <td>test</td>
          <td>test</td>
          <td>test</td>
        </tr>
      </tbody>
    </table>
  </div>
  <div class="details">
    this div gets overflowed
  </div>
</div>

grid-template-rows 中的第三个值更改为 auto 允许第三行 (.table-container) 具有高度大于 786px。这解决了溢出问题。

看来 grid layout还通过使 thead 元素在每个重复页面的开头重复 tbody 内容来弄乱表格。如果是我,我会至少删除 display: gridgrid-template-rowsgrid-row-gap 规则用于打印,而不是做类似下面的事情。这样就不会那么容易出错。

@media print {
   .pdf {
      display: block;
      grid-template-rows: none;
      grid-row-gap: 0;
   }

   .pdf > div {
      margin-bottom: 1em;
   }

   header {
      height: 190px;
   }

   header + .details {
      height: 246px;
      min-height: 10px;
      max-height: 246px;
   }

   .table-container {
      height: auto;
   }

   .table-container + .details {
      height: 212px;
   }

   /* further rules here... */
}

关于html - 打破 PDF 中的 html 表格,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64515193/

相关文章:

javascript - 我想在另一个 div 中做一个特定的鼠标悬停效果

javascript - 模态错误

ruby-on-rails - 在所有页面上使用 Prawn 的背景图像

pdf - 将禁用智能收缩与 wkhtmltopdf 一起使用不会影响标题字体大小

javascript - 从 IFrame 文档中获取标题

javascript - 使用 .append() + css/styling 使用 Jquery/Javascript 添加新文本

html - div 元素在包含文本时被下推。内联 block 的特殊行为

android - 如何更改sencha touch输入框的默认样式?

html - twitter bootstrap input-group-addon 和 btn-group 没有很好地对齐

android - 使用 PrintDocumentAdapter 和 PrintManager 更改页数