![]() |
Products | Support | Email a link to this topic. | Send comments on this topic. | Back to Introduction - All Topics | Help Version 19.0.6.22
|
Leadtools.Svg Assembly > Leadtools.Svg Namespace > SvgDocument Class : EnumerateElements Method |
public void EnumerateElements( SvgEnumerateOptions options, SvgEnumerateElementsCallback callback, object userData )
'Declaration
Public Sub EnumerateElements( _ ByVal options As SvgEnumerateOptions, _ ByVal callback As SvgEnumerateElementsCallback, _ ByVal userData As Object _ )
'Usage
Dim instance As SvgDocument Dim options As SvgEnumerateOptions Dim callback As SvgEnumerateElementsCallback Dim userData As Object instance.EnumerateElements(options, callback, userData)
- (BOOL)enumerateElementsWithOptions:(nullable LTSvgEnumerateOptions *)options userData:(nullable id)userData callback:(BOOL (^)(LTSvgDocument *document, LTSvgNodeHandle *node, id _Nullable userData))callback error:(NSError **)error
public void enumerateElements(SvgEnumerateOptions options, SvgEnumerateElementsCallback callback, Object userData)
public: void EnumerateElements( SvgEnumerateOptions^ options, SvgEnumerateElementsCallback^ callback, Object^ userData )
Use this method to enumerate the elements of this SvgDocument using the specified options.
This method will throw an exception if this document is not flat (the value of IsFlat is false) or if it does not have valid physical (pixel) bounds (the value of Bounds.IsValid is false).
If the value of options is null, then the following default options will be used:
Member | Value |
---|---|
SvgEnumerateOptions.EnumerateDirection |
This example will use EnumerateElements to extract the embedded images from an SVG file and save them to disk and replace each with a link to the file.
Imports Leadtools Imports Leadtools.Codecs Imports Leadtools.Drawing Imports Leadtools.Forms.DocumentWriters Imports Leadtools.Svg Private Shared Sub SvgDocumentEnumerateElementsExample() ' The source PDF file Dim sourceFile As String = "C:\Users\Public\Documents\LEADTOOLS Images\Leadtools.pdf" Dim beforeSvgFile As String = "C:\Users\Public\Documents\LEADTOOLS Images\Leadtools_before.svg" Dim afterSvgFile As String = "C:\Users\Public\Documents\LEADTOOLS Images\Leadtools_after.svg" ' Assume this is our Virtual Directory Dim virtualDirectory As String = "http://localhost/leadtools_images/svg/resources" ' Assume this phrysical directory maps to the Virtual Directory Dim physicalDirectory As String = "C:\Users\Public\Documents\LEADTOOLS Images\svg\resources" If Not Directory.Exists(physicalDirectory) Then Directory.CreateDirectory(physicalDirectory) ' Our SVG element enumartion callback Dim callback As SvgEnumerateElementsCallback = _ Function(document As SvgDocument, node As SvgNodeHandle, userData As Object) As Boolean If node.ElementType = SvgElementType.Image Then ' Get the href Dim href As String = node.GetAttributeValue("xlink:href") If Not String.IsNullOrEmpty(href) Then ' Parse it as data URI Dim dataUri As SvgDataUri = SvgDataUri.Parse(href) ' Check if it is a data URI If dataUri.IsDataUri Then ' Yes, create a new file in a virtual directory ' Show the dataURI properties Console.WriteLine("Replacing data URI") Console.WriteLine("Format:" + dataUri.ImageFormat.ToString()) If dataUri.MediaLength > 0 Then Console.WriteLine("Media:" + dataUri.Href.Substring(dataUri.MediaOffset, dataUri.MediaLength)) If dataUri.CharSetOffset > 0 Then Console.WriteLine("CharSet:" + dataUri.Href.Substring(dataUri.CharSetOffset, dataUri.CharSetLength)) Else Console.WriteLine("CharSet: not set") End If Console.WriteLine("IsBase64:" + dataUri.IsBase64.ToString()) Console.WriteLine("ImageFormat:" + dataUri.ImageFormat.ToString()) Dim extension As String = dataUri.Extension Console.WriteLine("Extension:" + dataUri.Extension) ' Get a file name Dim name As String = Guid.NewGuid().ToString().Replace("-", "") + "." + dataUri.Extension ' Save it ' Full physical path Dim filePath As String = Path.Combine(physicalDirectory, name) dataUri.DecodeToFile(filePath) ' Alternatively you can save the data yourself using this code ' Dim data As String = dataUri.Href.Substring(dataUri.ValueOffset, dataUri.ValueLength) ' ' Save the data ' Dim base64String As String = dataUri.Href.Substring(dataUri.ValueOffset, dataUri.ValueLength) ' Dim rowData() As Byte = Convert.FromBase64String(base64String) ' ' ' Save it to disk ' File.WriteAllBytes(filePath, rawData) ' Finally replace the attribute in the image element with the URI Dim virtualPath As String = virtualDirectory + "/" + name node.SetAttributeValue("xlink:href", virtualPath) Else Console.WriteLine("Does not contain a valid data URI.") End If End If End If Return True End Function Using rasterCodecs As New RasterCodecs() ' Use 300 DPI when loading document images rasterCodecs.Options.RasterizeDocument.Load.Resolution = 300 ' Load the first page as SVG Using svg As SvgDocument = CType(rasterCodecs.LoadSvg(sourceFile, 1, Nothing), SvgDocument) If Not svg.IsFlat Then svg.Flat(Nothing) If Not svg.Bounds.IsValid Then svg.CalculateBounds(False) ' Save this SVG to disk, report the size svg.SaveToFile(beforeSvgFile, Nothing) Console.WriteLine("Before unembedding the image, size is " + New FileInfo(beforeSvgFile).Length.ToString()) ' 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() Dim enumerationOptions As New SvgEnumerateOptions enumerationOptions.EnumerateDirection = SvgEnumerateDirection.TopToBottom svg.EnumerateElements(enumerationOptions, callback, Nothing) 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, Nothing) Console.WriteLine("Before unembedding the image, size is " + New FileInfo(afterSvgFile).Length.ToString()) End Using End Using End Sub
using Leadtools; using Leadtools.Codecs; using Leadtools.Drawing; using Leadtools.Forms.DocumentWriters; using Leadtools.Svg; private static void SvgDocumentEnumerateElementsExample() { // The source PDF file var sourceFile = @"C:\Users\Public\Documents\LEADTOOLS Images\Leadtools.pdf"; var beforeSvgFile = @"C:\Users\Public\Documents\LEADTOOLS Images\Leadtools_before.svg"; var afterSvgFile = @"C:\Users\Public\Documents\LEADTOOLS Images\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 = @"C:\Users\Public\Documents\LEADTOOLS Images\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); } } }