使用XSLFO显示SVG

时间:2010-02-26 09:11:05

标签: java xslt pdf-generation svg xsl-fo

我的第一个问题;我目前正在修复使用XSLFO将我们的语法转换为FO并最终将其转换为PDF的图形服务。

以前我们一直在使用PDF导出的网页上的PNG图表,但这会产生非常难看的结果,所以我们决定改用SVG for PDF。

但是,SVG似乎没有正确扩展到SVG画布。

以下是运行XSLFO之前的语法:

<img src="someimage.svg">

这是我正在使用的XSLFO:

   <xsl:template match="img">
      <fo:block space-after="12pt">
          <fo:instream-foreign-object width="20cm" height="15cm" content-width="scale-to-fit" content-height="scale-to-fit" scaling="uniform" background-color="#cccccc">
          <svg:svg x="0" y="0" width="100" height="100" viewBox="0 0 100 100">
                <svg:image x="0" y="0" width="100" height="100">
                    <xsl:if test="@src">
                       <xsl:attribute name="xlink:href">
                          <xsl:choose>
                             <xsl:when test="starts-with(@src, 'http://')">
                                <xsl:value-of select="@src"/>
                             </xsl:when>
                             <xsl:when test="starts-with(@src, 'https://')">
                                <xsl:value-of select="@src"/>
                             </xsl:when>
                             <xsl:otherwise>
                                <xsl:value-of select="concat($baseurl, @src)"/>
                             </xsl:otherwise>
                          </xsl:choose>
                       </xsl:attribute>
                    </xsl:if>
                   </svg:image>
            </svg:svg>
         </fo:instream-foreign-object>
      </fo:block>
   </xsl:template>

SVG确实出现在PDF中,它似乎确实包含在画布中 - 但无论出于何种原因,我都无法正确地进行缩放。它真的非常非常庞大,结果是SVG的极度裁剪版本。

我在这里没有任何建议 - 这里有没有人有这方面的经验?

PS:使用最新版本的Batik创建图像,并正确设置宽度和高度。

2 个答案:

答案 0 :(得分:3)

实际上,instream-foreign-object似乎根本无法扩展SVG,甚至没有适当的画布集。通过在SVG上设置正确的画布,fo:external-graphic就可以了; - )

谢谢你们给我你的提示:-)这是有用的:

    <fo:external-graphic content-width="25cm" content-height="16cm">
        <xsl:if test="@src">
            <xsl:attribute name="src">
                <xsl:choose>
                    <xsl:when test="starts-with(@src, 'http://')">
                        <xsl:value-of select="concat('url(',@src,')')"/>
                    </xsl:when>
                    <xsl:when test="starts-with(@src, 'https://')">
                        <xsl:value-of select="concat('url(',@src,')')"/>
                    </xsl:when>
                    <xsl:otherwise>
                        <xsl:value-of select="concat('url(',$baseurl, @src,')') + ')'"/>
                    </xsl:otherwise>
                </xsl:choose>
            </xsl:attribute>
        </xsl:if>
    </fo:external-graphic>

答案 1 :(得分:2)

它很大,因为fo:instream-foreign-object具有较大的宽度和高度;如果您是XSL-FO的初学者,您应该尝试Ecrion Designer - 您可以直观地编辑XSLFO并使用鼠标调整大小。 干杯!