block-progression-dimension / fixed height table and variabl

Here should go questions about transforming XML with XSLT and FOP.
Briotti
Posts: 16
Joined: Mon Jan 10, 2011 6:02 pm

block-progression-dimension / fixed height table and variabl

Post by Briotti »

I'm not sure this is the right place for this question (it seems more related to FO, but not sure).

Anyway:

This block-progression-dimension is driving me crazy. Probably I didn't understood how it works... well, this is the problem:

I must create a table with 3 rows and 2 columns. The width of 2 columns is fixed (say 2cm and 16cm) and the height of the whole table is fixed too (say 20cm).

The 3 rows must have an optimum height of 30%, 40% and 30% (say 6cm, 8cm and 6cm). This is in the most cases.

Sometimes, depending on the content, one row can exceeds the optimum height: because of the condition of table height, can be useful if such growt can be achieved by reduction in height of another row.

Say for instance:

right case: row heigths are 6cm, 8cm, 6cm.

worst case (the last row needs 7cm because of his content): 6cm, 7cm, 7cm, or (better) 6.5cm, 7.5cm, 7cm.

I assumed (and probably I was wrong) that block-progression-dimension.minimum, block-progression-dimension.optimum, block-progression-dimension.maximum are designed for such purpouse.

No way to have this to work on a table:

Code: Select all

<?xml version="1.0" encoding="UTF-8"?>
<fo:root xmlns:fo="http://www.w3.org/1999/XSL/Format">

<fo:layout-master-set>
<fo:simple-page-master master-name="PM">
<fo:region-body margin-top="20mm" margin-left="20mm" margin-right="20mm" margin-bottom="20mm"/>
<fo:region-before extent="20mm"/>
<fo:region-after extent="20mm"/>
</fo:simple-page-master>
</fo:layout-master-set>

<fo:page-sequence master-reference="PM">
<fo:flow flow-name="xsl-region-body">
<fo:block-container block-progression-dimension.maximum="20cm">
<fo:table block-progression-dimension.maximum="20cm" >
<fo:table-column column-width="2cm"/>
<fo:table-column column-width="10cm"/>
<fo:table-body overflow="hidden">
<fo:table-row block-progression-dimension.minimum="2cm" block-progression-dimension.optimum="6cm" block-progression-dimension.maximum="8cm" >
<fo:table-cell border="none" ><fo:block ><fo:inline>cell 11</fo:inline></fo:block></fo:table-cell>
<fo:table-cell border="solid"><fo:block><fo:inline>cell 12</fo:inline></fo:block></fo:table-cell>
</fo:table-row>
<fo:table-row block-progression-dimension.minimum="2cm" block-progression-dimension.optimum="8cm" block-progression-dimension.maximum="10cm" >
<fo:table-cell border="solid"><fo:block><fo:inline>cell 21</fo:inline></fo:block></fo:table-cell>
<fo:table-cell border="solid">
<fo:block>
<fo:inline>
cell 22. - place long text here -
</fo:inline>
</fo:block>
</fo:table-cell>
</fo:table-row>
<fo:table-row block-progression-dimension.minimum="2cm" block-progression-dimension.optimum="6cm" block-progression-dimension.maximum="8cm" >
<fo:table-cell border="none" ><fo:block><fo:inline>cell 31</fo:inline></fo:block></fo:table-cell>
<fo:table-cell border="solid" >
<fo:block>
<fo:inline >
cell 32. - place long text here -
</fo:inline>
</fo:block>
</fo:table-cell>
</fo:table-row>

</fo:table-body>
</fo:table>


</fo:block-container>
</fo:flow>
</fo:page-sequence>

</fo:root>

No way to have this to work on a table made of block-containers

Code: Select all

<?xml version="1.0" encoding="UTF-8"?>
<fo:root xmlns:fo="http://www.w3.org/1999/XSL/Format">

<fo:layout-master-set>
<fo:simple-page-master master-name="PM">
<fo:region-body margin-top="20mm" margin-left="20mm" margin-right="20mm" margin-bottom="20mm"/>
<fo:region-before extent="20mm" />
<fo:region-after extent="20mm" background-color="yellow"/>
</fo:simple-page-master>
</fo:layout-master-set>

<fo:page-sequence master-reference="PM">
<fo:flow flow-name="xsl-region-body">
<!-- block container for the whole "table" -->
<fo:block-container block-progression-dimension.maximum="20cm" >
<!-- first "table row" -->
<fo:block-container block-progression-dimension.minimum="2cm" block-progression-dimension.optimum="6cm" block-progression-dimension.maximum="9cm" >

<!-- cell (11) -->
<fo:block-container left="1pt" top="1pt" width="2cm" absolute-position="absolute" block-progression-dimension="100%" >

