如何计算打印HTML的CSS分页符?

时间:2011-01-10 19:10:06

标签: javascript html css printing

我正在使用HTML生成报告,我正在使用CSS来控制使用分页符等的分页。我已经为用户提供了一次打印多个报告的选项,我创建了一个单独的部分动态生成的HTML文档。将其作为单个文档使其成为单个打印作业,以避免打印假脱机问题。

我的问题是:我想以“page x of n”格式对较大动态HTML的一部分页面进行编号。但是,如果我让打印机执行此操作,它会将文档(正确地)视为单个文档并对整个文档进行编号。

我有什么方法可以确定何时会发生CSS分页符,所以我可以在打印前将它们计算为一个部分,然后将我自己的编号(例如HTML元素)放入长单个部分中文件?

似乎应该有一种方法让我这样做,但在过去的几天里,解决方案躲过了我,所以我想我会ping Stackoverflow。

更新:我最终做了什么:

我接受了克里斯托弗的回答,因为虽然我没有完全使用它,但它指出了我正确的方向。

我最终使用jQuery对内容进行了计算,基于打印的纸张大小,边距,字体大小等,然后添加了具有用于分页的CSS的分页符元素。我跟踪添加了多少分页符div,然后在处理完所有内容后更新每个分页符div中的html“page x of n”信息。这让我可以避免在开始时知道会有多少页面(感谢jQuery .each)。

显然这个解决方案存在一些问题:

  1. “x页面的n”元素不会显示为真正的页脚,而是显示在每个页面上内容的底部。在我的情况下,这是一个可以接受的妥协。

  2. 拆分内容大于页面的内容元素,特别是考虑到大部分内容都是由php生成的,有点复杂。我让它成功了,但同样,它需要的假设可能会因打印变化而中断。

  3. 计算取决于有关打印纸张尺寸,边距,字体大小等的假设。在我在Intranet上运行的情况下,这也是可接受的折衷方案,因为我可以控制这些选项。可以添加附加代码以处理将来的一些变化(例如纸张大小)。

  4. 这个解决方案,虽然不完美,有点“脆弱”,解决了我的问题,允许我一次打印多个报告,避免打印机假脱机,跟踪和重新启动页面编号,并避免生成PDF作为中间步骤印刷。

    我发现这是一个奇怪的难以破解,所以我仍然会欣赏有关解决方案的意见和建议。

    谢谢!

    更新2:最终解决方案......自己避免头痛:

    虽然我采用这种方法可能比我应该做的更远,但取得了一些小小的成功,最终解决方案真的不是一个,因为它最终变得太“脆弱”了。报告格式的任何变化,添加到现有报告中的新内容,纸张大小等都打破了计算,最终导致了大量的额外工作!

    那么,最终的解决方案呢? “抵抗力是徒劳的!”只需将报告作为PDF格式。如果你愿意,你可以开始“我们告诉过你”合唱,我可以接受;-)

    我选择了TCPDF图书馆,这本书很棒,如果有点难以开始的话。这些例子非常有用。现在我对报告进行了完整的自定义,所有内容都按原样生成。多个报告很容易创建为单个PDF(防止打印假脱机问题),页面组允许编号完全按照我的需要工作。

    所以,如果你想做这样的事情,我会建议你切入追逐,跳过HTML / CSS类型报告的挫折,并做PDF。

5 个答案:

答案 0 :(得分:4)

这将显示页码,但不显示总页数:

footer {
    position:fixed;
    bottom:0;
    left:0;
}

body {
    counter-reset: page_number;
}

#page-number:after {
    counter-increment: page_number;
    content: "Page " counter(page_number);
}

有类似

的东西
<p id='page-number'></p>

在页脚中。

浏览器:Firefox 19.0.2

答案 1 :(得分:3)

我假设您在每个报告的末尾放置一个CSS分页符,而不是在每个页面的末尾手动放置。所以你的问题是知道什么时候在一个长HTML文档中自然会发生分页。答案是 - 你做不到。即使您知道页面中有多少行适合(例如),您也只能知道给定页面大小和打印设置。如果有人决定在法律文件上打印200%的法律报告,那么你的文件永远不会知道。在我看来,你的选择是1)猜测或2)不要担心它。

答案 2 :(得分:3)

我已经能够使用wkhtmltopdf在创建用于打印的PDF时实现分页符。 虽然我不确定我的解决方案是否与非webkit浏览器兼容,但我确定如果需要,你可以获得所有broswers的供应商前缀。

继承人我做了什么,使用page-break-inside: avoid;&amp; page-break-after: always;

然后使用jquery我计算了我的部分的高度并计算(如果页面大小将是a4)中断发生了多少次,并使用jquery和pdf页脚动态编号页面(在创建pdf之前)所以当用户下载pdf时,它编号正确。

我建议的是设置页面(作为打印样式表),以便在页面的这些高度可以看到页码,也许使用绝对定位。

但我认为这不是安全的。

给他们一个PDF来打印,然后你有更多的控制权,不必担心网页打印样式表,前提是PDF下载链接是显着的显示。

答案 3 :(得分:0)

您不能计算分页符,但您可以计算分栏符,其行为非常相似。

只要您有分页符样式,请将它们与匹配的分栏符号配对:

-webkit-column-break-inside: avoid;
-webkit-break-inside: avoid;

然后将报告设置为使用与打印页面大小相匹配的列:

.page.precalc {
    width: 16800mm;
    height: 257mm;
    -webkit-column-width: 168mm;
    .content {
        width: 168mm;
    }
}

分栏符与分页符的工作方式非常相似,因此您只需测量水平位置即可确定元素的页码。

var left = el.getBoundingClientRect().left;
pageNumber = Math.round(left/635) + 1

CSS列仍然有点支持,因此可能无法正确打印。但是,您可以在完成布局计算后立即删除.precalc样式,以便视图将返回到原始垂直布局。根据使用情况,屏幕/打印介质查询也可以起作用。

以上内容适用于我使用phantomjs生成目录。让它在用户控制的任意浏览器中工作有点复杂。

答案 4 :(得分:-1)

以下代码片段将产生;在页面上的每个h2之前打印分页符。

摘自here

<style type="text/css">
  h2 {
    page-break-before: always;
  }
</style>