如何保持带有标题的表,但允许在XSL-FO中使用FOP在表体内部进行分页

时间:2011-11-21 16:18:58

标签: xsl-fo apache-fop

我正在使用Apache FOP和XSL-FO样式表生成PDF。在PDF中,我输出属于表的标题(html equiv h1),因此应始终保持在一起。但是,我的表格也可能包含很多数据,因此它们不一定适合一页。

所需的结果是一个规则集,允许标题与表保持一致,如果可能的话,同时适用于一个页面,但如果表数据太长而不适合一页,则分页符会插入表中,同时仍将标题元素保持在与表格开头相同的页面上。

我现在的解决方案确实将标题和表格保持在一起,但如果所有内容都不适合一个页面,我会收到表格数据的内容溢出错误。我希望翻页内部:避免设置在表元素上会对此有所帮助,但显然不是......建议?

示例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 ---> 

更新所需的输出

为了更好地描述我正在寻找的结果:

结果文档包含文本段落,标题和表格。

  1. 如果内容量使得表格在下一页上只有一行或两行,则xsl-fo应该将整个表格和标题移动到下一页,前提是它完全适合该页面。
  2. 如果另一方面表格如此多,那么它无论如何都不适合全新的页面,那么应该立即在文档流程中开始输出,同时仍然允许将表格拆分为几页
  3. 如果我删除了page-break-inside =“avoid”,那么我会得到一个很好地分解几个页面的表,但#1中描述的情况不会匹配。即如果只有几行最终被移动到下一页,它不会移动一个表并且它完全指向下一页。如果我保留page-break-inside,那么我会遇到长表的内容溢出问题,因为不适合页面的行不会移动到下一页。

    我想其中一个基本问题是我的输出表的长度非常动态,不幸的是我无法控制在表中产生多少数据。

1 个答案:

答案 0 :(得分:8)

CSS属性page-break-inside="avoid"映射到本机FO属性keep-together =“always”。这种映射是有问题的IMO(但这是一个不同的故事)。无论如何,我建议你使用原生FO属性keep-together.within-column="1"而不是page-break-inside。这允许Apache FOP在绝对必要时在桌面内打破。