←Select platform

EnumerateElements Method

Summary

Enumerates the elements (nodes) of this SvgDocument with the specified options.

Syntax
C#
VB
Objective-C
C++
Java
public void EnumerateElements( 
   SvgEnumerateOptions options, 
   SvgEnumerateElementsCallback callback, 
   object userData 
) 
Public Sub EnumerateElements( _ 
   ByVal options As SvgEnumerateOptions, _ 
   ByVal callback As SvgEnumerateElementsCallback, _ 
   ByVal userData As Object _ 
)  
- (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 
)  

Parameters

options
Options to use. Can be null.

callback
Callback to receive the elements (nodes). Cannot be null.

userData
Optional user data that will be passed to the callback.

Remarks

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

SvgEnumerateDirection.TopToBottom

Example

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.

C#
VB
using Leadtools; 
using Leadtools.Codecs; 
using Leadtools.Drawing; 
using Leadtools.Forms.DocumentWriters; 
using Leadtools.Svg; 
using LeadtoolsExamples.Common; 
 
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); 
      } 
   } 
} 
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 

Requirements

Target Platforms

Help Version 20.0.2020.3.31
Products | Support | Contact Us | Intellectual Property Notices
© 1991-2020 LEAD Technologies, Inc. All Rights Reserved.

Leadtools.Svg Assembly