Как получить размеры и / или до их отображения в xslfo?

#java #xsl-fo #renderx

#java #xsl-fo #renderx

Вопрос:

Более конкретно, высоту элементов блока, которые будут отображаться в документе PDF с использованием RenderX. Скажем, например, у меня есть этот простой вывод xslfo с некоторым текстом и таблицей:

 <?xml version="1.0" encoding="ISO-8859-1"?>
<fo:root xmlns:fo="http://www.w3.org/1999/XSL/Format">

<fo:layout-master-set>
  <fo:simple-page-master master-name="A4">
    <fo:region-body />
  </fo:simple-page-master>
</fo:layout-master-set>

<fo:page-sequence master-reference="A4">
  <fo:flow flow-name="xsl-region-body">
    <fo:block>This is some simple text. How much space will I take?</fo:block>
  </fo:flow>
</fo:page-sequence>

<fo:table-header>
  <fo:table-row>
    <fo:table-cell>
      <fo:block font-weight="bold">Car</fo:block>
    </fo:table-cell>
    <fo:table-cell>
      <fo:block font-weight="bold">Price</fo:block>
    </fo:table-cell>
  </fo:table-row>
</fo:table-header>

<fo:table-body>
  <fo:table-row>
    <fo:table-cell>
      <fo:block>Volvo</fo:block>
    </fo:table-cell>
    <fo:table-cell>
      <fo:block>$50000</fo:block>
    </fo:table-cell>
  </fo:table-row>
  <fo:table-row>
    <fo:table-cell>
      <fo:block>SAAB</fo:block>
    </fo:table-cell>
    <fo:table-cell>
      <fo:block>$48000</fo:block>
    </fo:table-cell>
  </fo:table-row>
</fo:table-body>

</fo:table>
</fo:table-and-caption>
</fo:root>
  

Могу ли я в любом случае определить, какую высоту будет занимать тело региона (т. Е. случайный текст и таблица) в отображаемом PDF-файле с использованием RenderX?

Комментарии:

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

2. Привет @Muhammad Sagnia, у вас есть решение для этой проблемы? Я столкнулся с аналогичной проблемой. xsl-region-before Имеют динамическую высоту из-за содержащихся в них данных, поэтому я не знаю, с чего начать xsl-region-body данные, чтобы избежать перекрытия между двумя регионами

Ответ №1:

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

Теоретически, если бы у вас были метрики шрифтов для используемых шрифтов (и много свободного времени), вы могли бы написать программу, чтобы определить, сколько символов поместится в каждой строке, и подсчитать, сколько строк у вас будет на странице. Однако, если вы имеете дело даже с умеренно сложными документами реального мира, вам придется иметь дело с такими вещами, как кернинг, лигатуры, вторжения из боковых поплавков и неопределенное количество символов на странице — перекрестные ссылки на что-то на другой странице. В конечном итоге вы напишете второй форматировщик, чтобы выяснить, что будет делать первый форматировщик.

На практике форматировщики предоставляют свое собственное представление (или представления) областей в форматированном документе. XSL 1.1 включает в себя концепцию (но не спецификацию) «дерева областей» форматированных областей. (Смhttps://www.w3.org/TR/xsl11/#clear )

RenderX имеет свой промежуточный формат вывода, задокументированный наhttp://www.renderx.com/reference.html#IntermediateFormatSpecification

FOP имеет промежуточный формат вывода, задокументированный наhttps://xmlgraphics.apache.org/fop/2.4/intermediate.html. У FOP также было второе представление дерева областей для использования с тестами, но прямо сейчас я не могу сказать, используется ли это все еще или нет.

Антенный дом имеет формат XML-дерева областей со схемой вhttps://github.com/AntennaHouse/AreaTree и документация на https://antennahouse.github.io/AreaTree/en /.

Группа сообщества печати и верстки страниц создала набор функций расширения XSLT для запуска XSL-форматера и получения дерева областей в вашем преобразовании XSLT. Код находится наhttps://github.com/pplcg/XSLTExtensions и примеры на https://www.w3.org/community/ppl/wiki/XSLTExtensions. К сожалению для вас, функции расширения работают только с FOP и Antenna House.