3
我需要在我的XSL fo中的c#.Net中呈现svg,这在https://fonet.codeplex.com/中可用。我试图在xsl-fo中使用svg,但它没有渲染任何pdf并且默默地失败。XSL-FO SVG格式支持 - .Net
如果有人发现此问题的解决方案,请帮助。
我需要我的pdf报告来支持svg内容。
我需要在我的XSL fo中的c#.Net中呈现svg,这在https://fonet.codeplex.com/中可用。我试图在xsl-fo中使用svg,但它没有渲染任何pdf并且默默地失败。XSL-FO SVG格式支持 - .Net
如果有人发现此问题的解决方案,请帮助。
我需要我的pdf报告来支持svg内容。
使用下面的代码到柜面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;
}
}
}
添加SvgImageHandler会诀窍。谢谢 –
FO.NET FAQ中的第一个条目https://fonet.codeplex.com/wikipage?title=FAQ指出它不支持SVG。当然,还有其他支持SVG的C#接口的XSL-FO格式化器,比如AH格式化器。 –
下面的答案是在xsl-fo中渲染svg的技巧,你应该看看它。 –