如何在 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上的高度?

在格式化内容之前,您不能在任何情况下都确定内容的高度,但可以在格式化后进行计算。

理论上,如果你有所用字体的字体指标(并且手头有很多时间(,你可以编写一个程序来计算每行可以容纳多少个字符,并计算页面上有多少行。然而,如果你处理的是中等复杂的真实世界文档,你就必须处理紧排、连字、侧浮动的入侵,以及页码中不确定的字符数与另一页上的某些内容的交叉引用。你最终会编写第二个格式化程序来计算第一个格式化程序的作用

在实践中,格式化程序在格式化文档中提供其自己的区域表示。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有其Area Tree 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和天线之家。

最新更新