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

Я создаю PDF-файл с помощью Apache FOP и таблицы стилей XSL-FO. В PDF-файле я выводил заголовки (html equiv h1), которые принадлежат таблице, поэтому их следует всегда хранить вместе. Однако мои таблицы также могут содержать так много данных, что они не обязательно помещаются на одной странице.

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

решение, которое у меня есть прямо сейчас, сохраняет заголовок и таблицу вместе, но я получаю ошибку переполнения содержимого для данных таблицы, если все не помещается на одну страницу. Я надеялся, что page-break-inside: avoid set on the table element поможет в этом, но, по-видимому, нет... предложения?

пример 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. если на с другой стороны, таблица так много строк, что она все равно не поместится на совершенно новой странице, тогда вывод должен быть запущен сразу в потоке документов, все еще позволяя таблице разбивать acros на несколько страниц.

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

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

1 ответов


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