You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Grails项目中如何用FlyingSaucer强制生成偶数页数PDF?

解决FlyingSaucer生成偶数页PDF的问题

一、CSS方案(修正写法)

你之前尝试的page-break-after: right未生效,大概率是缺少正确的页面上下文配合。可以试试以下两种修正后的写法:

写法1:结合伪元素与页面规则

@page {
    size: A4; /* 按需设置纸张尺寸 */
}

body::after {
    content: "";
    display: block;
    page-break-after: always;
    visibility: hidden;
    height: 0;
}

body {
    page-break-after: right;
}

写法2:给内容容器设置规则

将所有内容包裹在一个块级容器内,对容器应用分页规则,避免直接作用在body/html上的上下文问题:

<div id="content-container">
    <!-- 你的所有PDF内容 -->
</div>
#content-container {
    page-break-after: right;
}

二、非CSS直接操作PDF方案

如果CSS规则始终不生效,可以借助FlyingSaucer底层依赖的iText库,在生成PDF后直接修改文档:

Groovy示例代码(适配Grails项目)

import com.lowagie.text.Document
import com.lowagie.text.pdf.PdfCopy
import com.lowagie.text.pdf.PdfReader

byte[] generateEvenPagePdf(Map renderParams) {
    // 用Rendering插件生成原始PDF字节流
    byte[] originalPdf = renderingService.render(renderParams)
    
    PdfReader reader = new PdfReader(originalPdf)
    int pageCount = reader.numberOfPages
    
    // 奇数页则添加空白页
    if (pageCount % 2 != 0) {
        ByteArrayOutputStream baos = new ByteArrayOutputStream()
        Document doc = new Document(reader.getPageSize(1))
        PdfCopy copy = new PdfCopy(doc, baos)
        
        doc.open()
        // 复制原始所有页面
        (1..pageCount).each { pageNum ->
            copy.addPage(copy.importedPage(reader, pageNum))
        }
        // 添加空白页
        doc.newPage()
        doc.close()
        reader.close()
        
        return baos.toByteArray()
    }
    
    reader.close()
    return originalPdf
}

这种方法直接从PDF文档层面修改,不依赖CSS渲染逻辑,兼容性更稳定。

内容的提问来源于stack exchange,提问作者Pepijn Schmitz

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.25 09:12:58