2015-08-08 5 views
2

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

<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_2_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. Этот подход работает только в том случае, если содержимое заканчивается на четной странице, а таблица вписывается в оставшееся пространство.

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

+1

В настоящее время я использую обходной путь, где я помещаю таблицу в нижний колонтитул последней страницы. Размер нижнего колонтитула определяется количеством строк в таблице (в основном я предполагаю высоту 50 мм на строку и устанавливаю ее длину). – Hobbes

ответ

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;.

+0

О, это умно. Благодаря! – Hobbes

+1

Это хорошо работает во многих случаях, но есть одно исключение: эта стратегия всегда добавляет хотя бы один разрыв страницы. Если содержимое заканчивается на стр. 4, и в таблице адресов осталось достаточно места, он вставляет 2 страницы и помещает таблицу на страницу 6. – Hobbes

+0

К сожалению, вы правы, мое решение может в конечном итоге тратить больше места, чем выделение нижнего колонтитула с максимально возможной высотой. Я начинаю думать, что невозможно получить оптимальное решение, используя только стандартную FO ... – lfurini