2016-02-05 68 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会诀窍。谢谢 –