CharSetOffset Property
Summary
The offset into where the character set value starts in the href.
Syntax
C#
Objective-C
C++/CLI
Java
Python
public int CharSetOffset { get; set; }
@property (nonatomic, assign) NSUInteger charSetOffset;
public int getCharSetOffset()
public void setCharSetOffset(int value)
public:
property int CharSetOffset {
int get();
void set ( int );
}
Property Value
The character offset into where the character set value starts in Href if it contains a valid data URI; otherwise, -1 if Href does contain a valid data URI or if the optional value is missing.
Example
using Leadtools;
using Leadtools.Codecs;
using Leadtools.Drawing;
using Leadtools.Forms.DocumentWriters;
using Leadtools.Svg;
using Leadtools.Document.Writer;
private static void SvgDocumentEnumerateElementsExample()
{
// The source PDF file
var sourceFile = $@"{LEAD_VARS.ImagesDir}\Leadtools.pdf";
var beforeSvgFile = $@"{LEAD_VARS.ImagesDir}\Leadtools_before.svg";
var afterSvgFile = $@"{LEAD_VARS.ImagesDir}\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 = $@"{LEAD_VARS.ImagesDir}\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);
}
}
}
static class LEAD_VARS
{
public const string ImagesDir = @"C:\LEADTOOLS23\Resources\Images";
}
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.PrintStream;
import java.nio.file.FileVisitOption;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.stream.Stream;
import org.junit.*;
import org.junit.runner.JUnitCore;
import org.junit.runner.Result;
import org.junit.runner.notification.Failure;
import static org.junit.Assert.*;
import leadtools.*;
import leadtools.codecs.*;
import leadtools.document.writer.*;
import leadtools.svg.*;
public void svgDocumentEnumerateElementsExample() {
String LEAD_VARS_ImagesDir = "C:\\LEADTOOLS23\\Resources\\Images";
// The source PDF file
String srcFilePath = combine(LEAD_VARS_ImagesDir, "Leadtools_pdf.svg");
String beforeSvgFile = combine(LEAD_VARS_ImagesDir, "Leadtools_before.svg");
String afterSvgFile = combine(LEAD_VARS_ImagesDir, "Leadtools_after.svg");
// Assume this is our Virtual Directory
String virtualDirectory = "http://localhost/leadtools_images/svg/resources";
// Assume this phrysical directory maps to the Virtual Directory
String physicalDirectory = combine(LEAD_VARS_ImagesDir, "svg\\resources");
if (!new File(physicalDirectory).exists())
new File(physicalDirectory).mkdirs();
// Our SVG element enumartion callback
SvgEnumerateElementsCallback callback = (SvgDocument document, SvgNodeHandle node, Object userData) -> {
if (node.getElementType() == SvgElementType.IMAGE) {
// Get the href
String href = node.getAttributeValue("xlink:href");
if (!href.isEmpty() || href != null) {
// Parse it as data URI
SvgDataUri 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
System.out.println("Replacing data URI");
System.out.println("Format:" + dataUri.getImageFormat());
if (dataUri.getMediaLength() > 0)
System.out.println(
"Media:" + dataUri.getHref().substring(dataUri.getMediaOffset(), dataUri.getMediaLength()));
if (dataUri.getCharSetOffset() > 0)
System.out.println(
"CharSet:"
+ dataUri.getHref().substring(dataUri.getCharSetOffset(), dataUri.getCharSetLength()));
else
System.out.println("CharSet: not set");
System.out.println("IsBase64:" + dataUri.isBase64());
System.out.println("ImageFormat:" + dataUri.getImageFormat());
String extension = dataUri.getExtension();
System.out.println("Extension:" + extension);
// Get a file name
String name = "dstSrcFile" + extension;
// Save it
// Full physical path
String filePath = combine(physicalDirectory, name);
dataUri.decodeToFile(filePath);
// Finally replace the attribute in the image element with the URI
String virtualPath = virtualDirectory + "/" + name;
node.setAttributeValue("xlink:href", virtualPath);
} else {
System.out.println("Does not contain a valid data URI");
}
}
}
return true;
};
RasterCodecs codecs = new RasterCodecs();
// Use 300 DPI when loading document images
codecs.getOptions().getRasterizeDocument().getLoad().setResolution(300);
// Load the first page as SVG
SvgDocument svgDocument = (SvgDocument) codecs.loadSvg(srcFilePath, 1, null);
if (!svgDocument.isFlat())
svgDocument.flat(null);
if (!svgDocument.getBounds().isValid())
svgDocument.calculateBounds(false);
// Save this SVG to disk, report the size
svgDocument.saveToFile(beforeSvgFile, null);
System.out.println("Before unembedding the image, size is " + new File(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
svgDocument.beginUpdate();
SvgEnumerateOptions svgEnumerateOptions = new SvgEnumerateOptions();
svgEnumerateOptions.setEnumerateDirection(SvgEnumerateDirection.TOP_TO_BOTTOM);
svgDocument.enumerateElements(svgEnumerateOptions, callback, null);
svgDocument.endUpdate();
// Save this SVG to disk again, report the size, should be alot smaller since
// the image are unembedded and stored as external resources
svgDocument.saveToFile(afterSvgFile, null);
System.out.println("After unembedding the image, size is " + new File(afterSvgFile).length());
assertTrue(new File(afterSvgFile).length() != new File(beforeSvgFile).length());
}