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

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

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

【问题讨论】:

    标签: java css pdf flying-saucer xhtmlrenderer


    【解决方案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/cssref/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);
        }
        

        【讨论】:

          猜你喜欢
          • 2014-04-04
          • 2012-01-05
          • 2013-12-18
          • 2013-11-18
          • 1970-01-01
          • 1970-01-01
          • 2021-03-06
          • 2019-10-07
          • 1970-01-01
          相关资源
          最近更新 更多