本文介绍了XSL-FO SVG格式支持-.Net的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我需要在c#.Net的XSL fo中渲染svg,可在 https://fonet.codeplex中获得. com/.我试图在xsl-fo中使用svg,但它不会呈现任何pdf,并且会自动失败.

I need to render svg in my XSL fo in c#.Net which is available in https://fonet.codeplex.com/. I tried to use svg in the xsl-fo but it does not render any pdf and fails silently.

如果有人找到了解决此问题的方法,请提供帮助.

If anybody has found a solution for this issue please help.

我需要pdf报告来支持svg内容.

I need my pdf report to support svg contents.

推荐答案

使用以下代码在svg扩展名的情况下添加图像处理程序

Use the below code to add Hander of an image incase of svg extensions

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

添加SvgImageHandler处理程序

Add the SvgImageHandler Hander

 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有效或通过false则返回正确的图像,以便可以呈现无图像".保持代码更健壮.

Return proper image if the url is valid or pass false so the No Image can be rendered. keeping the code more robust.

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

这篇关于XSL-FO SVG格式支持-.Net的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!

08-15 06:57