Как разместить содержимое внизу последней страницы моего документа

У меня есть документ с некоторым содержимым (таблица, содержащая один или несколько адресов) внизу последней страницы. До сих пор таблица была стандартного размера, поэтому я мог вставить таблицу в нижний колонтитул и прикрепить этот нижний колонтитул к последней странице:

<fo:page-sequence-master master-name="leaflet">
                <fo:repeatable-page-master-alternatives>
                    <fo:conditional-page-master-reference page-position="first" master-reference="page_first_leaflet"/>
                    <fo:conditional-page-master-reference page-position="last" master-reference="page_last_leaflet"/>
                    <fo:conditional-page-master-reference master-reference="page_even_2" odd-or-even="even"/>
                    <fo:conditional-page-master-reference master-reference="page_odd
            <fo:flow flow-name="body">
                <xsl:apply-templates/><!--normal chapter content is placed here-->
                    <fo:block>
                        <fo:footnote><fo:inline color="white">1</fo:inline><!--footnote number is not visible-->
                            <fo:footnote-body>
                                <fo:block>
                                    <fo:table>
                                        <fo:table-column column-width="20mm" column-number="1"/>
                                        <fo:table-column column-width="200mm" column-number="2"/>                                   
                                        <fo:table-body>
                                            <fo:table-row>
                                                <fo:table-cell column-number="2">
                                                    <fo:block>
                                                        <xsl:apply-templates select="table[1]"/><!--table that contains the addresses-->
                                                    </fo:block>
                                                </fo:table-cell>
                                            </fo:table-row>
                                        </fo:table-body>
                                    </fo:table>
                                </fo:block>
                            </fo:footnote-body>
                        </fo:footnote>
                    </fo:block>
        </fo:flow>
leaflet" odd-or-even="odd"/> </fo:repeatable-page-master-alternatives> </fo:page-sequence-master>

Это хорошо работает, когда таблица имеет предсказуемый размер: я один раз установил размер нижнего колонтитула моей последней страницы, и все готово.

Но теперь есть просьба сделать размер стола переменным (от 5 до 15 см). Если я установлю нижний колонтитул шириной 15 см, я потеряю много места. Поэтому я хочу установить размер нижнего колонтитула динамически.
У меня нет способа прочитать высоту таблицы из XML-документа: высота ячеек по умолчанию равна 0, что означает «сделать ячейку достаточно большой, чтобы содержимое соответствовало ей». ". Так что я больше не могу поместить эту таблицу в нижний колонтитул.

Следующей моей мыслью было вставить таблицу в конец области тела. Это можно сделать с помощью конструкции сноски. Когда я помещаю сноску в конец содержимого документа, это помещает таблицу на ту же страницу, что и последний текст в документе.

            <fo:flow flow-name="body">
                <xsl:apply-templates/><!--normal chapter content is placed here-->
                    <fo:block>
                        <fo:footnote><fo:inline color="white">1</fo:inline><!--footnote number is not visible-->
                            <fo:footnote-body>
                                <fo:block>
                                    <fo:table>
                                        <fo:table-column column-width="20mm" column-number="1"/>
                                        <fo:table-column column-width="200mm" column-number="2"/>                                   
                                        <fo:table-body>
                                            <fo:table-row>
                                                <fo:table-cell column-number="2">
                                                    <fo:block>
                                                        <xsl:apply-templates select="table[1]"/><!--table that contains the addresses-->
                                                    </fo:block>
                                                </fo:table-cell>
                                            </fo:table-row>
                                        </fo:table-body>
                                    </fo:table>
                                </fo:block>
                            </fo:footnote-body>
                        </fo:footnote>
                    </fo:block>
        </fo:flow>

К сожалению, количество страниц должно быть четным, поэтому иногда после конца содержимого документа добавляется пустая страница:

<xsl:attribute name="force-page-count">end-on-even</xsl:attribute>

Итак, если мой контент состоит из 3 страниц, таблица адресов заканчивается внизу страницы 3. Но мне нужно, чтобы она была на странице 4. Этот подход работает, только если контент заканчивается на четной странице И таблица помещается в пространстве осталось.

Есть ли другой подход, который я мог бы использовать, чтобы получить блок переменного размера внизу последней страницы моего документа?


person Hobbes    schedule 08.08.2015    source источник
comment
На данный момент я использую обходной путь, помещая таблицу в нижний колонтитул последней страницы. Размер нижнего колонтитула определяется количеством строк в таблице (в основном я беру высоту 50 мм для каждой строки и устанавливаю размер нижнего колонтитула в соответствии с этим).   -  person Hobbes    schedule 12.08.2015


Ответы (1)


Вы можете принудительно установить разрыв страницы на четной странице перед последним блоком (тот, у которого есть сноска, содержащая "нижний колонтитул"):

        <fo:block break-before="even-page">
            <fo:footnote><fo:inline color="white">1</fo:inline><!--footnote number is not visible-->
                <fo:footnote-body>
                    <fo:block>
                        <fo:table>
                            <fo:table-column column-width="20mm" column-number="1"/>
                            <fo:table-column column-width="200mm" column-number="2"/>
                            <fo:table-body>
                                <fo:table-row>
                                    <fo:table-cell column-number="2">
                                        <fo:block>
                                            this is the footnote table
                                        </fo:block>
                                    </fo:table-cell>
                                </fo:table-row>
                            </fo:table-body>
                        </fo:table>
                    </fo:block>
                </fo:footnote-body>
            </fo:footnote>
        </fo:block>

Кроме того, я думаю, что вы можете безопасно оставить дочерний элемент fo:inline fo:footnote полностью пустым, чтобы ваш вывод не содержал нежелательного текста, который, даже если он не виден, все еще доступен для поиска и выбирается< /эм>; если ваш модуль форматирования жалуется на пустой fo:inline, вы можете использовать неразрывный пробел &#x00A0;.

person lfurini    schedule 08.08.2015
comment
о, это умно. Спасибо! - person Hobbes; 08.08.2015
comment
Во многих случаях это хорошо работает, но есть одно исключение: эта стратегия всегда добавляет хотя бы один разрыв страницы. Если содержимое заканчивается на странице 4 и остается достаточно места для адресной таблицы, он вставит 2 страницы и поместит таблицу на страницу 6. - person Hobbes; 10.08.2015
comment
К сожалению, вы правы, мое решение может привести к трате большего количества места, чем размещение нижнего колонтитула с максимально возможной высотой. Я начинаю думать, что, возможно, невозможно получить оптимальное решение, используя только стандартный FO... - person lfurini; 10.08.2015