XSL-FO SVG格式支持 - .Net

3
我需要在c#.Net中的XSL fo中呈现svg,这可以在https://fonet.codeplex.com/上找到。我尝试在xsl-fo中使用svg,但它不会呈现任何pdf并且静默失败。
如果有人已经找到了解决此问题的方法,请帮忙一下。
我需要我的pdf报告支持svg内容。

3
在https://fonet.codeplex.com/wikipage?title=FAQ的FO.NET FAQ中,第一个条目说明它不支持SVG。当然,还有其他具有C#接口并支持SVG的XSL-FO格式化程序,比如AH Formatter。 - Tony Graham
下面的答案可以解决在XSL-FO中呈现SVG的问题,你应该查阅它。 - Karthikeyan VK
@KarthikeyanVK,请问您能提供更多信息吗?在这个例子中,您使用了哪个DLL库?我猜测是这个:archive.codeplex.com/?p=svg。此外,在您的示例中,有一些对象,例如Constants.*、ICacheService、HttpCache、Path.Combine,我不知道它们属于哪个程序集。您能指出它们属于哪个程序集吗? - Willy
明天我会发送给你精简过的代码。 - Karthikeyan VK
@KarthikeyanVK 好的,非常感谢。我会非常感激你的帮助。我需要在.NET Framework 3.5中进行开发。我的应用程序不是Web应用程序,而是使用C#编写的Windows窗体应用程序。提前致谢。 - Willy
1个回答

4

使用以下代码在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有效,则返回正确的图像,否则传递false,以便可以呈现“无图像”。保持代码更加健壮。

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

请问,可以提供更多信息吗?您在这个示例中使用了哪个DLL库?我猜是这一个:https://archive.codeplex.com/?p=svg。此外,在您的示例中,有像Constants.*、ICacheService、HttpCache、Path.Combine等对象,我不知道它们属于哪个程序集。您能指出它们属于哪个程序集吗? - Willy

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接