2010-02-26 58 views
6

Prima domanda da parte mia; Attualmente sto riparando un servizio di grafica che usa XSLFO per convertire la nostra sintassi in FO e alla fine convertendola in PDF.Visualizzazione di SVG utilizzando XSLFO

In precedenza abbiamo utilizzato i grafici PNG dal Web nelle esportazioni PDF, ma questo crea risultati davvero brutti, quindi abbiamo deciso di utilizzare SVG per PDF.

Tuttavia, l'SVG non sembra scalare correttamente nella tela SVG.

Ecco la sintassi prima di incorrere in XSLFO:

<img src="someimage.svg"> 

Ed ecco la XSLFO sto 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> 

Lo SVG non appare nel PDF, e lo fa sembrare contenute all'interno della tela - ma per qualsiasi motivo non riesco a farlo scalare correttamente. È davvero molto, davvero enorme, e il risultato è una versione estremamente ritagliata di SVG.

Sono a corto di suggerimenti qui - c'è qualcuno qui che ha esperienza con questo?

PS: l'immagine viene creata utilizzando la versione più recente di Batik e la larghezza e l'altezza sono impostate correttamente.

risposta

3

In realtà, l'oggetto straniero non sembrava in grado di scalare l'SVG, nemmeno con il set di tela corretto. Impostando la tela corretto sul SVG, fo: esterno-grafica ha fatto il trucco ;-)

Grazie ragazzi per avermi dato i tuoi suggerimenti :-) Ecco cosa ha funzionato:

<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

È grande perché fo: instream-foreign-object ha una larghezza e un'altezza grandi; se sei un principiante in XSL-FO dovresti provare lo Ecrion Designer - puoi modificare visivamente e ridimensionare XSLFO usando il mouse. Cheers!

Problemi correlati