Apache Fop中foreach块内表格溢出时如何插入新页面?
解决Apache Fop中循环内容无法自动分页的问题
问题核心原因
你遇到的分页失效问题,本质是绝对定位容器破坏了正常文档流,加上循环节点选择错误导致的:
- 你使用的
fo:block-container设置了absolute-position="absolute"和overflow="hidden",这类脱离文档流的元素,FOP不会计算其内容的页面溢出,超出部分会直接被隐藏,无法触发自动分页。 xsl:for-each select="SummaryDetails"是遍历父节点,而实际需要处理的是子节点SummaryDetail,导致循环逻辑未正确遍历所有数据块。
解决方案步骤
移除绝对定位与溢出隐藏属性
删除fo:block-container上的absolute-position="absolute"、overflow="hidden"、top、left属性,改用margin调整内容位置,让内容回到正常文档流中,FOP才能自动检测分页需求。修正循环遍历的节点
将xsl:for-each的选择器改为SummaryDetails/SummaryDetail,确保每个数据子节点都能生成对应的表格内容。确保内容支持跨页
表格默认支持跨页拆分,若每个SummaryDetail需要作为独立块展示,可在块前添加fo:block break-before="auto"(自动判断是否分页,无需强制)。
修改后的代码示例
调整后的页面序列代码
<fo:page-sequence master-reference="A4-first" force-page-count="no-force" id="end"> <fo:flow flow-name="body"> <!-- 用margin替代绝对定位调整位置 --> <fo:block-container margin-left="0.2cm" margin-top="3.05cm"> <fo:table width="100%"> <fo:table-column column-width="5.4cm"/> <fo:table-body> <!-- 遍历每个SummaryDetail子节点 --> <xsl:for-each select="SummaryDetails/SummaryDetail"> <fo:table-row> <fo:table-cell padding="0.2cm"> <fo:block>媒体类型:<xsl:value-of select="MediaType"/></fo:block> <fo:block>T1ID:<xsl:value-of select="T1/T1ID"/></fo:block> <fo:block>T2ID:<xsl:value-of select="T1/T2/T2ID"/></fo:block> <fo:block>T3ID:<xsl:value-of select="T1/T2/T3/T3ID"/></fo:block> </fo:table-cell> </fo:table-row> </xsl:for-each> </fo:table-body> </fo:table> </fo:block-container> </fo:flow> </fo:page-sequence>
独立表格块的分页处理(可选)
如果每个SummaryDetail需要作为独立表格展示,可将表格放入循环内部,并添加自动分页判断:
<fo:page-sequence master-reference="A4-first" force-page-count="no-force" id="end"> <fo:flow flow-name="body"> <fo:block-container margin-left="0.2cm" margin-top="3.05cm"> <xsl:for-each select="SummaryDetails/SummaryDetail"> <!-- 自动判断是否需要分页 --> <fo:block break-before="auto" margin-bottom="0.5cm"> <fo:table width="100%"> <fo:table-column column-width="5.4cm"/> <fo:table-body> <fo:table-row> <fo:table-cell padding="0.2cm"> <fo:block>媒体类型:<xsl:value-of select="MediaType"/></fo:block> <fo:block>T1ID:<xsl:value-of select="T1/T1ID"/></fo:block> <fo:block>T2ID:<xsl:value-of select="T1/T2/T2ID"/></fo:block> <fo:block>T3ID:<xsl:value-of select="T1/T2/T3/T3ID"/></fo:block> </fo:table-cell> </fo:table-row> </fo:table-body> </fo:table> </fo:block> </xsl:for-each> </fo:block-container> </fo:flow> </fo:page-sequence>
内容的提问来源于stack exchange,提问作者Pooja
相关产品推荐
相关产品推荐

