如何在打印大型HTML表时处理分页符

h3.*_*h3. 255 html css printing html-table

我有一个项目,需要打印一个包含许多行的HTML表.

我的问题是表格在多页上打印的方式.它有时会减少一半,使其无法读取,因为一半位于页面的边缘,其余部分打印在下一页的顶部.

我能想到的唯一合理的解决方案是使用堆叠的DIV而不是表格,并在需要时强制分页.但在完成整个更改之前,我认为我之前可以问过这个问题.

Sin*_*nür 270

<!DOCTYPE HTML>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Test</title>
<style type="text/css">
    table { page-break-inside:auto }
    tr    { page-break-inside:avoid; page-break-after:auto }
    thead { display:table-header-group }
    tfoot { display:table-footer-group }
</style>
</head>
<body>
    <table>
        <thead>
            <tr><th>heading</th></tr>
        </thead>
        <tfoot>
            <tr><td>notes</td></tr>
        </tfoot>
        <tbody>
        <tr>
            <td>x</td>
        </tr>
        <tr>
            <td>x</td>
        </tr>
        <!-- 500 more rows -->
        <tr>
            <td>x</td>
        </tr>
    </tbody>
    </table>
</body>
</html>
Run Code Online (Sandbox Code Playgroud)

  • 这在WebKit浏览器中也失败了(例如Safari和Chrome) (17认同)
  • CSS 2.1规范指出分页符样式属性仅应用于块级元素.表行的默认显示模式是表行.不幸的是,默认情况下,没有表元素是块级元素,包括表本身. (16认同)
  • 我可以确认这在Chrome或任何其他Webkit浏览器(例如Safari,Opera)中都不能正常工作 - 除非"工作正常"表示"排除任何被认为是可选的功能".我认为大多数人想要的是运行页眉和页脚,以及只允许行之间分页的表,截至2015/11/13,这两个表都没有在Webkit中实现. (6认同)
  • 虽然这是符合标准的方法,但目前实现该标准的唯一浏览器是Opera.请注意,这是css2的一部分,因此缺乏实施可能会在未来一段时间内成为问题,因为显然没有人关心. (5认同)
  • @SinanÜnür这不是一个要求,所以你不能依赖它,不幸的是,从我的测试中我可以看到webkit看到"可能"而忽略了它之外的任何东西.奇怪的是,IE有一些相当不错的大表打印支持.从来没有想过我会在任何一点上赞美它. (2认同)

Jos*_*h P 45

注意:使用page-break-after时:总是对于标记,它会在表的最后一位之后创建一个分页符,每次最后创建一个完全空白的页面!要解决这个问题,只需将其更改为page-break-after:auto即可.它会正确破坏而不会创建额外的空白页面.

<html>
<head>
<style>
@media print
{
  table { page-break-after:auto }
  tr    { page-break-inside:avoid; page-break-after:auto }
  td    { page-break-inside:avoid; page-break-after:auto }
  thead { display:table-header-group }
  tfoot { display:table-footer-group }
}
</style>
</head>

<body>
....
</body>
</html>
Run Code Online (Sandbox Code Playgroud)

  • 在 Chrome 上为我工作,是一个很好的纯 CSS 解决方案。 (2认同)

vic*_*era 21

从SinanÜnür解决方案扩展:

<!DOCTYPE HTML>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Test</title>
<style type="text/css">
    table { page-break-inside:auto }
    div   { page-break-inside:avoid; } /* This is the key */
    thead { display:table-header-group }
    tfoot { display:table-footer-group }
</style>
</head>
<body>
    <table>
        <thead>
            <tr><th>heading</th></tr>
        </thead>
        <tfoot>
            <tr><td>notes</td></tr>
        </tfoot>
        <tr>
            <td><div>Long<br />cell<br />should'nt<br />be<br />cut</div></td>
        </tr>
        <tr>
            <td><div>Long<br />cell<br />should'nt<br />be<br />cut</div></td>
        </tr>
        <!-- 500 more rows -->
        <tr>
            <td>x</td>
        </tr>
    </tbody>
    </table>
</body>
</html>
Run Code Online (Sandbox Code Playgroud)

似乎page-break-inside:avoid在某些浏览器中仅考虑块元素,而不是单元格,表格,行也不考虑内联块.

如果您尝试display:blockTR代码,并使用那里page-break-inside:avoid,它的工作原理,但与你的表格布局弄乱左右.

  • 这是使用jquery动态添加div的简单方法:`$(document).ready(function(){$("table tbody th,table tbody td").wrapInner("<div> </ div>"); });` (2认同)

MDa*_*ave 10

这里没有任何答案适用于Chrome.GitHub上的AAverin已经为此创建了一些有用的Javascript,这对我有用:

只需将js添加到您的代码中,并将类"splitForPrint"添加到您的表中,它将整齐地将表拆分为多个页面,并将表头添加到每个页面.


mar*_*cgg 7

使用这些CSS属性:

page-break-after

page-break-before 
Run Code Online (Sandbox Code Playgroud)

例如:

<html>
<head>
<style>
@media print
{
table {page-break-after:always}
}
</style>
</head>

<body>
....
</body>
</html>
Run Code Online (Sandbox Code Playgroud)

通过

  • 在chrome中不起作用。应用于TR时将被忽略,就像6/13/2012 (2认同)

小智 5

我最近用一个很好的解决方案解决了这个问题。

CSS :

.avoidBreak { 
    border: 2px solid;
    page-break-inside:avoid;
}
Run Code Online (Sandbox Code Playgroud)

JS

function Print(){
    $(".tableToPrint td, .tableToPrint th").each(function(){ $(this).css("width",  $(this).width() + "px")  });
    $(".tableToPrint tr").wrap("<div class='avoidBreak'></div>");
    window.print();
}
Run Code Online (Sandbox Code Playgroud)

奇迹般有效!