使用XSLFO显示SVG

hni*_*sen 7 java xslt svg pdf-generation xsl-fo

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

以前我们一直在使用PDF导出中的网络PNG图表,但这会产生非常难看的结果,因此我们决定使用SVG替代PDF.

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

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

<img src="someimage.svg">
Run Code Online (Sandbox Code Playgroud)

这是我正在使用的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>
Run Code Online (Sandbox Code Playgroud)

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

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

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

hni*_*sen 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>
Run Code Online (Sandbox Code Playgroud)