Enumerates the elements of the specified SVG document in a sorted manner.
#include "l_bitmap.h"
L_LTSVG_API L_INT L_SvgSortElements(flatDocHandle, options, callback, userData)
The SVG document handle for which the elements should be sorted.
Pointer to a structure containing the options to use. Can be NULL.
Callback to receive the sorted elements. Cannot be NULL.
L_SvgSortElements calls this callback function for each element in the SVG document. The callback function must adhere to the function prototype described in L_SvgSortElementsCallback Function.
Void pointer that you can use to pass one or more additional parameters that the callback function needs.
To use this feature, assign a value to a variable or create a structure that contains as many fields as you need. Then, in this parameter, pass the address of the variable or structure, casting it to L_VOID *. The callback function, which receives the address in its own pUserData parameter, can cast it to a pointer of the appropriate data type to access your variable or structure. If the additional parameters are not needed, you can pass NULL in this parameter.
Value | Meaning |
---|---|
SUCCESS | The function was successful. |
< 1 | An error occurred. Refer to Return Codes. |
Support for SVG is only available in the Document and Medical Imaging toolkits.
For more information on flat SVG documents and bounds and resolution, refer to SVG Size, Bounds and Flat.
Use this function to enumerate the elements of the specified SVG document in a controlled sorted manner.
This function will throw an exception if this document is not flat or if it does not have valid physical (pixel) bounds.
If the value of options is NULL, then default options will be used as follows:
Member | Value |
---|---|
SortFlags | L_SvgSortFlags_Default |
ExtractText | L_SvgExtractText_Character |
The value of L_SvgSortOptions.ExtractText controls how the engine parses the text of the document as follows:
Value | Meaning |
---|---|
L_SvgExtractText_Character | Default. Extract the text one character at a time. |
L_SvgExtractText_Word | Extract the text one word at a time. |
L_SvgExtractText_Line | Extract the text one line at a time. |
Win32, x64.
This example will load pages from a DOC as SVG print out all the strings found.
// SVG sort callback function
L_INT EXT_FUNCTION SvgSortElementsCallback(const L_SvgNodeHandle flatDocHandle, const L_SvgElementInfo* info, L_VOID* userData)
{
UNREFERENCED_PARAMETER(flatDocHandle);
UNREFERENCED_PARAMETER(userData);
// Is it text?
if (info->Type == L_SvgElementType_Text)
{
// Yes, print it to the console
L_TCHAR msg[2048] = {0};
wsprintf(msg, L_TEXT("%s "), info->TextData.Text);
wprintf(msg);
// See if its end of line
int len = _tcslen(info->TextData.Text);
if ((info->TextData.CharacterFlags[len - 1] & L_SvgTextCharacterFlags_EndOfLine) == L_SvgTextCharacterFlags_EndOfLine)
wprintf(L_TEXT("\n"));
}
return SUCCESS;
};
L_INT SvgSortElementsExample(L_VOID)
{
L_INT nRet = SUCCESS;
L_TCHAR srcFileName[L_MAXPATH] = MAKE_IMAGE_PATH(TEXT("Leadtools.doc"));
// get the number of pages
FILEINFO fileInfo = {0};
fileInfo.uStructSize = sizeof(FILEINFO);
nRet = L_FileInfo(srcFileName, &fileInfo, sizeof(FILEINFO), FILEINFO_TOTALPAGES, NULL);
if(nRet == SUCCESS)
{
L_INT pageCount = fileInfo.TotalPages;
for(L_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
LOADSVGOPTIONS loadSvgOptions = {0};
loadSvgOptions.uStructSize = sizeof(LOADSVGOPTIONS);
loadSvgOptions.uFlags = L_LOADSVGOPTIONS_NONE;
LOADFILEOPTION loadOptions = {0};
loadOptions.uStructSize = sizeof(LOADFILEOPTION);
loadOptions.PageNumber = pageNumber;
nRet = L_LoadSvg(srcFileName, &loadSvgOptions, &loadOptions);
if(nRet == SUCCESS)
{
L_SvgNodeHandle docHandle = loadSvgOptions.SvgHandle;
L_SvgNodeHandle flatDocHandle = NULL;
// Sort requires a flat document, so check for that
L_BOOL isFlat = TRUE;
L_INT nRet = L_SvgIsFlatDocument(docHandle, &isFlat);
if (!isFlat)
L_SvgFlatDocument(docHandle, &flatDocHandle, NULL);
else
flatDocHandle = docHandle;
// If the document does not have a valid bounds, calculate it now automatically
L_SvgBounds bounds;
L_SvgGetBounds(flatDocHandle, &bounds, sizeof(L_SvgBounds));
if (!bounds.IsValid)
L_SvgCalculateBounds(flatDocHandle, FALSE);
L_SvgSortOptions sortOptions = {0};
sortOptions.StructSize = sizeof(L_SvgSortOptions);
sortOptions.ExtractText = L_SvgExtractText_Word;
sortOptions.SortFlags = L_SvgSortFlags_Default;
L_TCHAR msg[1024] = {0};
wsprintf(msg, L_TEXT("Text for page %d\n"), pageNumber);
wprintf(msg);
wprintf(L_TEXT("******************************************************************\n"));
nRet = L_SvgSortElements(flatDocHandle, &sortOptions, SvgSortElementsCallback, NULL);
wprintf(L_TEXT("******************************************************************\n"));
if(!isFlat)
L_SvgFreeNode(flatDocHandle);
L_SvgFreeNode(docHandle);
}
}
}
return nRet;
}