2
votes

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!!!

1
I added the FO-snippet, as the whole document is very big. Is that enough? Processor I am using is FOP 1.1 - K.S.
My table is as you wrote alternating image (with a fixed width) and text (width depending of the text), and all in one row. - K.S.

1 Answers

9
votes

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>