【问题标题】:XSL-FO Overflow Handling for fo:inline-container Elementsfo:inline-container 元素的 XSL-FO 溢出处理
【发布时间】:2016-02-25 12:59:42
【问题描述】:

fo:inline-container 元素的 XSL-FO 溢出处理

我的问题是:如果 iherit 内容,如何将 fo:inline-container 内的内容(例如 fo:block 元素)破坏到新页面对当前的来说太长了?

使用的格式化程序:AHF 6.2、Apache FOP 2.1

  • 转换必须适用于两种格式化程序;因此无法使用 fo:float 元素进行简单的解决方案。

这是一个简短的代码摘录:

<xsl:template match="myElement">
    <fo:block>
        <fo:inline-container inline-progression-dimension="33.333%">
            <fo:block>
                Marginalia Headline
            </fo:block>
        </fo:inline-container>

        <fo:inline-container inline-progression-dimension="66.666%">
            <fo:block>
                Imagine this is a very long text ...
            </fo:block>
            <fo:block>
                Imagine this is a very long text ...
            </fo:block>
            <fo:block>
                Imagine this is a very long text ...
            </fo:block>
            <!-- MANY MORE fo:blocks -->
        </fo:inline-container>
    </fo:block>
</xsl:template>

问题是,内容溢出了 fo:inline-container,但没有进入新页面。我认为这与 周围的 fo:block 元素有关,该元素将所有内容都保留在一个页面上。

这里的任何建议都会有所帮助。提前谢谢!

【问题讨论】:

  • 您使用的是哪种格式化程序?您是否尝试过为此使用侧浮子或fo:list-block
  • 我同时使用 AntennaHouse 格式化程序 6.2 和 Apache FOP。所以对于 Antenna House,fo:float 方法很合适。但对于 FOP,它不会。问题是周围的 fo:block 与 fo:inline-container 元素相结合,将所有内容保存在一个页面上。我宁愿不要将我的内容放在表格中,也不要放在列表块中。
  • AFAIK,FOP 只能做侧浮动,而浮动到顶部、底部、列等,无论如何都不是必需的。

标签: xslt stylesheet xslt-2.0 xsl-fo


【解决方案1】:

什么有效

使用 fo:list-block

(好吧,你说过你宁愿不使用这个技巧......无论如何这有效并且可以作为最后的手段)

您可以将旁注放在fo:list-item-label 中,将“正常”文本放在fo:list-item-body 中:

        <fo:list-block provisional-distance-between-starts="33.333%">
            <fo:list-item>
                <fo:list-item-label end-indent="label-end()">
                    <fo:block>
                        Marginalia Headline
                    </fo:block>
                </fo:list-item-label>
                <fo:list-item-body start-indent="body-start()">
                    <fo:block>
                        Lorem ipsum dolor ...
                    </fo:block>
                    <!-- other blocks ... -->
                </fo:list-item-body>
            </fo:list-item>
        </fo:list-block>

使用溢出 fo:block-container

或者,您可以使用更扁平的格式化对象序列,将边缘放入零高度块容器,以便以下普通文本块以相同高度开始:

        <fo:block-container height="0pt" overflow="visible" keep-with-next.within-page="always">
            <fo:block end-indent="66.666%">
                Marginalia Headline
            </fo:block>
        </fo:block-container>
        <fo:block start-indent="33.333%">
            Lorem ipsum dolor ...
        </fo:block>
        <!-- other blocks ... -->

请注意,如果此解决方案产生的行数超过 X 行,则此解决方案可能会导致边缘溢出到页面底部边缘或与下一个边缘重叠,其中 X 是其相应普通文本的 orphans 属性(例如,边缘是三行长,而普通文本有orphans="2")。

什么不起作用

使用 fo:float

即使 FOP 支持侧浮动,我认为使用它们也不会实现所需的输出,因为文本会围绕它流动,尽快返回使用所有可用的水平空间:

        <fo:block>
            <fo:float float="left">
                <fo:block width="33.333%" background-color="#AAFFFF">Marginalia Headline</fo:block>
            </fo:float>
            <fo:block background-color="#FFAAFF">
                Lorem ipsum dolor ...
            </fo:block>
            <!-- other blocks ... -->
        </fo:block>

使用 fo:inline-container

我认为问题中的代码不能按预期工作不是因为外部fo:block 中缺少某些内容,而是因为包含长文本的fo:inline-container 中缺少某些内容:overflow 属性。

如果未指定,则其默认值为"auto",这意味着格式化对象处理器可以随心所欲(即使溢出也可能显示内容)。使用overflow="repeat",如果需要,处理器应该创建其他区域,以便将内容分成页面:

        <fo:block>
            <fo:inline-container inline-progression-dimension="33.333%">
                <fo:block>
                    Marginalia Headline
                </fo:block>
            </fo:inline-container><fo:inline-container inline-progression-dimension="66.666%" overflow="repeat">
                <fo:block>
                    Lorem ipsum dolor ...
                </fo:block>
                <!-- other blocks ... -->
            </fo:inline-container>
        </fo:block>

然而,FOP支持overflow="repeat"(我无法使用 Antenna House XslFormatter 进行测试,但conformance page 表示支持)。

(披露:我是一个不活跃的 FOP 开发人员)

【讨论】:

  • 好的。所以我会坚持使用 hack。因为它适用于两个处理器并提供 1:1 PDF 输出。但是我尝试使用 fo:floats 并且它们有点工作。我说“有点”是因为 FOP 中的布局与 AHF 中的布局看起来不一样。感谢您和其他人的有力帮助!这帮助很大。
猜你喜欢
  • 2010-11-08
  • 1970-01-01
  • 2017-06-19
  • 2010-10-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-04-11
  • 1970-01-01
相关资源
最近更新 更多