Apache FOP- 需要从第一页的中间开始创建多页 table
Apache FOP- need to create multi page table starting from middle of first page
我使用的是 FOP 2.0 版。我的模板在第一页上有一些文本段落,之后有一个包含 n 行的动态 table。
...
</fo:block-container>
<fo:block-container height="0.5cm" width="7.40cm" top="8.80cm"
left="0.3cm" padding=".4mm" position="absolute">
<fo:block text-align="start" space-after.optimum="3pt"
line-height="14pt" font-family="sans-serif" font-size="12pt">Header
Options</fo:block>
</fo:block-container>
<fo:block-container border-style="solid" border-width=".5mm"
height="1.00cm" width="16.40cm" top="8.80cm"
left="3.40cm" padding=".4mm" position="absolute">
<fo:block text-align="start" space-after.optimum="3pt"
line-height="14pt" font-family="sans-serif" font-size="12pt">$header.miscInfo</fo:block>
</fo:block-container>
<fo:block-container width="17.40cm" top="10.30cm"
left="0.40cm" padding=".4mm" >
<fo:block page-break-before="always">
<fo:table border-top-style="solid" border-top-width="thick">
<fo:table-body font-size="12pt" font-family="sans-serif">
<fo:table-row border-bottom-style="solid" border-bottom-color="#000"
border-bottom-width="thick">
...
table 被 fo:block 包围,进而被包围在 fo:block 容器中。
我包含了 <fo:block page-break-before="always">
来打破多个页面中的长 table。但是使用这个 table 从第二页开始,第一页的剩余区域保持空白。
我希望我的 table 从前面的块容器之后的第一页开始。
您通过使用该属性指定想要在它之前有一个分页符。只需远程设置 page-break-before 属性即可。
我发现您的模板中有几个问题会影响 table 的放置和断开。
绝对定位块
"header" 段落放置在绝对定位的块内:这意味着在处理过程中它们脱离了正常流并且它们不会影响后面兄弟姐妹的布局 (see the XSL-FO recommendation) .
解决方案: 删除 position="absolute" top="..." left="..."
并改用空格/边距(注意 fo:block-container
上的 top
和 left
属性=] 周围 table 没有效果,因为该块不是绝对定位的)。您可以完全避免使用 fo:block-container
,而使用正常的 fo:block
元素。
休息
fo:block
元素上的 属性 page-break-before="always"
具有在该块的内容之前放置 page-break 的效果,这恰好是 你试图避免什么。
解决方法: 去掉中断 属性.
根据建议的更改,headers 和 table 是正常内容流的一部分,它们的内容连续放置在页面中。
我使用的是 FOP 2.0 版。我的模板在第一页上有一些文本段落,之后有一个包含 n 行的动态 table。
...
</fo:block-container>
<fo:block-container height="0.5cm" width="7.40cm" top="8.80cm"
left="0.3cm" padding=".4mm" position="absolute">
<fo:block text-align="start" space-after.optimum="3pt"
line-height="14pt" font-family="sans-serif" font-size="12pt">Header
Options</fo:block>
</fo:block-container>
<fo:block-container border-style="solid" border-width=".5mm"
height="1.00cm" width="16.40cm" top="8.80cm"
left="3.40cm" padding=".4mm" position="absolute">
<fo:block text-align="start" space-after.optimum="3pt"
line-height="14pt" font-family="sans-serif" font-size="12pt">$header.miscInfo</fo:block>
</fo:block-container>
<fo:block-container width="17.40cm" top="10.30cm"
left="0.40cm" padding=".4mm" >
<fo:block page-break-before="always">
<fo:table border-top-style="solid" border-top-width="thick">
<fo:table-body font-size="12pt" font-family="sans-serif">
<fo:table-row border-bottom-style="solid" border-bottom-color="#000"
border-bottom-width="thick">
...
table 被 fo:block 包围,进而被包围在 fo:block 容器中。
我包含了 <fo:block page-break-before="always">
来打破多个页面中的长 table。但是使用这个 table 从第二页开始,第一页的剩余区域保持空白。
我希望我的 table 从前面的块容器之后的第一页开始。
您通过使用该属性指定想要在它之前有一个分页符。只需远程设置 page-break-before 属性即可。
我发现您的模板中有几个问题会影响 table 的放置和断开。
绝对定位块
"header" 段落放置在绝对定位的块内:这意味着在处理过程中它们脱离了正常流并且它们不会影响后面兄弟姐妹的布局 (see the XSL-FO recommendation) .
解决方案: 删除 position="absolute" top="..." left="..."
并改用空格/边距(注意 fo:block-container
上的 top
和 left
属性=] 周围 table 没有效果,因为该块不是绝对定位的)。您可以完全避免使用 fo:block-container
,而使用正常的 fo:block
元素。
休息
fo:block
元素上的 属性 page-break-before="always"
具有在该块的内容之前放置 page-break 的效果,这恰好是 你试图避免什么。
解决方法: 去掉中断 属性.
根据建议的更改,headers 和 table 是正常内容流的一部分,它们的内容连续放置在页面中。