Перевод XSL-FO в PDF дает неожиданный результат - PullRequest
0 голосов
/ 15 апреля 2019

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

Вы можете использовать этот онлайн-рендерер , чтобы увидеть сгенерированный вывод.Вставьте код 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>

1 Ответ

1 голос
/ 15 апреля 2019

Я получаю тот же результат с 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".

...