2015-05-29 2 views
0

Я визуализирую таблицу, используя Apache ™ FOP (процессор форматирования объектов). Я хочу отобразить желтый блок с фиксированной высотой и шириной. Нижняя часть блока должна находиться в том же положении, где находится нижняя часть. Блок должен переполнять ячейки, блок не должен увеличивать ячейку. Я бы предпочел не использовать rowspan. Любая идея, как я могу сделать ячейку переполнения блока в FOP?Как блок отображения, который переполняет ячейку таблицы?

Изображение с фактической и ожидаемой выходной:

output

подход 1: Я пытался уже RowSpan = 2. Таблица выглядит как ожидаемая. Но код слишком сложный. Это требует дополнительной логики для вычисления строк, которые мне нужно охватить.

подход 2:

<fo:table-row> 
<fo:table-cell><fo:block>item4</fo:block></fo:table-cell> 
<fo:table-cell display-align="after"> 
    <fo:block-container overflow="visible"> 
     <fo:block background-color="yellow" padding-top="1.5mm" padding-bottom="1.5mm"> 
      Thanks 
     </fo:block> 
    </fo:block-container> 
</fo:table-cell> 

Я надеялся, что переполнение = "видимый" будет делать трюк, но это не так.

+0

Было бы лучше, если бы вы добавили некоторые подробности о том, что вы пробовали – YMomb

ответ

0

(превентивное раскрытие: Я разработчик ФОП, хотя и не очень активны в настоящее время)

Я думаю, что ваш подход # 1 (т.е. с использованием number-rows-spanned) является правильно один, так как она обеспечивает наиболее переносное решение в разных форматах.

Во всяком случае, если вы хотите идти с «простым» трюком вы могли бы использовать отрицательный space-before в специальных желтых блоках:

<fo:table width="100%" table-layout="fixed"> 
    <fo:table-column column-width="50%"/> 
    <fo:table-column column-width="50%"/> 
    <fo:table-body> 
     <fo:table-row> 
      <fo:table-cell border="1pt solid #000000"><fo:block>orange 1</fo:block></fo:table-cell> 
      <fo:table-cell border="1pt solid #000000"><fo:block></fo:block></fo:table-cell> 
     </fo:table-row> 
     <fo:table-row> 
      <fo:table-cell border="1pt solid #000000"><fo:block>orange 2</fo:block></fo:table-cell> 
      <fo:table-cell border="1pt solid #000000"><fo:block></fo:block></fo:table-cell> 
     </fo:table-row> 
     <fo:table-row> 
      <fo:table-cell border="1pt solid #000000"><fo:block>orange 3</fo:block></fo:table-cell> 
      <fo:table-cell border="1pt solid #000000"> 
       <fo:block space-before="-12.8pt" space-before.conditionality="retain" background-color="yellow" padding-top="4pt" padding-bottom="4pt" font-size="16pt">Thanks</fo:block> 
      </fo:table-cell> 
     </fo:table-row> 
    </fo:table-body> 
</fo:table> 
  • отрицательный space-before должен быть разницей между высотой нормальный блок и высота специальный один (проще, если все длины выражены в точках, как это было в примере): в этом случае (12 * 1.2) - (16 * 1.2 + 4 + 4) = -12,8
  • space-before.conditionality="retain" необходимо, чтобы избежать пространства для отбрасываются (как это в начале ячейки)
  • этот грязный трюк только работает корректно, если оба нормально и специальные блоки производят одну строку текста
  • протестирован с ФОПОМ 1.1 и ФОПОМ стволом

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

+0

lfurini space-before = "- 12.8pt" и space-before.conditionality = "сохранить" делает трюк. Но мне интересно, почему я не могу просто (без трюков) выровнять блок до нижней части ячейки. Почему я не могу поместить блок 2in x 2in в ячейку 1in x 1in и позволить блоку использовать другие ячейки? –

+0

@ JasWodnik, общее поведение заключается в том, что содержимое ячейки влияет на высоту этой ячейки и всей строки (иначе было бы трудно определить таблицы); ваш случай использования довольно необычен и может быть рассмотрен более легко с использованием охватывающих ячеек (это решение я бы рекомендовал). – lfurini