2016-02-05 29 views
3

我需要在我的XSL fo中的c#.Net中呈現svg,這在https://fonet.codeplex.com/中可用。我試圖在xsl-fo中使用svg,但它沒有渲染任何pdf並且默默地失敗。XSL-FO SVG格式支持 - .Net

如果有人發現此問題的解決方案,請幫助。

我需要我的pdf報告來支持svg內容。

+3

FO.NET FAQ中的第一個條目https://fonet.codeplex.com/wikipage?title=FAQ指出它不支持SVG。當然,還有其他支持SVG的C#接口的XSL-FO格式化器,比如AH格式化器。 –

+0

下面的答案是在xsl-fo中渲染svg的技巧,你應該看看它。 –

回答

3

使用下面的代碼到櫃面SVG擴展添加圖像的投手

FonetDriver fonetDriver = FonetDriver.Make(); 
fonetDriver.ImageHandler = SvgImageHandler; 

添加SvgImageHandler投手

private static byte[] SvgImageHandler(string svgContent) 
     { 
      if (svgContent.Contains("http://www.w3.org/2000/svg")) 
      { 
       var svgByteAry = Encoding.UTF8.GetBytes(svgContent); 
       using (var stream = new MemoryStream(svgByteAry)) 
       { 
        var svgDocument = SvgDocument.Open<SvgDocument>(stream); 
        using (var memoryStream = new MemoryStream()) 
        { 
         svgDocument.Draw() 
            .Save(memoryStream, ImageFormat.Png); 
         var byteArray = memoryStream.ToArray(); 
         return byteArray; 
        } 
       } 
      } 
      //Skip if not url based image 
      if (!Uri.IsWellFormedUriString(svgContent, UriKind.RelativeOrAbsolute)) 
       return null; 

      if (!ValidateUrlImage(svgContent)) 
      { 
       ICacheService cacheService = new HttpCache(); 
       return cacheService.Get(Constants.NoImage, 
             () => 
             { 
              var baseDirectory = AppDomain.CurrentDomain.BaseDirectory + ConfigurationManager.AppSettings[Constants.ImagePath]; 
              var defaultUrl = Path.Combine(baseDirectory, Constants.NoImageFile); 
              var img = Image.FromFile(defaultUrl); 
              var imgCon = new ImageConverter(); 
              return (byte[])imgCon.ConvertTo(img, typeof(byte[])); 
             }); 
      } 
      return null; 
     } 

返回正確的圖像,如果URL是有效的或通過虛假所以沒有圖像可以被渲染。保持代碼更健壯。

private static bool ValidateUrlImage(string absoluteUrl) 
     { 
      Uri uri; 
      if (!Uri.TryCreate(absoluteUrl, UriKind.Absolute, out uri)) 
      { 
       return true; 
      } 
      using (var client = new WebClient()) 
      { 
       try 
       { 
        using (var stream = client.OpenRead(uri)) 
        { 
         Image.FromStream(stream); 
         return true; 
        } 
       } 
       catch (Exception) 
       { 
        return false; 
       } 
      } 
     } 
+0

添加SvgImageHandler會訣竅。謝謝 –