如何在xslfo中渲染<fo:block>和/或<fo:table>尺寸之前将其获取?

问题描述

更具体地说,将使用RenderX在pdf文档中渲染的块元素的高度。例如,我有一个简单的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>

无论如何,我是否可以确定区域主体(即随机文本和表格)将使用RenderX处理呈现的pdf的高度?

解决方法

在每种情况下,您都无法确定其高度,但是在格式化之后,您可以对其进行计算。

理论上,如果您掌握了所用字体的字体度量标准(并且花了很多时间),则可以编写一个程序来计算出每行可以容纳多少个字符并计算出多少行。 d页面上有。但是,如果您要处理的是甚至比较复杂的现实世界文档,则必须处理字距调整,连字,从侧面浮点数侵入以及页码交叉引用中不确定的字符数之类的问题在另一页上。您最终将编写第二个格式化程序,以计算出第一个格式化程序的工作。

在实践中,格式设置者在格式化的文档中提供其自己的区域表示形式。 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还具有第二个区域树表示形式,可用于测试,但是现在我无法确定它是否仍在使用。

Antenna House具有其区域树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。

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...