SortElements Method
Summary
Enumerates the elements of this SvgDocument in a sorted manner.
Syntax
C#
VB
Objective-C
C++
Java
- (BOOL)sortElementsWithOptions:(nullable LTSvgSortOptions *)options
userData:(nullable id)userData
callback:(BOOL (^)(LTSvgDocument *document, LTSvgElementInfo *info, id _Nullable userData))callback
error:(NSError **)error
Parameters
options
Options to use. Can be null.
callback
Callback to receive the sorted elements. Cannot be null.
userData
Optional user data that will be passed to the callback.
Example
This example will use SortElements to load a page from a PDF as SVG and then create a text file with the strings found.
using Leadtools;
using Leadtools.Codecs;
using Leadtools.Drawing;
using Leadtools.Forms.DocumentWriters;
using Leadtools.Svg;
using LeadtoolsExamples.Common;
public void SortElementsExample()
{
// The source PDF file
string srcFileName = Path.Combine(ImagesPath.Path, "Leadtools.pdf");
string dstFileName = Path.Combine(ImagesPath.Path, "Example.txt");
// SVG sort callback handler
SvgSortElementsCallback sortCallback = (callabackDocument, info, userData) =>
{
StreamWriter writer = userData as StreamWriter;
// Is it text?
SvgTextData textData = info.TextData;
if (textData != null)
{
// Yes, print it to the console
writer.Write(textData.Text + " ");
// See if its end of line
var len = textData.Text.Length;
if ((textData.CharacterFlags[len - 1] & SvgTextCharacterFlags.EndOfLine) == SvgTextCharacterFlags.EndOfLine)
writer.WriteLine();
}
return true;
};
using (var codecs = new RasterCodecs())
{
// Set 300 as the default value for loading document files
codecs.Options.RasterizeDocument.Load.Resolution = 300;
// get the number of pages
int pageCount = codecs.GetTotalPages(srcFileName);
// Create a writer for the output text file
using (StreamWriter writer = File.CreateText(dstFileName))
{
for (int pageNumber = 1; pageNumber <= pageCount; pageNumber++)
{
// Load this page as SVG, we are interested in the text only so
// we will ask LEADTOOLS to skip other elements
CodecsLoadSvgOptions loadSvgOptions = new CodecsLoadSvgOptions();
loadSvgOptions.DropShapes = false;
loadSvgOptions.DropImages = true;
loadSvgOptions.DropShapes = true;
using (SvgDocument svgDocument = codecs.LoadSvg(srcFileName, pageNumber, loadSvgOptions) as SvgDocument)
{
// Sort requires a flat document, so check for that
if (!svgDocument.IsFlat)
svgDocument.Flat(null);
if (!svgDocument.Bounds.IsValid)
svgDocument.CalculateBounds(false);
SvgSortOptions sortOptions = new SvgSortOptions();
sortOptions.ExtractText = SvgExtractText.Word;
sortOptions.SortFlags = SvgSortFlags.Default;
Console.WriteLine("Text for page {0}", pageNumber);
svgDocument.SortElements(sortOptions, sortCallback, writer);
}
}
// Show the text file
System.Diagnostics.Process.Start(dstFileName);
}
}
}
Imports Leadtools
Imports Leadtools.Codecs
Imports Leadtools.Drawing
Imports Leadtools.Forms.DocumentWriters
Imports Leadtools.Svg
Public Shared Sub SortElementsExample()
' The source PDF file
Dim srcFileName As String = Path.Combine(Common.ImagesPath.Path, "Leadtools.pdf")
Dim dstFileName As String = Path.Combine(Common.ImagesPath.Path, "Example.txt")
' SVG sort callback handler
Dim sortCallback As SvgSortElementsCallback =
Function(document As SvgDocument, info As SvgElementInfo, userData As Object) As Boolean
Dim writer As StreamWriter = DirectCast(userData, StreamWriter)
' Is it text?
Dim textData As SvgTextData = info.TextData
If Not IsNothing(textData) Then
' Yes, print it to the console
writer.Write(textData.Text + " ")
' See if its end of line
Dim len As Integer = textData.Text.Length
If (textData.CharacterFlags(len - 1) And SvgTextCharacterFlags.EndOfLine) = SvgTextCharacterFlags.EndOfLine Then
writer.WriteLine()
End If
End If
Return True
End Function
Using codecs As New RasterCodecs()
' Set 300 as the default value for loading document files
codecs.Options.RasterizeDocument.Load.Resolution = 300
' get the number of pages
Dim pageCount As Integer = codecs.GetTotalPages(srcFileName)
' Create a writer for the output text file
Using writer As StreamWriter = File.CreateText(dstFileName)
For pageNumber As Integer = 1 To pageCount
' Load this page as SVG, we are interested in the text only so
' we will ask LEADTOOLS to skip other elements
Dim loadSvgOptions As New CodecsLoadSvgOptions()
loadSvgOptions.DropText = False
loadSvgOptions.DropImages = True
loadSvgOptions.DropShapes = True
Using svgDocument As SvgDocument = DirectCast(codecs.LoadSvg(srcFileName, pageNumber, loadSvgOptions), SvgDocument)
' Sort requires a flat document, so check for that
If Not svgDocument.IsFlat Then
svgDocument.Flat(Nothing)
End If
If Not svgDocument.Bounds.IsValid Then
svgDocument.CalculateBounds(False)
End If
Dim sortOptions As New SvgSortOptions()
sortOptions.ExtractText = SvgExtractText.Word
sortOptions.SortFlags = SvgSortFlags.Default
Console.WriteLine("Text for page {0}", pageNumber)
svgDocument.SortElements(sortOptions, sortCallback, writer)
End Using
Next
' Show the text file
System.Diagnostics.Process.Start(dstFileName)
End Using
End Using
End Sub