Error processing SSI file
LEADTOOLS Svg (Leadtools.Svg assembly)

Show in webframe

EnumerateElements Method






Options to use. Can be null.
Callback to receive the elements (nodes). Cannot be null.
Optional user data that will be passed to the callback.
Enumerates the elements (nodes) of this SvgDocument with the specified options.
Syntax
'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)

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.

Copy Code  
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);
      }
   }
}
Requirements

Target Platforms

See Also

Reference

SvgDocument Class
SvgDocument Members

Error processing SSI file
  Leadtools.Svg requires a Document or Medical toolkit license and unlock key. For more information, refer to: LEADTOOLS Toolkit Features