Есть ли способ добавить прямую линию между двумя секциями потока в renderX (XSLT) - PullRequest
0 голосов
/ 03 мая 2018

Я использую функцию rx: flow-section RenderX, чтобы разделить страницу на две части. Однако я хотел бы иметь прямую линию, которая прошла бы весь путь между двумя разделами потока.

Возможно ли это? У меня ограниченные знания, и я предполагаю, что было бы невозможно добавить fo: leader, потому что, если бы он у меня был, он дублировался бы на каждой стороне секции потока.

1 Ответ

0 голосов
/ 05 мая 2018

Ну, RenderX XEP не предоставляет специального расширения для рисования правила желоба / столбца. Однако это можно сделать. Один из способов, который, скорее всего, нежелателен, состоит в том, чтобы отформатировать все остальное содержимое с белым фоновым цветом и вставить правило полной длины страницы или набор правил.

Я дам это решение. Это отпугнет большинство, потому что это только внутренне, вероятно, делает то, что вы могли бы сделать. Но это также показывает лишь небольшой пример того, что вы можете сделать.

Я делал это в прошлом, используя преимущества формата промежуточного вывода RenderX (XEPOUT) и несколько хитростей. Когда вы используете RenderX, вы можете запросить вывод XEPOUT вместо окончательного формата вывода (например, PDF). XEPOUT - это структурированный и документированный формат XML. Вы можете использовать XSL для его изменения, а затем отправить этот измененный XEPOUT обратно в движок, чтобы получить окончательный PDF.

По сути процесс будет:

XML + XSL -> XEPOUT + XSL -> новый XEPOUT -> RenderX -> PDF

Просто добавьте этот шаг в процессе, чтобы использовать XSL для изменения XEPOUT. Я опубликую это ниже, если вам нужна дополнительная информация о том, как заставить это работать в вашей среде, это будет сильно зависеть от того, как вы используете или интегрируете RenderX.

Есть много трюков, которые можно реализовать. В этом случае я применил красный фоновый цвет за rx: flow-section. Если вы отформатировали это в 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"/>

Это красный прямоугольник за каждым из столбцов секции потока.

Если бы я отформатировал этот документ, я бы получил:

enter image description here

Но если я вместо этого отформатирую в 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 показывает результат:

enter image description here

Это секция rx: flow с разделителем столбцов, как вы хотите.

Как я уже сказал, это много, но вы можете сделать гораздо больше, используя те же приемы. Например, в результате сгибания книг или создания новых страниц, применения градиентов к тексту или введения меток или штрих-кодов.

...