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


72

我已经阅读了很多有关打印页码的网站,但是当我尝试打印html页时,仍然无法显示它。
接下来是CSS代码:

@page {
  margin: 10%;

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

我试图把这个页面规则放进去

@media all {
    *CSS code*
}

在其外部,尝试将其放入@media print,但没有任何帮助使我在页面上显示页码。我尝试使用FireFox和Chrome(您知道基于WebKit的浏览器)。我认为问题出在我的HTML或CSS代码中。
有人可以告诉我一个@page在具有多个页面的html大页面中实现此规则的示例吗?我只需要html页面的代码和css文件的代码即可。
PS我拥有最新支持的浏览器版本。



@James Donnelly嗯,问题很简单,但是我和我一样在这里回答了我的问题。
Donvino 2014年


当前,手动执行类似Rul的操作似乎可以在此问题中完成stackoverflow.com/questions/16297619似乎是唯一可行的方法..
phil294

Answers:


63

由于具有页面编号的@page暂时无法在浏览器中工作,因此我一直在寻找替代方法。
我找到了Oliver Kohll发布的答案。 我将其重新张贴在这里,以便每个人都可以更轻松地找到它: 对于此答案,我们没有使用@page,它是纯CSS答案,但可以在FireFox 20+版本中使用。这是一个示例链接。 CSS是:



#content {
    display: table;
}

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

#pageFooter:after {
    counter-increment: page;
    content: counter(page);
}

HTML代码是:

<div id="content">
  <div id="pageFooter">Page </div>
  multi-page content here...
</div>

这样,您可以通过将参数修改为#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);  
  }

这个技巧对我来说很好。希望对您有帮助。


51
我尝试了上面的代码。我正在使用Chrome54。它仅在所有页面(例如,所有页面上的第1页)中设置1个页码。增量不起作用。我尝试对各种元素(例如page-break:before,@ page等)添加反增量,但是在所有情况下,它仅打印1页码(例如,在所有页面上均为Page 1)。在这里的任何帮助将不胜感激。
Sonal

12
尝试此操作时,我只会在最后一页的底部获得第1页。您无法使用2013年以来的CSS3标准,实在令人沮丧。杰什。
Furbeenator '16

6
我怀疑它永远不会真正增加,因为尽管它显示在每一页上仍然是一个相同的元素。
Ytrog,2013年

2
似乎对CSS Paged Media的支持已开始在某些主要浏览器中出现。caniuse.com/#feat=css-paged-media
Dylan Kinnett

4
我将移动counter-increment: page到元素的CSS选择器而不是伪元素,:after并将保留content: counter(page):after选择器中。它适用于Chrome 71,Safari 12,不确定其他浏览器。
Kansha

13

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

@page {
  @bottom-left {
    content: counter(page) ' of ' counter(pages);
  }
}

与PrinceXML,Antennahouse,WeasyPrince,PDFReactor等替代方案相比,它要舒适得多。

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


2
这真是太棒了,花了很长时间尝试使它起作用,这是最轻巧的东西,不知道为什么它不在答案之列!这些天所有其他东西似乎都被主流浏览器所弃用了:(
E.Hazledine

2
噢,我刚刚添加了脚本链接+示例CSS,它已经给了我比以前尝试过的任何方式更好的结果。绝对值得一看!
WtFudgE

唯一的问题是,即使在打印CSS上下文之外,它也始终应用@media打印样式。如果您想要一个视图用于打印,而另一个视图用于常规浏览器查看,则可能不希望这样做。
Ganondorfz

@Ganondorfz也许您可以尝试不包括pagedj用于常规浏览器查看?
WoIIe

6

你可以试试看吗,可以用 content: counter(page);

     @page {
       @bottom-left {
            content: counter(page) "/" counter(pages);
        }
     }

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

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


32
主要浏览器不再支持此功能:(
philk

@Krish R,似乎您可以帮助我。看这个:stackoverflow.com/questions/43950603/…–
塞缪尔·托

4
刚发现,如果样式表是通过href链接的,那么这对我有用,如果我在html头中声明了诸如style标签之类的代码,则不会。真的很适合我,希望对您
有所

1
这对我使用WeasyPrint(PDF生成工具)有效。
该死的

3
截至2019年,这在CSS3中仍然不起作用。 这不是解决方案!
安德鲁·格雷

1

此javascript将在页面的右下角添加绝对定位的div,其页面号在所有浏览器中均可使用。

A4高度= 297毫米= 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>

对我不起作用
Ousama

嗨@Ousama你能给你模板吗?
madz

打印时,请删除浏览器添加的默认边距。
madz

-2

这就是你想要的:

@page {
   @bottom-right {
    content: counter(page) " of " counter(pages);
   }
}

9
计数器(页面)始终为我返回0,有什么线索吗?
iamtoc

11
不幸的是,到目前为止,任何主流浏览器似乎都不支持此功能。
cuddlecheek

2
为我工作时使用WeasyPrint==0.42.2
chidimo将

-2
   **@page {
            margin-top:21% !important; 
            @top-left{
            content: element(header);

            }

            @bottom-left {
            content: element(footer
 }
 div.header {

            position: running(header);

            }
            div.footer {

            position: running(footer);
            border-bottom: 2px solid black;


            }
           .pagenumber:before {
            content: counter(page);
            }
            .pagecount:before {
            content: counter(pages);
            }      
 <div class="footer" style="font-size:12pt; font-family: Arial; font-family: Arial;">
                <span>Page <span class="pagenumber"/> of <span class="pagecount"/></span>
            </div >**

2
从什么时候开始在浏览器中起作用?en.wikipedia.org/wiki/…Margin boxes完全不支持根据此表
user3568719

你可以嵌入后它的工作pagedjs :)
WoIIe

对我不起作用
Ousama
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.