有没有办法在 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 页或将渐变应用于文本或注入页数标记或条形码。
我正在使用 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 页或将渐变应用于文本或注入页数标记或条形码。