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

Jen*_*gar 11 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 ---> 
Run Code Online (Sandbox Code Playgroud)

更新所需的输出

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

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

  1. 如果内容量使得表在下一页上只有一行或两行,那么xsl-fo应该将整个表和标题移动到下一页,前提是它完全适合该页面.
  2. 另一方面,如果表格如此多,那么它无论如何都不适合全新的页面,那么应该立即在文档流程中启动输出,同时仍然允许将表格拆分为几页.

如果我删除了page-break-inside ="avoid",那么我会得到一个很好地分解几个页面的表,但#1中描述的情况不会匹配.也就是说它不会移动一个表,如果只有几行最终被移动到下一页,它就会完全转向下一页.如果我保留page-break-inside,那么我会遇到长表的内容溢出问题,因为不适合页面的行不会移动到下一页.

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

Jer*_*rki 8

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