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的技巧,你應該看看它。 –