public class SvgNodeHandle
SvgNodeHandle is obtained with the following:
The SvgNodeHandle has the following members for updating the XML elements of an SVG document:
ElementType: The element type, for example, ElementType.Svg for the top level <svg> element in the document or ElementType.Image for an
Bounds: The bounding rectangle of the element. This value is in SVG coordinates that matches SvgDocument.Bounds.
GetElementName: Gets the name of the element. This is the XML element name. For example, "svg" for the top level
GetElementValue and SetElementValue: Gets or sets the XML value as a raw string.
GetAttributeValue and SetAttributeValue: Gets or sets the value of any attribute in element as a raw string. RemoveElementAttribute: To remove the specified attribute from the element.
After modifying the values of an SVG document using SvgNodeHandle, it may be necessary to re-calculate the document flat, render optimization and bounding rectangles (refer to SVG Size, Bounds and Flat more information). Therefore, it is best to call SvgDocument.BeginUpdate before making any updates to the document and call SvgDocument.EndUpdate when done. The engine will determine during SvgDocument.EndUpdate whether any internal state values need to be re-calculated and updated as necessary.
using Leadtools;
using Leadtools.Codecs;
using Leadtools.Drawing;
using Leadtools.Forms.DocumentWriters;
using Leadtools.Svg;
using Leadtools.Document.Writer;
private static void SvgDocumentEnumerateElementsExample()
{
// The source PDF file
var sourceFile = $@"{LEAD_VARS.ImagesDir}\Leadtools.pdf";
var beforeSvgFile = $@"{LEAD_VARS.ImagesDir}\Leadtools_before.svg";
var afterSvgFile = $@"{LEAD_VARS.ImagesDir}\Leadtools_after.svg";
// Assume this is our Virtual Directory
var virtualDirectory = "http://localhost/leadtools_images/svg/resources";
// Assume this phrysical directory maps to the Virtual Directory
var physicalDirectory = $@"{LEAD_VARS.ImagesDir}\svg\resources";
if (!Directory.Exists(physicalDirectory))
Directory.CreateDirectory(physicalDirectory);
// Our SVG element enumartion callback
SvgEnumerateElementsCallback callback = (SvgDocument document, SvgNodeHandle node, object userData) =>
{
if (node.ElementType == SvgElementType.Image)
{
// Get the href
var href = node.GetAttributeValue("xlink:href");
if (!string.IsNullOrEmpty(href))
{
// Parse it as data URI
var dataUri = SvgDataUri.Parse(href);
// Check if it is a data URI
if (dataUri.IsDataUri)
{
// Yes, create a new file in a virtual directory
// Show the dataURI properties
Console.WriteLine("Replacing data URI");
Console.WriteLine("Format:" + dataUri.ImageFormat);
if (dataUri.MediaLength > 0)
Console.WriteLine("Media:" + dataUri.Href.Substring(dataUri.MediaOffset, dataUri.MediaLength));
if (dataUri.CharSetOffset > 0)
Console.WriteLine("CharSet:" + dataUri.Href.Substring(dataUri.CharSetOffset, dataUri.CharSetLength));
else
Console.WriteLine("CharSet: not set");
Console.WriteLine("IsBase64:" + dataUri.IsBase64);
Console.WriteLine("ImageFormat:" + dataUri.ImageFormat);
var extension = dataUri.Extension;
Console.WriteLine("Extension:" + dataUri.Extension);
// Get a file name
var name = Guid.NewGuid().ToString().Replace("-", "") + "." + dataUri.Extension;
// Save it
// Full physical path
var filePath = Path.Combine(physicalDirectory, name);
dataUri.DecodeToFile(filePath);
/* Alternatively you can save the data yourself using this code
var data = dataUri.Href.Substring(dataUri.ValueOffset, dataUri.ValueLength);
// Save the data
var base64String = dataUri.Href.Substring(dataUri.ValueOffset, dataUri.ValueLength);
byte[] rawData = Convert.FromBase64String(base64String);
// Save it to disk
File.WriteAllBytes(filePath, rawData);
*/
// Finally replace the attribute in the image element with the URI
var virtualPath = virtualDirectory + "/" + name;
node.SetAttributeValue("xlink:href", virtualPath);
}
else
{
Console.WriteLine("Does not contain a valid data URI.");
}
}
}
return true;
};
using (var rasterCodecs = new RasterCodecs())
{
// Use 300 DPI when loading document images
rasterCodecs.Options.RasterizeDocument.Load.Resolution = 300;
// Load the first page as SVG
using (var svg = rasterCodecs.LoadSvg(sourceFile, 1, null) as SvgDocument)
{
if (!svg.IsFlat)
svg.Flat(null);
if (!svg.Bounds.IsValid)
svg.CalculateBounds(false);
// Save this SVG to disk, report the size
svg.SaveToFile(beforeSvgFile, null);
Console.WriteLine("Before unembedding the image, size is " + new FileInfo(beforeSvgFile).Length);
// Now enumerate the elements to replace each embedded image with a URL
// Since we are going to modify the SVG, call BeginUpdate/EndUpdate to speed up the process
svg.BeginUpdate();
svg.EnumerateElements(new SvgEnumerateOptions { EnumerateDirection = SvgEnumerateDirection.TopToBottom }, callback, null);
svg.EndUpdate();
// Save this SVG to disk again, report the size, should be alot smaller since the image are unembedded and stored as external resources
svg.SaveToFile(afterSvgFile, null);
Console.WriteLine("Before unembedding the image, size is " + new FileInfo(afterSvgFile).Length);
}
}
}
static class LEAD_VARS
{
public const string ImagesDir = @"C:\LEADTOOLS23\Resources\Images";
}