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

Я создаю PDF, используя Apache FOP и таблицу стилей XSL-FO. В PDF я вывожу заголовки (html эквивалент 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 ---> 

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

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

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

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

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

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

1 Ответ

8 голосов
/ 22 ноября 2011

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

...