【发布时间】:2012-01-03 03:13:48
【问题描述】:
我正在使用 Apache FOP 和 XSL-FO 样式表生成 PDF。在 PDF 中,我输出属于表格的标题(html equiv h1),因此应始终保持在一起。但是,我的表格也可能包含太多数据,以至于它们不一定适合一页。
所需的结果是一个规则集,它允许标题与表格一起保留,并且尽可能将两者都放在一页上,但是如果表格数据太长以至于不能放在一页上,则分页符会插入到表格中,同时仍将标题元素与表格的开头保持在同一页面上。
我现在的解决方案确实将标题和表格保持在一起,但如果所有内容都无法放入一页,我会收到表格数据的内容溢出错误。我希望 page-break-inside: Avoid set on the table 元素会对此有所帮助,但显然不是......建议?
xsl 示例(为便于阅读而缩短):
<!-- add test table with header that should stay on same page -->
<fo:block font-size="20pt" font-weight="bold">Table header</fo:block>
<fo:table keep-with-previous.within-page="always"
page-break-inside="avoid"
table-layout="fixed" border-width="1mm" border-style="solid">
<fo:table-column column-width="auto" />
<fo:table-column column-width="30mm" />
<fo:table-header text-align="center" background-color="silver">
<fo:table-row>
<fo:table-cell padding="1mm" border-width="1mm" border-style="solid">
<fo:block>First name</fo:block>
</fo:table-cell>
<fo:table-cell padding="1mm" border-width="1mm" border-style="solid">
<fo:block>Last name</fo:block>
</fo:table-cell>
</fo:table-row>
</fo:table-header>
<fo:table-body>
<!-- the table-rows can be repeated N times, spanning several pages -->
<fo:table-row >
<fo:table-cell padding="1mm" border-width="1mm" border-style="solid">
<fo:block>ab</fo:block>
</fo:table-cell>
<fo:table-cell padding="1mm" border-width="1mm" border-style="solid">
<fo:block>cd</fo:block>
</fo:table-cell>
</fo:table-row>
<!-- .... more table-row:s --->
更新所需的输出
为了更好地描述我正在寻找的结果:
结果文档包含文本段落、标题和表格。
- 如果内容量使得表格在下一页上只有一或两行,则 xsl-fo 应将整个表格和标题移动到下一页,前提是它完全适合该页面.
- 另一方面,如果表格的行数太多以至于无论如何都无法放入一个全新的页面,则应立即在文档流中开始输出,同时仍允许将表格拆分为多个页面.
如果我删除 page-break-inside="avoid",那么我会得到一个很好地跨越多个页面的表格,但 #1 中描述的情况将不匹配。 IE。它不会移动表格,并且如果只有几行最终会移动到下一页,它会完全转到下一页。如果我离开 page-break-inside,那么我会遇到长表的内容溢出问题,因为不适合页面的行不会移动到下一页。
我想其中一个基本问题是我的输出表的长度非常动态,不幸的是我无法控制生成到表中的数据量。
【问题讨论】:
-
我可能在这里误解了一些东西,但是如果您删除
page-break-inside: avoid,它不起作用是什么? -
@mzjn 看到我更新的问题,希望能稍微澄清一下这个问题?
标签: xsl-fo apache-fop