←Select platform

SvgDataUri Class

Summary

Represents a data URI object.

Syntax
C#
Objective-C
C++/CLI
Java
Python
public class SvgDataUri 
@interface LTSvgDataUri : NSObject 
public class SvgDataUri 
public ref class SvgDataUri  
class SvgDataUri: 
Remarks

SvgDataUri is a class that handles the data URI uniform resource identifier (URI) scheme for including data in-line in SVG files. The syntax for Data URI is:

data:[<media type\>][;charset=\<character set>][;base64],<data>

Refer to Data URI scheme for more information.

In SVG files, an image element comes in the following form:

<image x="x-position" y="y-position" width="width-value" height="height-value" xlink:href="image-data" />

Where x-position, y-position, width-value and height-value are the optional location and size of the image inside the SVG.

image-data can have one of the following formats:

  • A link to an external resource. For example:

    xlink:href="image.png" or xlink:href="http://server/myimage.png"
  • A data URI that includes the image pixel data embedded inside the SVG:

    xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAA ... etc"

Refer to https://www.w3.org/TR/SVG/ for more information about the SVG image element.

When an SVG document is flattened, all image elements will be embedded in the SVG as data URI elements. This allows the SVG file to be self-contained and passed from a server to a client without relying on any external resources.

Extracting data from a data URI or constructing a new one from raw image data is not supported by the .NET framework directly and the SvgDataUri class contains functionality that allows the user to:

  • Given a data URI value as a string (as in the example above), extract all relevant data such as the media type, character set, encoding and the data itself using the Parse method. Some of these parameters are optional and some come in certain formats and the Parse method can handle all of the features supported by data URI.

  • Encode a data URI object from an image in a file or stream using EncodeFromFile and EncodeFromStream. These methods return a data URI string value that is ready to be inserted into an SVG file.

  • Save the value of an image data URI to a file or stream using DecodeToFile and DecodeToStream using the URI's media type and pixel data. These methods allow the user to extract any embedded image from an SVG document.

Example
C#
Java
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()); 
} 
Requirements

Target Platforms

Help Version 23.0.2024.5.23
Products | Support | Contact Us | Intellectual Property Notices
© 1991-2024 LEAD Technologies, Inc. All Rights Reserved.

Leadtools.Svg Assembly
Products | Support | Contact Us | Intellectual Property Notices
© 1991-2023 LEAD Technologies, Inc. All Rights Reserved.