Manipulating SVG Images

Saving SVG with Fonts embedded or Exported

Using Aspose.Imaging for Java, developers can save SVG with fonts embedded or exported. Using this sample example we should be able to set fonts to be exported. When this setting is on, all fonts used in SVG drawing should be saved as separate font files. We should be able to provide a stream for saving this font files, and be able to set the path (url) for the reference to this font files.

// For complete examples and data files, please go to https://github.com/Muhammad-Adnan-Ahmad/Aspose.Imaging-for-Java
private static final String FontFolderName = "fonts";
private static final String OutFolderName = "Out\\";
private static final String SourceFolder = "C:\\Temp\\Errors\\6\\";
private static String OutFolder = SourceFolder + OutFolderName;
private static String FontFolder = OutFolder + "\\" + FontFolderName;
public void readFileWithEmbeddedFontsAndExportToPdf()
{
this.readAndExportToPdf("EmbeddedFonts.svg");
}
public void readFileWithExportedFontsAndExportToPdf()
{
this.readAndExportToPdf("ExportedFonts.svg");
}
public void saveWithEmbeddedFonts()
{
String[] files = new String[]
{
"exportedFonts.svg", // File with exported fonts
"embeddedFonts.svg", // File with embedded fonts
"mysvg.svg" // simple file
};
for (int i = 0; i < files.length; i++)
{
this.save(true, files[i], 0);
}
}
public void saveWithExportFonts()
{
String[] files = new String[]
{
"exportedFonts.svg", // File with exported fonts
"embeddedFonts.svg", // File with embedded fonts
"mysvg.svg" // simple file
};
int[] expectedFontsCount = new int[] {
4, 4, 1
} ;
for (int i = 0; i < files.length; i++)
{
this.save(false, files[i], expectedFontsCount[i]);
}
}
private void readAndExportToPdf(String inputFileName)
{
File f = new File(OutFolder);
if (!f.exists())
{
f.mkdir();
}
String inputFile = SourceFolder + inputFileName;
String outFile = OutFolder + "\\" + inputFileName + ".pdf";
final Image image = Image.load(inputFile);
try
{
image.save(outFile,
new PdfOptions()
{{
setVectorRasterizationOptions(new SvgRasterizationOptions()
{{
setPageSize(new SizeF(image.getWidth(), image.getHeight()));
}});
}});
}
finally
{
image.dispose();
}
}
private void save(final boolean useEmbedded, String fileName, int expectedCountFonts)
{
File f = new File(OutFolder);
if (!f.exists())
{
f.mkdir();
}
String fontStoreType = useEmbedded ? "Embedded" : "Stream";
String inputFile = SourceFolder + fileName;
String outFileName = fileName + "_" + fontStoreType + ".svg";
String outputFile = OutFolder + "\\" + outFileName;
Image image = Image.load(inputFile);
final String fontFolder;
try
{
final EmfRasterizationOptions emfRasterizationOptions = new EmfRasterizationOptions();
emfRasterizationOptions.setBackgroundColor(Color.getWhite());
emfRasterizationOptions.setPageWidth(image.getWidth());
emfRasterizationOptions.setPageHeight(image.getHeight());
final String testingFileName = inputFile.substring(inputFile.lastIndexOf("\\")+1, inputFile.length() - 4);
fontFolder = FontFolder + "\\" + testingFileName;
image.save(outputFile,
new SvgOptions()
{{
setVectorRasterizationOptions(emfRasterizationOptions);
setCallback(
new SvgCallbackFontTest(useEmbedded, fontFolder)
{{
setLink(FontFolderName +"/"+testingFileName);
}});
}});
}
finally
{
image.dispose();
}
if (!useEmbedded)
{
f = new File(fontFolder);
String[] files = f.list();
if (files.length != expectedCountFonts)
{
throw new RuntimeException(String.format(
"Expected count font files = %d, Current count font files = %d", expectedCountFonts,
files.length));
}
}
}
}
class SvgCallbackFontTest extends SvgResourceKeeperCallback
{
/**
* The out folder
*/
private final String outFolder;
/**
* The use embedded font
*/
private final boolean useEmbeddedFont;
/**
* The font counter
*/
private int fontCounter = 0;
/**
* Initializes a new instance of the {@see SvgTests.svgCallbackFontTest} class.
* @param useEbeddedFont if set to true [use ebedded font].
* @param outFolder The out folder.
*/
public SvgCallbackFontTest(boolean useEbeddedFont, String outFolder)
{
this.useEmbeddedFont = useEbeddedFont;
this.outFolder = outFolder;
File f = new File(outFolder);
if (f.exists())
{
File[] list = f.listFiles();
for (File it : list)
it.delete();
f.delete();
}
}
private String link;
public String getLink()
{
return link;
}
public void setLink(String link)
{
this.link = link;
}
/**
* Called when font resource ready to be saved to storage.
* @param args The arguments.
*/
public void onFontResourceReady(FontStoringArgs args)
{
if (this.useEmbeddedFont)
{
args.setFontStoreType(FontStoreType.Embedded);
}
else
{
args.setFontStoreType(FontStoreType.Stream);
String fontFolder = this.outFolder;
File f = new File(fontFolder);
if (!f.exists())
{
f.mkdirs();
}
String fName = args.getSourceFontFileName();
f = new File(fName);
if (!f.exists())
{
fName = String.format("font_%d.ttf", this.fontCounter++);
f = new File(fName);
}
String name = f.getName();
name = name.substring(name.indexOf('\\')+1);
String fileName = fontFolder + "\\" + name;
args.setDestFontStream(new FileStream(fileName, FileMode.OpenOrCreate));
args.setDisposeStream(true);
args.setFontFileUri("./" + this.getLink() + "/" + name);
}
}

Converting SVG into EMF

Using Aspose.Imaging for Java, developers can convert SVG file format to EMF. Below sample code is provided.

// For complete examples and data files, please go to https://github.com/Muhammad-Adnan-Ahmad/Aspose.Imaging-for-Java
public static void main(String... args) throws Exception {
String dataDir = Utils.getSharedDataDir(SVGToEMFConversion.class) + "ConvertingImages/";
String[] testFiles = new String[]
{
"input.svg",
"juanmontoya_lingerie.svg",
"rg1024_green_grapes.svg",
"sample_car.svg",
"tommek_Car.svg"
};
String basePath = dataDir+"IMAGINGJAVA-1085\\";
String outputPath = basePath + "output\\";
File dir = new File(outputPath);
if (!dir.exists())
{
assert dir.mkdirs() : "Can not create output directory!";
}
for (String fileName : testFiles)
{
String inputFileName = basePath + fileName;
String outputFileName = outputPath + fileName + ".emf";
final Image image = Image.load(inputFileName);
try
{
image.save(outputFileName, new EmfOptions()
{{
setVectorRasterizationOptions(new SvgRasterizationOptions()
{{
setPageSize(Size.to_SizeF(image.getSize()));
}});
}});
}
finally
{
image.close();
}
}
}