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
相关产品推荐
相关产品推荐

