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