2010-02-26 307 views
6

Câu hỏi đầu tiên từ tôi; Tôi hiện đang sửa một dịch vụ vẽ đồ thị sử dụng XSLFO để chuyển đổi cú pháp của chúng tôi thành FO và chuyển đổi nó sang PDF cuối cùng.Hiển thị SVG bằng XSLFO

Trước đây chúng tôi đã sử dụng đồ thị PNG từ web trong xuất PDF, nhưng điều này tạo ra kết quả thực sự xấu xí, vì vậy chúng tôi đã quyết định đi với SVG cho PDF để thay thế.

Tuy nhiên, SVG dường như không mở rộng quy mô vào khung SVG đúng cách.

Đây là cú pháp trước khi chạy vào XSLFO:

<img src="someimage.svg"> 

Và đây là XSLFO Tôi đang sử dụng:

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

Các SVG không xuất hiện trong PDF, và nó dường như chứa trong canvas - nhưng vì bất kỳ lý do gì tôi không thể làm cho nó mở rộng đúng cách. Nó thực sự rất lớn, và kết quả là một phiên bản cực kỳ cắt của SVG.

Tôi đang hết đề xuất ở đây - có ai ở đây có trải nghiệm với điều này không?

PS: Hình ảnh được tạo bằng phiên bản Batik mới nhất và chiều rộng và chiều cao được đặt chính xác.

Trả lời

3

Thực ra, đối tượng trong nước-gián tiếp dường như không thể mở rộng SVG ở tất cả, ngay cả với bộ canvas thích hợp. Bằng cách đặt vải đúng trên SVG, fo: bên ngoài đồ họa đã làm các trick ;-)

Cảm ơn các bạn đã cho tôi lời khuyên của bạn :-) Dưới đây là những gì làm việc:

<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

Nó lớn vì đối tượng fo: instream-foreign có chiều rộng và chiều cao lớn; nếu bạn là người mới bắt đầu trong XSL-FO, bạn nên thử số Ecrion Designer - bạn có thể chỉnh sửa trực quan và thay đổi kích thước XSLFO bằng chuột. Chúc mừng!

Các vấn đề liên quan