Convert SVG to PDF

Colors
8/22/2014

With PDFKit.NET, it is easy to convert Scalable Vector Graphic (SVG) files to PDF. These SVG files usually contain a lot of graphical elements, but very often they also contain text fragments. This, of course, alongside the definitions of the used fonts. This article explains how to use these text and fonts in SVG documents.

First things first, this the code you need to convert a SVG file:

Document doc = new Document();
Page page = new Page(PageSize.A4);
doc.Pages.Add(page);
byte[] svg = File.ReadAllBytes(@"..\..\in.svg");
using (var svgMem = new MemoryStream(svg))
{
    SvgShape svgShape = new SvgShape(svgMem);
    page.Overlay.Add(svgShape);
}

using (var file = new FileStream(@"..\..\out.pdf", FileMode.Create))
{
    doc.Write(file);
}
Dim doc As New Document()
Dim page As New Page(PageSize.A4)
doc.Pages.Add(page)
Dim svg As Byte() = File.ReadAllBytes("..\..\in.svg")
Using svgMem = New MemoryStream(svg)
    Dim svgShape As New SvgShape(svgMem)
    page.Overlay.Add(svgShape)
End Using

Using file1 = New FileStream("..\..\out.pdf", FileMode.Create)
    doc.Write(file1)
End Using

The simple SVG example

Next you need SVG that is read from the file 'in.svg' in the code above. In the following SVG example you see two text fragments, each with its own definition of the font and the size.

<svg xmlns="http://www.w3.org/2000/svg" 
     width="925px" 
     height="485px"> 

  <text x="16" 
        y ="32" 
	    style="font-family: 'MS PGothic'; font-size:10pt; font-style:normal;font-weight:normal;" 
	    text-anchor="start" 
	    fill="rgb(0,0,128)"> 
    MS PGothic 
  </text> 

  <text x="150" 
        y="32" 
	    style="font-family: 'MS PGothic'; font-size:10pt; font-style:normal;font-weight:normal;" 
	    text-anchor="start" 
	    fill="rgb(0,0,128)"> 
    スキャン 
  </text> 
</svg>

If you convert this to PDF, then result will look like this:

easy_svg_font.png

An SVG example using styles

The previous examples works very well, but as a SVG file may have many text fragments, it is more efficient to define the fonts only once in a style instead. This is what the next example will show, two style definitions that are defined once that may be used often:

<?xml version="1.0" standalone="no"?>
<svg xmlns="http://www.w3.org/2000/svg" 
     width="925px" 
     height="485px">

  <style>
      .ArialUnicodeMS22 {
      font-family: 'Arial Unicode MS';
      font-size: 22px;
    }
  </style>

  <style>
      .MSGothicRegular{
        font-family: 'MS PGothic regular';
        font-size: 16px;
      }
  </style>

  <text x="10" 
        y ="16" 
        class="ArialUnicodeMS22" 
        text-anchor="start" 
        fill="rgb(0,0,128)">
    Arial Unicode MS 22
  </text>

  <text x="250" 
        y="16" 
        class="MSGothicRegular" 
        text-anchor="start" 
        fill="rgb(0,0,128)">
    スキャン
  </text>

</svg>

This will give you almost the same result:

easy_svg_font2.png

Usable fonts

Since PDFKit.NET 4.0.40.0, there is better support for the truetype font collections. In practice this means that, among others, fonts like Meiryo can be used now.