2010-02-26 10 views
6

Première question de ma part; Je corrige actuellement un service graphique qui utilise XSLFO pour convertir notre syntaxe en FO, et la convertir en PDF à la fin.Affichage de SVG en utilisant XSLFO

Auparavant, nous utilisions des graphiques PNG du Web dans les exportations PDF, mais cela crée des résultats vraiment laids, nous avons donc décidé d'aller avec SVG pour PDF à la place. Cependant, le SVG ne semble pas évoluer correctement dans le canevas SVG.

Voici la syntaxe avant courir dans XSLFO:

<img src="someimage.svg"> 

Et voici le XSLFO J'utilise:

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

Le SVG apparaît dans le PDF, et il ne semble contenu dans la toile - mais pour une raison quelconque, je ne peux pas l'adapter correctement. C'est juste vraiment, vraiment énorme, et le résultat est une version extrêmement recadrée du SVG.

Je suis à court de suggestions ici - y at-il quelqu'un ici qui a de l'expérience avec cela? PS: L'image est créée à l'aide de la dernière version de Batik, et la largeur et la hauteur sont définies correctement.

Répondre

3

En fait, instream-foreign-object ne semblait pas capable de mettre à l'échelle le SVG, même avec le jeu de canvas approprié. En réglant la toile correcte sur le SVG, fo: external-graphique a fait l'affaire ;-)

Merci les gars pour me donner des conseils :-) vos Voici ce qui a fonctionné:

<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

Il est grand car fo: instream-foreign-object a une largeur et une hauteur importantes; Si vous êtes un débutant dans XSL-FO, vous devriez essayer le Ecrion Designer - vous pouvez éditer XSLFO visuellement et redimensionner en utilisant la souris. À la votre!