Я создаю 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 --->
] Чтобы лучше описать, какой результат я ищу:
Документ с результатами содержит абзацы текста, заголовки и таблицы.
Если я удалю page-break-inside = "escape", то получу таблицу, которая красиво разбивается на несколько страниц, но случаи, описанные в # 1, не будут сопоставлены. Т.е. он не перемещает таблицу и полностью переходит на следующую страницу, если только несколько строк будут перемещены на следующую страницу. Если я оставлю page-break-inside, то у меня возникнет проблема переполнения содержимого с длинными таблицами, потому что строки, которые не помещаются на странице, не перемещаются на следующую страницу.
Я полагаю, что одна из основных проблем заключается в том, что мои выходные таблицы очень динамичны по длине, и, к сожалению, я не могу контролировать, какой объем данных создается в таблицах.