2010-02-26 32 views
6

Erste Frage von mir; Ich repariere gerade einen graphischen Dienst, der XSLFO verwendet, um unsere Syntax in FO zu konvertieren und am Ende in PDF zu konvertieren.SVG mit XSLFO anzeigen

Früher haben wir PNG-Graphen aus dem Internet in den PDF-Exporten verwendet, aber das erzeugt wirklich hässliche Ergebnisse, also haben wir uns entschieden, stattdessen SVG für PDF zu verwenden.

Das SVG scheint jedoch nicht ordnungsgemäß in die SVG-Zeichenfläche zu skalieren.

Hier ist die Syntax, bevor sie in XSLFO laufen:

<img src="someimage.svg"> 

Und hier ist die XSLFO Ich verwende:

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

Die SVG im PDF angezeigt wird, und es ist enthalten scheinen innerhalb der Leinwand - aber aus welchem ​​Grund auch immer, ich kann es nicht richtig skalieren. Es ist einfach sehr, sehr groß und das Ergebnis ist eine extrem kurze Version des SVG.

Ich habe keine Vorschläge mehr - gibt es hier jemanden, der Erfahrung damit hat?

PS: Das Bild wird mit der neuesten Version von Batik erstellt, und die Breite und Höhe ist richtig eingestellt.

Antwort

3

Eigentlich schien Instream-Fremd-Objekt überhaupt nicht in der Lage zu sein, das SVG zu skalieren, nicht einmal mit dem richtigen Zeichensatz. Durch die Einstellung der richtigen Leinwand auf der SVG, fo: external-Grafik hat den Trick ;-)

Danke euch für die mir Ihre Tipps :-) Hier ist, was funktioniert hat:

<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 ist groß, weil das fo: instream-Fremdobjekt eine große Breite und Höhe hat; Wenn Sie ein Anfänger in XSL-FO sind, sollten Sie die Ecrion Designer ausprobieren - Sie können XSLFO visuell bearbeiten und die Größe mit der Maus ändern. Prost!