XSL-FO: How to set dynamic table width?

13,579

What you need is called automatic table layout and is theoretically achieved setting inline-progression-dimension and table-layout to auto:

<fo:table inline-progression-dimension="auto" table-layout="auto">
   ... columns, table-body ...
</fo:table>

However, FOP does not support auto layout yet; if you don't set a width for the table the whole line width will be used, and will be divided between the columns according to their column-width (either fixed or as a percentage), or in equal parts if columns don't have an explicitly set width.

Confusing for me: If I wrap it into an Inline-Element (which has the expected behavior), the Table has not the behavior of the Inline-Element but turns again to be a Block-Element.

An fo:table always creates block areas, and wrapping it inside an fo:inline is not going to change that.

Edit: workaround

In the specific case of a single row of objects (as in the question) a table might not be needed at all, and the desired output could be achievable using just inline objects:

<inline keep-together.within-line="always">
    <external-graphic height="3mm" width="4.76mm" overflow="hidden" 
        content-height="3mm" src="image1.jpg"/>
    Image name 1
    <external-graphic height="3mm" width="4.76mm" overflow="hidden" 
        content-height="3mm" src="image2.jpg"/>
    Image name 2
    <external-graphic height="3mm" width="4.76mm" overflow="hidden" 
        content-height="3mm" src="image3.jpg"/>
    Image name 3
    <external-graphic height="3mm" width="4.76mm" overflow="hidden" 
        content-height="3mm" src="image4.jpg"/>
    Image name 4
</inline>
Share:
13,579
K.S.
Author by

K.S.

Updated on June 16, 2022

Comments

  • K.S.
    K.S. about 2 years

    I have this problem: I need a FO-table, which is just as wide as the width of the content (cells). But when I add a table in my FO-markup, it is always acting like a Block-Level-Element and using the width of the wohle row.

    Confusing for me: If I wrap it into an Inline-Element (which has the expected behavior), the Table has not the behavior of the Inline-Element but turns again to be a Block-Element.

    Does someone has an idea of how to solve that?

    Here my markup:

    <inline width="auto">
        <table table-layout="fixed">
            <table-column column-width="6.36mm"/>
            <table-column/>
            <table-column column-width="6.36mm"/>
            <table-column/>
            <table-column column-width="6.36mm"/>
            <table-column/>
            <table-column column-width="6.36mm"/>
            <table-column/>
            <table-body>
                <table-row>
                    <table-cell padding-right="1.6mm">
                        <block-container height="3mm" width="4.76mm" overflow="hidden">
                            <block>
                                <external-graphic content-height="3mm" src="image1.jpg"/>
                            </block>
                        </block-container>
                    </table-cell>
                    <table-cell>
                        <block>
                            Image name 1
                        </block>
                    </table-cell>
                    <table-cell padding-right="1.6mm">
                        <block-container height="3mm" width="4.76mm" overflow="hidden">
                            <block>
                                <external-graphic content-height="3mm" src="image2.jpg"/>
                            </block>
                        </block-container>
                    </table-cell>
                    <table-cell>
                        <block>
                            Image name 2
                        </block>
                    </table-cell>
                    <table-cell padding-right="1.6mm">
                        <block-container height="3mm" width="4.76mm" overflow="hidden">
                            <block>
                                <external-graphic content-height="3mm" src="image3.jpg"/>
                            </block>
                        </block-container>
                    </table-cell>
                    <table-cell>
                        <block>
                            Image name 3
                        </block>
                    </table-cell>
                    <table-cell padding-right="1.6mm">
                        <block-container height="3mm" width="4.76mm" overflow="hidden">
                            <block>
                                <external-graphic content-height="3mm" src="image4.jpg"/>
                            </block>
                        </block-container>
                    </table-cell>
                    <table-cell>
                        <block>
                            image name4
                        </block>
                    </table-cell>
                </table-row>
            </table-body>
        </table>
    </inline>
    

    (Maybe important notice: My columns need to be toggling with fixed and auto-width)

    Thank you already!!!

  • K.S.
    K.S. over 9 years
    You are great, Ifurini :) Very good solution, I did not know that I can clip an image just with 'width' and 'content-widht' and the property '....within-line' was not that familiar for me, too. Fine. Can I give you another 25 points? :D