我正在开发一个 Grails 项目,该项目使用 Flying Saucer 库(通过渲染插件)生成 PDF。我需要那些可以具有任意长度的 PDF,强制其页数均匀。换句话说:如果页数为奇数,我需要在末尾添加一个空页。
我怎样才能实现这个目标?根据用户指南,它应该遵循正常的 CSS 分页规则,但这似乎不起作用。我尝试过如下规则:
body {
page-break-after: right;
}
但他们似乎只是被忽视了。我尝试过各种变体,例如用
html
代替 body
,用 left
代替 right
,甚至用 always
。
这是这个库可以做的事情吗?也许有某种方法可以更直接地告诉它创建偶数个页面,而不是通过 CSS?
我遇到了同样的问题,并且无法仅使用 CSS 解决它(我认为@CBroe 的评论是正确的)。
最终为我工作的解决方案非常老套:我总是在文档末尾添加一个额外的空白页面(通过添加
<div style="page-break-before: always;"> </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 的渲染器需要如何调整。