使用飞碟,如何在页脚的每一页上生成一个带有页码和总页数的 pdf?

Posted

技术标签:

【中文标题】使用飞碟,如何在页脚的每一页上生成一个带有页码和总页数的 pdf?【英文标题】:With Flying Saucer, how do I generate a pdf with a page number and page total on every page at the footer? 【发布时间】:2013-07-31 00:02:16 【问题描述】:

我花了更多的时间研究而不是自己想办法解决这个问题,所以我将在这里发布一个全面的答案。看起来这样做的信息分布在许多不同的网站上,我想把它放在一个地方。 This answer 可能是同样的东西,但我的眼睛呆滞,因为它在 Java 字符串中,而不是在 html 模板中。问题来了:

我正在渲染 PDF,我希望页面底部有一个页脚,上面写着“第 n 页,共 m”,其中“n”是您所在的页码,“m”是总页数文件。我该怎么做?

【问题讨论】:

【参考方案1】:

在你的html中,你需要把它放在body标签的某个地方:

<div id="footer">
    page <span id="pagenumber"></span> of <span id="pagecount"></span>
</div>

这应该是你的 CSS/样式:

    #footer 
        position: running(footer);
        text-align: right;
    

    @page 
        @bottom-right 
            content: element(footer);
        
    

    #pagenumber:before 
        content: counter(page);
    

    #pagecount:before 
        content: counter(pages);
    

您可以了解有关@bottom-right 选项here 的更多信息。

【讨论】:

这个解决方案对我不起作用。它只出现在最后一页。 在哪里可以找到函数 running()element() 的定义/参考。没找到。我查看的页面之一:w3schools.com/cs-s-ref/css_functions.asp @PauloOliveira 您解决了仅在最后一页显示的问题吗?我也遇到了。 @gideon 我使用了第二个答案,来自@john-mark。这条评论是关于这些功能的……因为我可以在官方页面或文档上找到它们的描述。 @PauloOliveira 当 在 中太远时,它仅显示在最后一页。将它放在更高的地方,以便在第一页结束之前打印。但约翰马克的答案更好。 【参考方案2】:

您也可以尝试更简洁的方法:

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

你需要把它放在你的 css/style 中,你不需要添加额外的页脚 HTML 元素。

【讨论】:

我在使用此解决方案时遇到了问题。我在飞碟版本 9.1.4 上。更新到 9.1.5 解决了我的问题。 在 Spring Boot webapp 中完美运行,谢谢!对于新读者:这就是你所需要的,不必添加任何 div 等。【参考方案3】:

重要错误和解决方案!

对于初学者,使用以下 John Mark 的解决方案是使其正常工作的正确方法:

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

然而,很多人可能遇到了以下问题,您的PDF 已停止生成!

这可以通过更新您的 FLYING SAUCER 的VERSION来解决。

当我的 PDF 由于 @page 和 @bottom-right css 代码而停止生成时,我正在运行 9.1.4

这是 Flying Saucer 中的一个小故障,已在 9.1.5 版本中修复!

确保更新到 9.1.5 并使用 John Mark 的答案。

【讨论】:

【参考方案4】:

@John Mark 的解决方案对我有用。在我的应用程序中,我需要在 HTML 中嵌入样式信息,因此我将其包装在 &lt;style&gt; 标记中,并将其放在 &lt;head&gt; 之前的 &lt;title&gt; 中。也许这些信息对其他人有用。

【讨论】:

【参考方案5】:

最受好评的答案对我不起作用,页脚只显示在最后一页。 (Daniel Kaplan 提供的答案下方的 cmets 中也提到了这种行为。)

以下评论提供了此问题的解决方案:

@PauloOliveira 它仅在 .将它放在更高的地方,以便在第一页结束之前打印。但约翰马克的答案更好。 – 爱德华 20 年 2 月 3 日 12:16

所以对我有用(使用 OpenPDF 的 FlyingSaucer 渲染)如下 - 将页脚元素的定义放在主要内容上方的某处并应用 Daniel Kaplan 提供的解决方案:

<body>
  <div id="header">Some header content</div>
  <div id="footer">
    page <span id="pagenumber"></span> of <span id="pagecount"></span>
  </div>
  <div th:each="item: $listOfItems">
    [The long content listing things over multiple pages...]
  </div>
</body>

还有 CSS 代码:

@page 
    size: A4 portrait;
    margin-top: 2cm;
    margin-left: 2cm;
    margin-right: 2cm;
    margin-bottom: 3cm;

    @bottom-left 
        content: element(footer); /* footer element must be specified before end of first page! */
        vertical-align: top;
    



#pagecount::after 
    content: counter(pages);


#pagenumber::after 
    counter-increment: page;
    counter-reset: page 1;

    content: counter(page);

【讨论】:

以上是关于使用飞碟,如何在页脚的每一页上生成一个带有页码和总页数的 pdf?的主要内容,如果未能解决你的问题,请参考以下文章

如何在Excel中设置页眉和页脚

如何设置Word页脚中的总页数

如何插入带有页码、文件路径和图像的页脚?

使用 CSS 在 PDF 的每一页中添加页脚文本

python-docx生成默认有页码的word文档

word中如何改变页码(页脚)的数字?