2010-02-26 64 views
6

Primera pregunta mía; Actualmente estoy reparando un servicio de gráficos que usa XSLFO para convertir nuestra sintaxis a FO y convertirlo a PDF al final.Mostrando SVG usando XSLFO

Anteriormente hemos estado utilizando gráficos PNG de la web en las exportaciones de PDF, pero esto crea resultados realmente desagradables, por lo que hemos decidido ir con SVG para PDF en su lugar.

Sin embargo, el SVG no parece escalar correctamente en el lienzo SVG.

Ésta es la sintaxis antes de ejecutar en XSLFO:

<img src="someimage.svg"> 

y aquí está la XSLFO estoy usando:

<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> 

El SVG sí aparece en el PDF, y lo hace parecer contenían dentro del lienzo, pero por alguna razón no puedo hacer que escale correctamente. Es realmente, realmente enorme, y el resultado es una versión extremadamente corta del SVG.

Me estoy quedando sin sugerencias aquí - ¿hay alguien aquí que tenga experiencia con esto?

PD: La imagen se crea utilizando la versión más reciente de Batik, y el ancho y el alto se configuran correctamente.

Respuesta

3

En realidad, instream-foreign-object no parecía poder escalar el SVG en absoluto, ni siquiera con el lienzo adecuado. Al establecer el lienzo correcta en el SVG, fo: externa-gráfico resolvieron el problema ;-)

Gracias chicos por darme sus consejos :-) Aquí está lo que funcionó:

<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> 
2

Es grande porque fo: instream-foreign-object tiene un gran ancho y alto; si eres un principiante en XSL-FO deberías probar el Ecrion Designer - puedes editar XSLFO visualmente y cambiar el tamaño con el mouse. ¡Salud!