2016-02-05 1 views
3

Мне нужно отобразить svg в моем XSL fo в C# .Net, который доступен в https://fonet.codeplex.com/. Я попытался использовать svg в xsl-fo, но он не отображает PDF и терпит неудачу.Поддержка формата SVG XSL-FO - .Net

Если кто-нибудь нашел решение по этой проблеме, пожалуйста, помогите.

Мне нужен мой отчет в формате pdf для поддержки содержимого svg.

+3

Первая запись в FAQ FO.NET на https://fonet.codeplex.com/wikipage?title=FAQ гласит, что она не поддерживает SVG. Конечно, есть другие форматы XSL-FO с интерфейсом C#, которые поддерживают SVG, например, AH Formatter. –

+0

Ниже ответ трюк для рендеринга svg в xsl-fo, вы должны изучить его. –

ответ

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 делает трюк. благодаря –

 Смежные вопросы

  • Нет связанных вопросов^_^