如何实现Apache FOP/XSL:FO生成的PDF页数为4的倍数
实现Apache FOP/XSL:FO生成PDF页数为4的倍数的自动补页方案
由于force-page-count属性仅支持将页数补为偶数/奇数,无法满足4的倍数要求,可通过以下两种方案实现自动补空白页:
方案一:利用Apache FOP扩展功能(推荐)
该方案基于实际生成的总页数计算需要补充的空白页数量,准确性更高。
- 添加FOP扩展命名空间
在FO文档的根元素fo:root中引入FOP扩展命名空间:
<fo:root xmlns:fo="http://www.w3.org/1999/XSL/Format" xmlns:fox="http://xmlgraphics.apache.org/fop/extensions">
- 为主内容页序列设置ID
给包含主内容的fo:page-sequence添加唯一ID,方便后续引用最后一页页码:
<fo:page-sequence id="main-content" master-reference="your-page-master"> <!-- 此处放置你的主内容流 --> </fo:page-sequence>
- 添加空白页补全的页序列
在主内容页序列之后,新增一个专门用于补空白页的页序列,通过FOP扩展获取主内容的最后一页页码,计算并插入对应数量的空白页:
<fo:page-sequence master-reference="your-page-master"> <!-- 隐藏空白页的页眉页脚(如果不需要) --> <fo:static-content flow-name="xsl-region-before"> <fo:block/> </fo:static-content> <fo:static-content flow-name="xsl-region-after"> <fo:block/> </fo:static-content> <fo:flow flow-name="xsl-region-body"> <xsl:variable name="last-main-page" select="fox:page-number-citation-last('main-content')"/> <xsl:variable name="remainder" select="$last-main-page mod 4"/> <xsl:if test="$remainder != 0"> <xsl:variable name="pages-to-add" select="4 - $remainder"/> <!-- 循环生成需要的空白页 --> <xsl:for-each select="1 to $pages-to-add"> <fo:block break-after="page"/> </xsl:for-each> </xsl:if> </fo:flow> </fo:page-sequence>
方案二:XSLT预处理估算页数(仅适用于结构化内容)
如果内容结构固定(比如每页固定行数、固定元素数量),可在XSLT阶段估算总页数,再插入对应空白页:
- 计算估算页数
在XSLT中统计内容元素数量,结合每页可容纳的元素数计算总页数:
<xsl:variable name="content-items" select="count(/root/content/item)"/> <xsl:variable name="items-per-page" select="20"/> <!-- 根据实际布局调整 --> <xsl:variable name="estimated-pages" select="ceiling($content-items div $items-per-page)"/> <xsl:variable name="remainder" select="$estimated-pages mod 4"/> <xsl:variable name="pages-to-add" select="if ($remainder != 0) then 4 - $remainder else 0"/>
- 在FO模板中插入空白页
将计算得到的$pages-to-add传入FO模板,循环生成空白页:
<fo:page-sequence master-reference="your-page-master"> <fo:flow flow-name="xsl-region-body"> <xsl:for-each select="1 to $pages-to-add"> <fo:block break-after="page"/> </xsl:for-each> </fo:flow> </fo:page-sequence>
注意:该方案受内容布局(如换行、图片、表格跨页)影响较大,准确性不如方案一,仅适合简单结构化内容场景。
内容的提问来源于stack exchange,提问作者Stefan Jung
相关产品推荐
相关产品推荐

