有没有办法在 renderX (XSLT) 中的两个流程部分之间添加一条直线

Is there a way to add a straight line between two flow section in renderX (XSLT)

我正在使用 RenderX 的 rx:flow 部分功能将页面一分为二。但是,我希望有一条直线可以一直穿过两个流程部分之间的页面。

这可能吗?我的知识有限,我认为不可能添加 fo:leader,因为如果我有一个,它将在流段的每一侧重复。

嗯,RenderX XEP 没有提供特殊的扩展来绘制 gutter/column 规则。但是,这是可以做到的。一种可能不受欢迎的方法是将所有其他内容的背景色设置为白色,并插入整页长度规则或规则集。

我会给出这个解决方案。它最会吓跑,因为它可能只是在内部做你能做的事。但也只是展示了一小部分您可以执行的操作。

我过去曾利用 RenderX 的中间输出格式 (XEPOUT) 和一些技巧来做到这一点。当您使用 RenderX 时,您可以请求输出 XEPOUT 而不是最终输出格式(如 PDF)。 XEPOUT 是一种结构化和文档化的 XML 格式。您可以使用 XSL 对其进行修改,然后将修改后的 XEPOUT 发送回引擎以获得最终的 PDF。

基本上这个过程是:

XML + XSL -> XEPOUT + XSL -> 新 XEPOUT -> RenderX -> PDF

只需在使用 XSL 修改 XEPOUT 的过程中添加一个步骤。我将在下面 post 这个,如果您需要更多关于如何在您的环境中进行这项工作的信息,这在很大程度上取决于您如何使用或集成 RenderX。

可以实施的技巧有很多。在这种情况下,我所做的是在 rx:flow 部分后面应用红色背景色。如果您将其格式化为 XEPOUT,您会在内容中找到(在所有其他文本和内容中):

 <xep:rgb-color red="1.0" green="0.0" blue="0.0"/>
 <xep:rectangle x-from="72000" y-from="93600" x-till="282000" y-till="676800"/>

这是流量部分每一列后面的红色矩形。

如果我要格式化该文档,我会得到:

但如果我改为格式化为 XEPOUT,然后使用 XSL 对其进行处理,我可以在创建 PDF 之前更改文档。

使用简单的 XSL,我实际上可以删除那些红色矩形并使用尺寸并在列之间画一条线。此示例假定只有一个两栏文档,但您可以根据需要进行修改(包括选择红色以外的替代颜色)。我没有在这里完成全部工作,您可以增强它以使其更加居中,甚至可以实现多条线。如果您选择做这样的事情,这只是一个让您滚动的例子。

    <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
        xmlns:math="http://exslt.org/math"
        xmlns:xep="http://www.renderx.com/XEP/xep" exclude-result-prefixes="math" version="1.0">
        <xsl:template match="xep:page">
            <!-- Get page width -->
            <xsl:variable name="page-width">
                <xsl:value-of select="number(@width)"/>
            </xsl:variable>
            <!-- get lower and upper y-pos of longest line {color} xep:rectangle -->
            <xsl:variable name="y-till-pos">
                <xsl:value-of select="math:min(xep:rgb-color[@red='1.0']/following-sibling::xep:rectangle[1]/@y-till)"/>
            </xsl:variable>
            <xsl:variable name="y-from-pos">
                <xsl:value-of select="xep:rgb-color[@red='1.0']/following-sibling::xep:rectangle[1]/@y-from - 12000"/>
            </xsl:variable>
            <xep:page>
                <xsl:apply-templates select="@*"/>
                <!-- Draw Line -->
                <xep:line x-from="{$page-width div 2 - 500}" y-from="{$y-from-pos}" x-till="{$page-width div 2 + 500}" y-till="{$y-till-pos}" thickness="1000" style="solid"/>
                <xsl:apply-templates select="*"/>
            </xep:page>
        </xsl:template>
        <!-- remove red and rectangle -->
        <xsl:template match="xep:rectangle[preceding-sibling::*[1][name()='xep:rgb-color'][@red='1.0']]"/>
        <xsl:template match="xep:rgb-color[@red='1.0']"/>
        <!-- identity copy rules -->
        <xsl:template match="node() | @*">
            <xsl:copy>
                <xsl:apply-templates select="@*"/>
                <xsl:apply-templates select="node()"/>
            </xsl:copy>
        </xsl:template>
    </xsl:stylesheet>

PDF 中的两页视图显示结果:

这是一个 rx:flow 部分,带有您想要的列分隔符。

正如我所说,它很多,但使用相同的技术您可以做的事情更多。像折书结果或制作 n-up 页或将渐变应用于文本或注入页数标记或条形码。