Преобразование XSL-FO в PDF дает неожиданный результат

Это XSL-FO, который я пытаюсь преобразовать в PDF. Когда я использую Apache FOP, в первой таблице элементы 2-й строки накладываются на 2-ю ячейку 1-й строки. Это неожиданное поведение, так как вторая таблица отображается просто отлично.

Вы можете использовать это онлайн-рендерер, чтобы увидеть сгенерированный вывод. Вставьте код XML в третье поле и конвертируйте в PDF. Что-то не так с моим xsl-fo? Насколько я вижу, обе таблицы функционально идентичны.

<?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="letter" page-height="11in" page-width="8.5in" margin-top="0.5in"
                               margin-bottom="0.5in" margin-left="0.5in" margin-right="0.5in">
            <fo:region-body region-name="xsl-region-body" column-count="2"/>
        </fo:simple-page-master>
    </fo:layout-master-set>
    <fo:page-sequence master-reference="letter">
        <fo:flow flow-name="xsl-region-body">
            <fo:block span="all" font-size="16pt" font-weight="bold" margin-top="9pt">
                <fo:inline text-decoration="underline">Sales Info</fo:inline>
            </fo:block>
            <fo:table table-layout="fixed" font-size="12pt">
                <fo:table-column column-width="2.25in"/>
                <fo:table-column column-width="1.5in"/>
                <fo:table-column column-width="2.25in"/>
                <fo:table-column column-width="1.5in"/>
                <fo:table-body>
                    <fo:table-row>
                        <fo:table-cell>
                            <fo:block font-size="12pt">Name </fo:block>
                        </fo:table-cell>
                        <fo:table-cell>
                            <fo:block font-size="12pt">: 12314</fo:block>
                        </fo:table-cell>
                        <fo:table-cell>
                            <fo:block font-size="12pt">Office Phone</fo:block>
                        </fo:table-cell>
                        <fo:table-cell>
                            <fo:block font-size="12pt">: -</fo:block>
                        </fo:table-cell>
                    </fo:table-row>
                    <fo:table-row>
                        <fo:table-cell>
                            <fo:block font-size="12pt">Email1</fo:block>
                        </fo:table-cell>
                        <fo:table-cell>
                            <fo:block font-size="12pt">: -</fo:block>
                        </fo:table-cell>
                        <fo:table-cell>
                            <fo:block font-size="12pt">Email 2</fo:block>
                        </fo:table-cell>
                        <fo:table-cell>
                            <fo:block font-size="12pt">: -</fo:block>
                        </fo:table-cell>
                    </fo:table-row>
                </fo:table-body>
            </fo:table>
            <fo:block span="all" font-size="16pt" font-weight="bold" margin-top="9pt">
                <fo:inline text-decoration="underline">Order</fo:inline>
            </fo:block>
            <fo:table table-layout="fixed" font-size="12pt">
                <fo:table-column column-width="2.25in"/>
                <fo:table-column column-width="1.5in"/>
                <fo:table-column column-width="2.25in"/>
                <fo:table-column column-width="1.5in"/>
                <fo:table-body>
                    <fo:table-row>
                        <fo:table-cell>
                            <fo:block font-size="12pt">Number</fo:block>
                        </fo:table-cell>
                        <fo:table-cell>
                            <fo:block font-size="12pt">: asdasd</fo:block>
                        </fo:table-cell>
                        <fo:table-cell>
                            <fo:block font-size="12pt">Type</fo:block>
                        </fo:table-cell>
                        <fo:table-cell>
                            <fo:block font-size="12pt">: A</fo:block>
                        </fo:table-cell>
                    </fo:table-row>
                    <fo:table-row>
                        <fo:table-cell>
                            <fo:block font-size="12pt">Region</fo:block>
                        </fo:table-cell>
                        <fo:table-cell>
                            <fo:block font-size="12pt">: 12341</fo:block>
                        </fo:table-cell>
                        <fo:table-cell>
                            <fo:block font-size="12pt">Location</fo:block>
                        </fo:table-cell>
                        <fo:table-cell>
                            <fo:block font-size="12pt">: 12341</fo:block>
                        </fo:table-cell>
                    </fo:table-row>

                </fo:table-body>
            </fo:table>
        </fo:flow>
    </fo:page-sequence>
</fo:root>

person Tereanoch    schedule 15.04.2019    source источник


Ответы (1)


Я получаю тот же результат с AH Formatter, и я был так же сбит с толку, как и вы, когда впервые увидел его.

У вашего fo:region-body есть column-count="2". Вы видите, как первая таблица разбивается на два столбца из-за следующего <fo:block span="all" ...>.

Вторая таблица не разрывается, потому что средство форматирования обычно заполняет один столбец, прежде чем поместить содержимое во второй столбец. Блок с span="all" заставляет средство форматирования сбалансировать столбцы перед размещением блока. Если вы поместите еще один из этих блоков после второй таблицы, вторая таблица будет вести себя аналогично.

В любом случае ваши таблицы слишком широки для одного столбца. Вторая таблица выглядит так, как будто она работает, но на самом деле каждая строка переполняется по ширине второго столбца.

span относится только к fo:block и fo:block-container, поэтому не относится к fo:table. Решение состоит в том, чтобы поместить fo:table внутри fo:block или fo:block-container, у которых есть span="all", чтобы ваши таблицы занимали всю ширину страницы и не разбивались на столбцы.

В качестве альтернативы, если нет ничего, что должно быть отформатировано как два столбца, вы можете избавиться от column-count="2" и всех span="all".

person Tony Graham    schedule 15.04.2019