【问题标题】:progress-radial, linear-gradient in XSL-FOXSL-FO 中的进度径向、线性梯度
【发布时间】:2017-07-27 08:24:53
【问题描述】:

是否可以使用 SVG 或其他方式在 XSL-fo 中创建径向进度条?

我的任务是从我用 xsl-fo 编写的 XSL 生成 pdf 文档。我们的 CSS 专家对其进行了编码(但无法帮助我生成 pdf 和 xsl-fo),但不确定如何在 xsl-fo 中重新创建它,以便 pdf 文档也具有正确的进度条百分比。

这是我应该重新创建的: Radial progress bar 他的部分 CSS 代码是:

.progress-radial {
    float: left;
    margin-right: 30px;
    position: relative;
    width: 140px;
    height: 140px;
    border-radius: 50%;
    border: 2px solid #aa94a8;
    background-color: #5d2f5d
}
.progress-radial .overlay {
    position: absolute;
    width: 100px;
    height: 100px;
    background-color: #fff;
    border-radius: 50%;
    margin-left: 20px;
    margin-top: 20px;
    text-align: center;
    line-height: 100px;
    font-size: 32px;
    color: #6c566a
}
.progress-0 {
    background-image: linear-gradient(90deg, #aa94a8 50%, transparent 50%, transparent), linear-gradient(90deg, #5d2f5d 50%, #aa94a8 50%, #aa94a8)
}
.progress-1 {
    background-image: linear-gradient(90deg, #aa94a8 50%, transparent 50%, transparent), linear-gradient(93.6deg, #5d2f5d 50%, #aa94a8 50%, #aa94a8)
}
.progress-2 {
    background-image: linear-gradient(90deg, #aa94a8 50%, transparent 50%, transparent), linear-gradient(97.2deg, #5d2f5d 50%, #aa94a8 50%, #aa94a8)
}

谢谢

【问题讨论】:

  • 将您的浏览器指向此处codepen.io/JMChristensen/pen/Ablch 并查看代码。您可以测试一些东西,看看它们是如何在代码中“绘制”SVG 的。然后,您可以根据您的输入百分比调整将 SVG 绘制到 XSL FO 中,并修改为您自己的外观。

标签: svg progress-bar xsl-fo linear-gradients radial-gradients


【解决方案1】:

这里有一些跑步的灵感。鉴于此 XML:

<charts>
   <chart percent="20"/>
   <chart percent="40"/>
   <chart percent="90"/>
</charts>

并使用这个简单的 XSL(我已经消除了所有 XSL FO 页面的东西):

<xsl:template match="charts">
    <xsl:apply-templates/>
</xsl:template>
<xsl:template match="chart">
    <fo:block>
        <fo:instream-foreign-object>
            <xsl:call-template name="drawchart">
                <xsl:with-param name="percent" select="@percent"/>
                <xsl:with-param name="r" select="90"/>
            </xsl:call-template>
        </fo:instream-foreign-object>
    </fo:block>
</xsl:template>
<xsl:template name="drawchart">
    <xsl:param name="percent"/>
    <xsl:param name="r"/>
    <xsl:variable name="c" select="2*3.1415926*$r"/>
    <xsl:variable name="pct" select="((100-number($percent)) div 100)*number($c)"/>
    <svg id="svg" width="200" height="200" viewport="0 0 100 100" version="1.1" xmlns="http://www.w3.org/2000/svg">
        <circle r="{$r}" cx="100" cy="100" fill="none" stroke="#666" stroke-width="1em" stroke-dasharray="565.48" stroke-dashoffset="0"></circle>
        <circle id="bar" r="{$r}" cx="100" fill="none"  cy="100" stroke="#FF9F1E;" stroke-width="1em" stroke-dasharray="565.48" style="stroke-dashoffset: {$pct}px;"></circle>
    </svg>
</xsl:template>

您将其作为 PDF 输出:

您可以在 SVG 中添加文本(百分比),根据需要更改笔画的颜色、大小和方向/起点。

【讨论】:

  • 感谢您的回答,真的很有帮助。我认为这个等式对我不起作用。即使我指定百分比,它也会显示为 100%(我在黄色代码中发现了一个呼叫错字,但这不是主要问题)
  • 它对您不起作用,因为我的示例使用 style="" 属性。它是用 RenderX 格式化的。您可能正在使用不支持它的 FOP,并且您将 stroke-dashoffset 作为直接属性。你至少应该支持我给你的 99% 的答案,因为你的答案几乎是我的副本。
  • Kevin,我在看到你的答案的那一刻就对你的答案投了赞成票,但系统显示 15 岁以下的人的投票会被记录下来,但不会公开显示。就像我在回答中所说的那样,如果没有您的代码,我将无法做到这一点。
【解决方案2】:

如果您使用的是 AH Formatter,那么您可以使用linear-gradient()。见https://www.antennahouse.com/product/ahf64/ahf-ext.html#linear-gradient。否则,您可以在 fo:instream-foreign-object 中生成您想要的 SVG。

【讨论】:

    猜你喜欢
    • 2020-01-12
    • 2014-04-23
    • 1970-01-01
    • 1970-01-01
    • 2021-11-16
    • 1970-01-01
    • 2021-01-02
    • 2017-06-19
    • 2019-07-24
    相关资源
    最近更新 更多