Как сохранить таблицу с заголовком, но разрешить разрывы страниц внутри тела таблицы в XSL-FO с помощью FOP

Я создаю PDF файл, используя Apache FOP и таблицу стилей XSL-FO. В 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 ---> 

Обновление на желаемом выходе

Чтобы лучше описать, какой результат я ищу:

Документ результата содержит как текстовые абзацы, так и заголовки и таблицы.

  • Если количество контента таково, что на следующей странице таблица будет иметь только одну или две строки, тогда xsl-fo должна перемещать всю таблицу и заголовок на следующую страницу при условии, что она полностью соответствует этой странице,
  • Если, с другой стороны, таблица так много строк, что она не поместилась бы на совершенно новую страницу в любом случае, то вывод должен быть сразу запущен в потоке документа, при этом разрешая разделение таблицы на несколько страниц.

Если я удаляю page-break-inside = "avoid", тогда я получаю таблицу, которая хорошо разбивается на несколько страниц, но случаи, описанные в # 1, не будут сопоставляться. То есть он не перемещает таблицу, и она целиком переходит на следующую страницу, если только несколько строк будут перемещены на следующую страницу. Если я оставлю перерыв страницы внутри, то я получаю проблему переполнения содержимого длинными таблицами, потому что строки, которые не помещаются на странице, не перемещаются на следующую страницу.

Я полагаю, что одна из основных проблем заключается в том, что мои выходные таблицы очень динамичны по длине и, к сожалению, я не контролирую, какое количество данных получается в таблицах.

Ответ 1

Свойство CSS page-break-inside = "избегать" отображает исходное свойство FO keep-together = "always". Это сопоставление является сомнительной ИМО (но это другая история). Во всяком случае, я предлагаю вам использовать родную собственность FO keep-together.within-column = "1" вместо разрыва страницы. Это позволяет Apache FOP ломаться внутри таблицы, когда это абсолютно необходимо.