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
)
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.
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.
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:\LEADTOOLS21\Resources\Images\Leadtools.pdf";
var beforeSvgFile = @"C:\LEADTOOLS21\Resources\Images\Leadtools_before.svg";
var afterSvgFile = @"C:\LEADTOOLS21\Resources\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:\LEADTOOLS21\Resources\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:\LEADTOOLS21\Resources\Images\Leadtools.pdf"
Dim beforeSvgFile As String = "C:\LEADTOOLS21\Resources\Images\Leadtools_before.svg"
Dim afterSvgFile As String = "C:\LEADTOOLS21\Resources\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:\LEADTOOLS21\Resources\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
Help Collections
Raster .NET | C API | C++ Class Library | HTML5 JavaScript
Document .NET | C API | C++ Class Library | HTML5 JavaScript
Medical .NET | C API | C++ Class Library | HTML5 JavaScript
Medical Web Viewer .NET
Multimedia
Direct Show .NET | C API | Filters
Media Foundation .NET | C API | Transforms
Supported Platforms
.NET, Java, Android, and iOS/macOS Assemblies
Imaging, Medical, and Document
C API/C++ Class Libraries
Imaging, Medical, and Document
HTML5 JavaScript Libraries
Imaging, Medical, and Document