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

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

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

Решение, которое у меня есть сейчас, сохраняет вместе заголовок и таблицу, но я получаю сообщение об ошибке «Переполнение содержимого» для данных таблицы, если все не помещается на одной странице. Я надеялся, что установка page-break-inside: escape для элемента таблицы поможет в этом, но, видимо, нет ... предложения?

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

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

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

11
задан Jens Wegar 21 November 2011 в 18:48
поделиться