Отображение SVG с использованием XSLFO - PullRequest
7 голосов
/ 26 февраля 2010

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

Раньше мы использовали 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: изображение создано с использованием новейшей версии батика, а ширина и высота установлены правильно.

Ответы [ 2 ]

3 голосов
/ 03 марта 2010

На самом деле, instream-foreign-object вообще не в состоянии масштабировать SVG, даже с правильным набором холстов. Установив правильный холст в SVG, fo: external-graphic добились цели; -)

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

    <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 голосов
/ 27 февраля 2010

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

...