<fo:block><fo:inline>Blocco 1. </fo:inline></fo:block>

</fo:block-container>

<!-- cell (12) -->
<fo:block-container left="2cm" top="1pt" absolute-position="absolute" block-progression-dimension="100%"
border-top="solid 1pt red" border-left="solid 1pt red" border-right="solid 1pt" padding-right="-1pt">

<fo:block><fo:inline>1. </fo:inline></fo:block>

</fo:block-container>

</fo:block-container>

<!-- second row -->
<fo:block-container block-progression-dimension.minimum="2cm" block-progression-dimension.optimum="8cm" block-progression-dimension.maximum="9cm" border="solid 1pt" padding-right="-1pt">
<!-- cell (21) -->
<fo:block-container left="1pt" top="0pt" width="2cm" absolute-position="absolute" block-progression-dimension="100%" >

<fo:block><fo:inline>Blocco 2. </fo:inline></fo:block>

</fo:block-container>
<!-- cell (22) -->
<fo:block-container left="2cm" top="0pt" absolute-position="absolute" block-progression-dimension="100%" border-left="solid 1pt">

<fo:block>
<fo:inline>
Blocco 2. Lorem ipsum dolor sit amet, consectetur
adipisicing elit, sed do eiusmod tempor incididunt ut labore
et dolore magna aliqua. Ut enim ad minim veniam, quis
nostrud exercitation ullamco laboris nisi ut aliquip ex ea
commodo consequat. Duis aute irure dolor in reprehenderit in
voluptate velit esse cillum dolore eu fugiat nulla pariatur.
Excepteur sint occaecat cupidatat non proident, sunt in
culpa qui officia deserunt mollit anim id est
laborum.
</fo:inline>
</fo:block>

</fo:block-container>
</fo:block-container>

<!-- last row -->
<fo:block-container block-progression-dimension.minimum="2cm" block-progression-dimension.optimum="6cm" block-progression-dimension.maximum="9cm" >
<!-- cell (31) -->
<fo:block-container left="1pt" top="0pt" width="2cm" absolute-position="absolute" block-progression-dimension="100%" >

<fo:block>
<fo:inline>Blocco 2. </fo:inline>
</fo:block>

</fo:block-container>
<!-- cell (32) -->
<fo:block-container left="2cm" top="0pt" absolute-position="absolute" block-progression-dimension="100%"
border-bottom="solid 1pt red" border-left="solid 1pt red" border-right="solid 1pt" padding-right="-1pt" padding-bottom="-1pt">

<fo:block><fo:inline>
Blocco 3. Sed ut perspiciatis unde omnis
iste natus error sit voluptatem accusantium doloremque
laudantium, totam rem aperiam, eaque ipsa quae ab illo
inventore veritatis et quasi architecto beatae vitae dicta
sunt explicabo. Nemo enim ipsam voluptatem quia voluptas sit
aspernatur aut odit aut fugit, sed quia consequuntur magni
dolores eos qui ratione voluptatem sequi nesciunt. Neque
porro quisquam est, qui dolorem ipsum quia dolor sit amet,
consectetur, adipisci velit, sed quia non numquam eius modi
tempora incidunt ut labore et dolore magnam aliquam quaerat
voluptatem. Ut enim ad minima veniam, quis nostrum
exercitationem ullam corporis suscipit laboriosam, nisi ut
aliquid ex ea commodi consequatur?
Blocco 3. Sed ut perspiciatis unde omnis
iste natus error sit voluptatem accusantium doloremque
laudantium, totam rem aperiam, eaque ipsa quae ab illo
inventore veritatis et quasi architecto beatae vitae dicta
sunt explicabo. Nemo enim ipsam voluptatem quia voluptas sit
aspernatur aut odit aut fugit, sed quia consequuntur magni
dolores eos qui ratione voluptatem sequi nesciunt.
</fo:inline></fo:block>

</fo:block-container>
</fo:block-container>

</fo:block-container>
</fo:flow>
</fo:page-sequence>

</fo:root>
What I'm missing?

Thanks for all suggestions

G.
Briotti
Posts: 16
Joined: Mon Jan 10, 2011 6:02 pm

Re: block-progression-dimension / fixed height table and variabl

Post by Briotti »

I have found what I'm missing and put it the answer for other people that could have similar question.

Simply, the FO spec don't address a "block vertical justification". That's all.

To obtain such results, a double pass technique is required in order to check the resulting height by fop area three and correct as required.

Another way is try to guess the result height of the content, if it is simple. A possible approach is create an extension to paint the content on in memory image and retrieve some approximate height.
Post Reply