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

Я использую FOP версии 2.0. В моем шаблоне на первой странице есть несколько текстовых абзацев, после которых идет динамическая таблица с n строками.

...
</fo:block-container>
      <fo:block-container height="0.5cm" width="7.40cm" top="8.80cm"
                          left="0.3cm" padding=".4mm" position="absolute">
        <fo:block text-align="start" space-after.optimum="3pt"
                  line-height="14pt" font-family="sans-serif" font-size="12pt">Header
                                                                               Options</fo:block>
      </fo:block-container>
      <fo:block-container border-style="solid" border-width=".5mm"
                          height="1.00cm" width="16.40cm" top="8.80cm"
                          left="3.40cm" padding=".4mm" position="absolute">
        <fo:block text-align="start" space-after.optimum="3pt"
                  line-height="14pt" font-family="sans-serif" font-size="12pt">$header.miscInfo</fo:block>
      </fo:block-container>
      <fo:block-container width="17.40cm" top="10.30cm"
                          left="0.40cm" padding=".4mm" >
        <fo:block page-break-before="always">
        <fo:table border-top-style="solid" border-top-width="thick">
          <fo:table-body font-size="12pt" font-family="sans-serif">
            <fo:table-row border-bottom-style="solid" border-bottom-color="#000"
                          border-bottom-width="thick">
...

Таблица заключена в блок fo:block, который, в свою очередь, заключен в контейнер fo:block. Я включил <fo:block page-break-before="always">, чтобы разбить длинную таблицу на несколько страниц. Но при использовании этого таблица начинается со 2-й страницы, а оставшаяся область на первой странице остается пустой.

Я хочу, чтобы моя таблица начиналась с первой страницы после предыдущих блок-контейнеров.


person Akash    schedule 24.05.2016    source источник
comment
Я использовал ‹fo:block page-break-before=always›, чтобы разбить длинную таблицу на несколько страниц. Но это приводит к тому, что таблица начинается со второй страницы, а оставшаяся область на первой странице остается пустой. Я хочу, чтобы моя таблица начиналась с самой первой страницы после предыдущих блок-контейнеров.   -  person Akash    schedule 24.05.2016


Ответы (2)


Я вижу пару проблем в вашем шаблоне, влияющих на размещение и разбиение таблицы.

Абсолютно позиционированные блоки

Абзацы «заголовка» размещаются внутри блоков с абсолютным позиционированием: это означает, что во время обработки они выводятся из нормального потока и не влияют на расположение более поздних одноуровневых блоков (см. рекомендацию XSL-FO).

Решение: удалите position="absolute" top="..." left="..." и вместо этого используйте пробелы/поля (обратите внимание, что атрибуты top и left для fo:block-container вокруг таблицы не действуют, так как этот блок не позиционируется абсолютно). Вы можете вообще не использовать fo:block-container и использовать обычные элементы fo:block.

Перерывы

Свойство page-break-before="always" в элементе fo:block приводит к размещению разрыва страницы перед содержимым этого блока, а именно этого вы пытались избежать.

Решение: удалите свойство break.

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

person lfurini    schedule 24.05.2016
comment
Спасибо за руководство. Я удалил блок-контейнер, окружающий fo:table, использовал свойства поля блока и удалил атрибут break-page. Это сработало, и теперь моя таблица начинается с самой первой страницы после предыдущего текста. Однако я столкнулся с еще одной небольшой проблемой. Макет таблицы идеален до строк на первой странице. Но когда это продолжается на 2-й странице, столбцы смещаются вправо на некоторый запас, и последний столбец становится невидимым. Любое понимание этого, что может быть причиной? Еще раз спасибо. - person Akash; 25.05.2016
comment
@Akash Довольно сложно сказать, что может пойти не так, не глядя на измененную таблицу и мастер-страницы; кроме того, это, вероятно, должен быть новый вопрос. - person lfurini; 25.05.2016
comment
Спасибо за ваш ответ. Я задал для этого еще один вопрос с более подробной информацией по адресу stackoverflow.com/questions/37442963/ Пожалуйста, посмотрите. Заранее спасибо. - person Akash; 25.05.2016

Вы указываете, что вам нужен разрыв страницы перед ним, используя этот атрибут. Просто удалите атрибут page-break-before.

person Kevin Brown    schedule 24.05.2016
comment
Спасибо, Кевин. Атрибут page-break-before не требовался. Проблема была решена, но есть еще одна проблема, с которой я сейчас сталкиваюсь, которую я изложил в комментариях к другому ответу. Пожалуйста, посмотрите на это и посмотрите, можете ли вы что-то предложить. Спасибо еще раз. - person Akash; 25.05.2016
comment
Да, хорошо, если ответ решил вашу проблему, подумайте о том, чтобы принять ответ и задать другой вопрос. - person Kevin Brown; 03.06.2016