如何使用 FlyingSaucer 强制执行均匀的 PDF 页数?

问题描述 投票:0回答:1

我正在开发一个 Grails 项目,该项目使用 Flying Saucer 库(通过渲染插件)生成 PDF。我需要那些可以具有任意长度的 PDF,强制其页数均匀。换句话说:如果页数为奇数,我需要在末尾添加一个空页。

我怎样才能实现这个目标?根据用户指南,它应该遵循正常的 CSS 分页规则,但这似乎不起作用。我尝试过如下规则:

body {
    page-break-after: right;
}

但他们似乎只是被忽视了。我尝试过各种变体,例如用

html
代替
body
,用
left
代替
right
,甚至用
always

这是这个库可以做的事情吗?也许有某种方法可以更直接地告诉它创建偶数个页面,而不是通过 CSS?

css pdf grails pagination flying-saucer
1个回答
0
投票

我遇到了同样的问题,并且无法仅使用 CSS 解决它(我认为@CBroe 的评论是正确的)。

最终为我工作的解决方案非常老套:我总是在文档末尾添加一个额外的空白页面(通过添加

<div style="page-break-before: always;">&#0160;</div>
作为
body
中的最后一个元素),然后剪掉该额外页面如果渲染的文档最终有奇数页,则再次出现。

我通过附加一个

PDFCreationListener
来进行“剪切”,将渲染器的内部页面数组修剪为均匀大小(代码使用 Kotlin,但可以轻松调整为其他语言):

    renderer.listener = object: DefaultPDFCreationListener() {
        override fun preOpen(iTextRenderer: ITextRenderer?) {
            val pages: List<Any?> = renderer.rootBox.layer.pages
            pageCount[0] = pages.size.and(1.inv())
            renderer.rootBox.layer.pages = pages.subList(0, pageCount[0]?:0)
        }
    }

我上面的代码,

renderer
就是
ITextRenderer
,也就是说这段代码是专门针对
flying-saucer-pdf-itext5
渲染器的。我不确定基于 PDFBox 的渲染器需要如何调整。

© www.soinside.com 2019 - 2024. All rights reserved.