2010-02-26 9 views
6

Первый вопрос от меня; В настоящее время я исправляю графический сервис, который использует XSLFO для преобразования нашего синтаксиса в FO и преобразования его в PDF в конце.Отображение SVG с использованием XSLFO

Раньше мы использовали графики PNG из Интернета в экспорте PDF, но это создает действительно уродливые результаты, поэтому мы решили использовать SVG для PDF вместо этого.

Однако SVG, кажется, не масштабируется в холст SVG должным образом.

Вот синтаксис, прежде чем запустить в XSLFO:

<img src="someimage.svg"> 

А вот 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> 

SVG действительно появляется в PDF, и он содержал, кажется внутри холста - но по какой-то причине я не могу правильно его масштабировать. Это просто реально, действительно огромно, и результат - чрезвычайно обрезанная версия SVG.

У меня заканчиваются предложения здесь - есть ли здесь кто-нибудь, у кого есть опыт?

PS: Изображение создается с использованием новейшей версии Batik, а ширина и высота установлены правильно.

ответ

3

На самом деле, instream-foreign-object, похоже, не может масштабировать SVG вообще, даже с соответствующим набором холста. Установив правильный холст на SVG, ВОК: внешняя-графический сделал трюк ;-)

Спасибо вам, ребята, за предоставленную мне свои советы :-) Вот что работал:

<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

Это большой, потому что fo: instream-foreign-object имеет большую ширину и высоту; если вы новичок в XSL-FO, вы должны попробовать Ecrion Designer - вы можете редактировать визуализацию XSLFO и изменять размер с помощью мыши. Приветствия!