打印html时在页面上打印页码

Don*_*ino 59 html css printing-web-page

我已经阅读了很多关于打印页码的网站,但是当我尝试打印时,我还是无法显示我的html页面.
所以CSS代码是下一个:

@page {
  margin: 10%;

  @top-center {
    font-family: sans-serif;
    font-weight: bold;
    font-size: 2em;
    content: counter(page);
  }
}
Run Code Online (Sandbox Code Playgroud)

我试过把这个页面规则放在里面

@media all {
    *CSS code*
}
Run Code Online (Sandbox Code Playgroud)

在它之外,试图把它放进去@media print,但没有任何帮助我在我的页面上显示页码.我试过使用FireFox和Chrome(如你所知,基于WebKit).我认为问题出在我的html或css代码中.
有人能告诉我一个@page在几个页面的大html页面中实现这个规则的例子吗?我只需要html页面的代码和css文件的代码,这是有效的.
PS我有最新支持的浏览器版本.

Don*_*ino 53

由于@page with pagenumbers目前在浏览器中不起作用,我一直在寻找替代品.
我找到了Oliver Kohll发布的答案. 我会在这里重新发布,这样每个人都可以更容易地找到它: 对于这个答案,我们不使用@page,这是一个纯CSS答案,但在FireFox 20+版本中工作.这是一个例子的链接. CSS是:



#content {
    display: table;
}

#pageFooter {
    display: table-footer-group;
}

#pageFooter:after {
    counter-increment: page;
    content: counter(page);
}
Run Code Online (Sandbox Code Playgroud)

HTML代码是:

<div id="content">
  <div id="pageFooter">Page </div>
  multi-page content here...
</div>
Run Code Online (Sandbox Code Playgroud)

这样,您可以通过将参数编辑为#pageFooter来自定义页码.我的例子:

#pageFooter:after {
    counter-increment: page;
    content:"Page " counter(page);
    left: 0; 
    top: 100%;
    white-space: nowrap; 
    z-index: 20;
    -moz-border-radius: 5px; 
    -moz-box-shadow: 0px 0px 4px #222;  
    background-image: -moz-linear-gradient(top, #eeeeee, #cccccc);  
  }
Run Code Online (Sandbox Code Playgroud)

这个技巧对我很有用.希望它会对你有所帮助.

  • 我尝试了上面的代码.我使用的是Chrome 54.它只是在所有页面中设置了1个页码(例如,所有页面上的页面1).增量不起作用.我尝试为各种元素添加反增量(例如,分页符:之前,@ page等),但是在所有情况下它只打印1页编号(例如,所有页面上的页面1).任何帮助将不胜感激. (36认同)
  • 当我尝试这个时,我只得到最后一页底部的第1页.你不能使用2013年的CSS3标准是多么令人沮丧; 杰什. (11认同)
  • 我怀疑它从未真正增加,因为虽然它显示在每个页面上,但它仍然是同一个元素. (4认同)
  • 上述解决方案在 Chrome 上都不适合我。 (3认同)
  • 似乎对CSS Paged Media的支持开始出现在一些主流浏览器中.https://caniuse.com/#feat=css-paged-media (2认同)
  • 我将“ counter-increment:page”移动到元素的CSS选择器中,而不是伪元素“:after”中,并将“ content:counter(page)”保留在“:after”选择器中。它适用于Chrome 71,Safari 12,不确定其他浏览器。 (2认同)

WoI*_*IIe 16

尝试使用https://www.pagedjs.org/。它为所有主要浏览器填充了页面计数器、页眉/页脚功能。

@page {
  @bottom-left {
    content: counter(page) ' of ' counter(pages);
  }
}
Run Code Online (Sandbox Code Playgroud)

与 PrinceXML、Antennahouse、WeasyPrince、PDFReactor 等替代品相比,它要舒服得多......

而且完全免费!没有定价或其他什么。它真的救了我的命!

  • @Ganondorfz,您需要将 `window.PagedConfig = { auto: false };` 放在脚本标记中。当你想打印时,你需要调用`await window.PagedPolyfill.preview(); 窗口.print();`。我在这里放置了演示代码/sf/answers/4903818181/ (4认同)
  • 这太棒了,花了很长时间试图让它工作,这是最轻量级的东西,不知道为什么这不在答案列表中!如今,所有其他内容似乎都已被主要浏览器弃用:( (2认同)
  • 哇哦,我刚刚添加了脚本链接+示例 css,它已经给了我比我之前尝试过的任何结果都更好的结果。绝对值得研究! (2认同)
  • 唯一的问题是它始终应用您的 @media 打印样式 - 即使在 print css 上下文之外也是如此。如果您希望一个视图用于打印,而另一个视图用于常规浏览器查看,则这可能并不理想。 (2认同)

Kri*_*h R 6

你可以尝试一下,你可以使用 content: counter(page);

     @page {
       @bottom-left {
            content: counter(page) "/" counter(pages);
        }
     }
Run Code Online (Sandbox Code Playgroud)

参考:http://www.w3.org/TR/CSS21/generate.html#counters

http://www.princexml.com/doc/9.0/page-numbers/

  • 主流浏览器不再支持此功能:( (24认同)
  • 刚刚发现,如果样式表是通过 href 链接的,这对我有用,如果我在 html 标头中将这样的代码声明为样式标记,则不会。真的很适合我,希望它可以帮助某人 (4认同)
  • 这适用于我使用 Wea​​syPrint(PDF 生成工具)。 (2认同)
  • 截至2019年,此_still_在CSS3中不起作用。_这不是解决方案!_ (2认同)

小智 6

此 javascript 将在右下角添加带有页码的绝对定位 div,并适用于所有浏览器。

A4 高度 = 297mm = 1123px(96dpi)

<html>
    <head>
        <style type="text/css">
            @page {
              size: A4;
              margin: 0; 
            }

            body {
              margin: 0;
            }
        </style>
    </head>
    <body>
        <script type="text/javascript">
          window.onload = addPageNumbers;

          function addPageNumbers() {
            var totalPages = Math.ceil(document.body.scrollHeight / 1123);  //842px A4 pageheight for 72dpi, 1123px A4 pageheight for 96dpi, 
            for (var i = 1; i <= totalPages; i++) {
              var pageNumberDiv = document.createElement("div");
              var pageNumber = document.createTextNode("Page " + i + " of " + totalPages);
              pageNumberDiv.style.position = "absolute";
              pageNumberDiv.style.top = "calc((" + i + " * (297mm - 0.5px)) - 40px)"; //297mm A4 pageheight; 0,5px unknown needed necessary correction value; additional wanted 40px margin from bottom(own element height included)
              pageNumberDiv.style.height = "16px";
              pageNumberDiv.appendChild(pageNumber);
              document.body.insertBefore(pageNumberDiv, document.getElementById("content"));
              pageNumberDiv.style.left = "calc(100% - (" + pageNumberDiv.offsetWidth + "px + 20px))";
            }
          }
        </script>
        <div id="content">
            Lorem ipsum....
        </div>
    </body>
</html>
Run Code Online (Sandbox Code Playgroud)

  • 我使用了这个解决方案并且效果很好。我做的一个小更改是使用“window.onbeforeprint”而不是“window.onload”来获取打印上的页码,但其他情况则不然。 (3认同)
  • 还记得通过添加函数并使用窗口 onafterprint 触发来在打印后进行清理:`window.onafterprint = removePageNumbers;` (2认同)