arklumpus / VectSharp

A light library for C# vector graphics
GNU Lesser General Public License v3.0
225 stars 22 forks source link

SVG Parsing/Import problems #48

Closed johnHastings772 closed 1 year ago

johnHastings772 commented 1 year ago

Greetings!

First of all congratulations and thanks for having such an amazing project I wish I had discovered if before.

I'm using an SVG file as a template for some documents, I've been using iText but I'm considering moving over to VectSharp.

Unfortunately I've detected some problems with the file I'm trying to convert to PDF.

The workflow I use is:

1) Load the SVG as xml and edit nodes as needed 2) Load the edited SVG as a document page 3) Save as PDF

Particularities of my SVG file:

To have a behaviour similar to a form (so text doesn't overfloq) a clipping path is defined over certain text elements. Some text is alinged left or right. It includes an embbeded raster PNG. Page/document size is A4 210mm X 297mm Uses Arial Font

When following this workflow with iText the end result is satisfactory but with VectSharp I noticed the following problems:

I can't specify Fonts when loading an SVG file with the Parer class, it defaults to Helvetica on my system. Page/document size is 74.1mm x 104.8mm instead of A4 size (210mm X 297mm) (Is this due to using inches instead of cm/mm on some conversions?). Clipping paths are ignored and text overflows. The raster image is imported as RectangleAction instead of RasterImageAction.

Thanks for your time and support!

Here´s the Proof Of Concept code:

//For xml manipulation
using System.Xml.Linq;

//VectSharp
using VectSharp;
using VectSharp.SVG;
using VectSharp.PDF;

//iText
using iText.Kernel.Pdf;
using iText.Layout.Font;
using iText.Svg.Converter;
using iText.Svg.Processors.Impl;

var svgDoc = XDocument.Load("POC.svg");

svgDoc.Root!.Elements().Elements()
    .Where(x => x.Attribute("id")!.Value.ToString() == "ArialRegularSpan")
    .FirstOrDefault()!.SetValue("Arial regular text with clipping path and overflow");

var svgDocMs = new MemoryStream();

var VSPdf = new Document();
svgDoc.Save(svgDocMs, SaveOptions.DisableFormatting);
svgDocMs.Position = 0;
var vectSharpPage = Parser.FromStream(svgDocMs);
VSPdf.Pages.Add(vectSharpPage);
VSPdf.SaveAsPDF("vectSharpPOC.pdf", compressStreams: true);

var ITPdf = new PdfDocument(new PdfWriter("itextPOC.pdf", new WriterProperties().SetCompressionLevel(CompressionConstants.BEST_COMPRESSION)));
var properties = new SvgConverterProperties();
FontProvider provider = new FontProvider();
provider.AddSystemFonts();
properties.SetFontProvider(provider);
ITPdf.AddNewPage();
svgDocMs = new MemoryStream();
svgDoc.Save(svgDocMs, SaveOptions.DisableFormatting);
svgDocMs.Position = 0;
SvgConverter.DrawOnDocument(svgDocMs, ITPdf, 1, properties);
ITPdf.Close();

Here's the svg as raster with annotations in blue (annotations not included in the svg itself):

imagen

Here's the svg file itself:

<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->

<svg
   width="210mm"
   height="297mm"
   viewBox="0 0 210 297"
   version="1.1"
   id="svg598"
   xml:space="preserve"
   xmlns:xlink="http://www.w3.org/1999/xlink"
   xmlns="http://www.w3.org/2000/svg"><defs
     id="defs595"><clipPath
       clipPathUnits="userSpaceOnUse"
       id="clipPath299"><rect
         style="fill:#00ff00;stroke-width:0.372668;stop-color:#000000"
         id="rect301"
         width="109.71268"
         height="16.992537"
         x="44.328358"
         y="47.912495" /></clipPath></defs><image
     width="141.1111"
     height="156.86853"
     preserveAspectRatio="none"
     xlink:href="data:image/png;base64,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 BAsAYBYccgjgUREq3QAAAABJRU5ErkJggg== "
     id="image727"
     x="34.44445"
     y="70.065735" /><text
     xml:space="preserve"
     style="font-variant:normal;font-weight:bold;font-stretch:normal;font-size:7.09177px;font-family:Arial;-inkscape-font-specification:Arial-BoldMT;writing-mode:lr-tb;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.590982"
     id="ArialBold"
     x="92.778885"
     y="42.265591"
     clip-path="none"><tspan
       id="ArialBoldSpan"
       style="text-align:end;text-anchor:end;fill:#000000;stroke-width:0.590982"
       x="92.778885"
       y="42.265591">Arial bold text</tspan></text><text
     xml:space="preserve"
     style="font-variant:normal;font-weight:bold;font-stretch:normal;font-size:7.09177px;font-family:Arial;-inkscape-font-specification:Arial-BoldMT;text-align:start;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.590982"
     id="ArialRegular"
     x="45.50539"
     y="58.447636"
     clip-path="url(#clipPath299)"><tspan
       id="ArialRegularSpan"
       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-family:Arial;-inkscape-font-specification:Arial;text-align:start;text-anchor:start;fill:#000000;stroke-width:0.590982"
       x="45.50539"
       y="58.447636">Arial regular text with clipping path</tspan></text><text
     xml:space="preserve"
     style="font-variant:normal;font-weight:bold;font-stretch:normal;font-size:7.09177px;font-family:Arial;-inkscape-font-specification:Arial-BoldMT;writing-mode:lr-tb;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.590982"
     id="Slash"
     x="96.630013"
     y="42.265591"><tspan
       id="SlashSpan"
       style="text-align:center;text-anchor:middle;fill:#000000;stroke-width:0.590982"
       y="42.265591"
       x="95.636192">/</tspan></text><text
     xml:space="preserve"
     style="font-variant:normal;font-weight:bold;font-stretch:normal;font-size:7.09177px;font-family:Arial;-inkscape-font-specification:Arial-BoldMT;writing-mode:lr-tb;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.590982"
     id="ArialBoldItalic"
     x="98.691788"
     y="42.265591"><tspan
       id="ArialBoldItalicSpan"
       style="font-style:italic;font-variant:normal;font-weight:bold;font-stretch:normal;font-family:Arial;-inkscape-font-specification:'Arial Bold Italic';fill:#000000;stroke-width:0.590982"
       y="42.265591"
       x="98.691788">Arial Italic bold text</tspan></text></svg>

Here's a zipfile with a sample csproj and the output pdf files vectSharpPOC.zip

VectSharp pdf (included in the above zip) as raster:

imagen

iText pdf (included in the above zip) as raster:

imagen

arklumpus commented 1 year ago

Hi! Thank you for your interest in VectSharp!

I will start by saying that your approach seems to be overly complicated to me - if you're using VectSharp, you don't need to have a template SVG file, and you can easily draw everything directly in C# (at least, it will be easier than getting the SVG to be parsed correctly).

For example:

using VectSharp;
using VectSharp.PDF;
using VectSharp.Raster;

// Create a SimpleFontLibrary and add the Arial fonts to it.
// I would strongly recommend using Helvetica or shipping your
// own font files instead of relying on system fonts, though!
SimpleFontLibrary fontLibrary = new SimpleFontLibrary();
fontLibrary.Add(@"C:\\Windows\\Fonts\\arialbd.ttf");
fontLibrary.Add(@"C:\\Windows\\Fonts\\arialbi.ttf");
fontLibrary.Add(@"C:\\Windows\\Fonts\\arial.ttf");
FontFamily.DefaultFontLibrary = fontLibrary;

// Create the fonts.
Font arialRegular = new Font(FontFamily.ResolveFontFamily("Arial"), 20);
Font arialBold = new Font(FontFamily.ResolveFontFamily("Arial Bold"), 20);
Font arialBoldItalic = new Font(FontFamily.ResolveFontFamily("Arial Bold Italic"), 20);

// Strings that will be drawn on the page.
string stringBold = "Arial bold text";
string stringBoldItalic = "Arial Italic bold text";
string stringRegularClipped = "Arial regular text with clipping path and overflow";

// Raster image.
RasterImageFile image = new RasterImageFile(@"icon.png");

// Page size in dots - note the conversion factor.
double pageWidth = 210 * 72 / 25.4;
double pageHeight = 297 * 72 / 25.4;

// Create the Page.
Page pag = new Page(pageWidth, pageHeight);

// Obtain the Graphics object on which to draw.
Graphics gpr = pag.Graphics;

// Draw the right-aligned text. Use the TextBaseline.Baseline to make sure that
// the strings drawn on the same line are properly aligned vertically.
gpr.FillText(260 - arialBold.MeasureText(stringBold).Width, 120, stringBold, arialBold, Colours.Black, TextBaselines.Baseline);

// Draw the "/".
gpr.FillText(270 - arialRegular.MeasureText("/").Width * 0.5, 120, "/", arialRegular, Colours.Black, TextBaselines.Baseline);

// Draw the left-aligned bold italic text.
gpr.FillText(280, 120, stringBoldItalic, arialBoldItalic, Colours.Black, TextBaselines.Baseline);

// Save the graphics state (need this to revert the clipping path).
gpr.Save();

// Set the clipping path.
gpr.SetClippingPath(125, 145, 305, 30);

// Draw the clipped text.
gpr.FillText(125, 150, stringRegularClipped, arialRegular, Colours.Black);

// Restore the graphics state (thereby removing the clipping path).
gpr.Restore();

// Draw the raster image.
gpr.DrawRasterImage(pageWidth * 0.5 - 175, pageHeight * 0.5 - 175, 350, 350, image);

// Create the document.
Document doc = new Document();

// Add the page to the document.
doc.Pages.Add(pag);

// Save the PDF (no need to specify compressStreams: true, it is the default).
doc.SaveAsPDF("poc.pdf");

That said, regarding the issues you see when parsing the SVG file:

  1. To load the raster image, you need to follow the instructions at the bottom of this page. In particular, you need to
    • Add a reference to VectSharp.MuPDFUtils or VectSharp.ImageSharpUtils;
    • Add this line somewhere before loading the SVG document:
      VectSharp.SVG.Parser.ParseImageURI = VectSharp.MuPDFUtils.ImageURIParser.Parser(VectSharp.SVG.Parser.ParseSVGURI);

      (replace MuPDFUtils with ImageSharpUtils, if necessary).

  2. The bold text has the font-weight: bold attribute set only in the outer text element, and not in the tspan. Adding this attribute to the tspan makes the font bold (though still not Arial, see below).
  3. The clipping path is specified as a rect and not as a path. Specifying it as a path makes it work.
  4. For the page size, you're indeed missing a conversion. The SVG object is parsed into a page that with size 210x297 dots. For a PDF document, each dot is 1/72nd of an inch. Therefore, to get a PDF page that with size 210x297 mm, you need to scale everything by a factor of 72 / 25.4 ≈ 2.8346 [ (dots / inch) / (mm / inch) = dots / mm]:

    var vectSharpPage = Parser.FromStream(svgDocMs);
    
    double scalingFactor = 72 / 25.4;
    
    Page scaledPage = new Page(vectSharpPage.Width * scalingFactor, vectSharpPage.Height * scalingFactor);
    scaledPage.Graphics.Scale(scalingFactor, scalingFactor);
    scaledPage.Graphics.DrawGraphics(0, 0, vectSharpPage.Graphics);
    
    VSPdf.Pages.Add(scaledPage);
  5. For the fonts, you are not embedding the fonts in the SVG document, therefore VectSharp does not recognise them. Inkscape does not like embedded fonts, however... Still, Helvetica and Arial should have the same metrics, so it shouldn't matter too much.
  6. In any case, text alignments are not supported, so if you were to change the text of the bit that is right-aligned, it would not be positioned correctly.

Note that the SVG parsing functions of VectSharp.SVG are mainly intended to deal with SVG files produced by VectSharp itself... The SVG standard is huge (not even Inkscape implements everything)!

I am attaching:

johnHastings772 commented 1 year ago

Greetings and thanks for the feedback!

I've been able to solve most of the issues I had with your guidance, let me tell you a bit more about the document I'm trying to create:

it's something similar to a legal text that can/may change within short periods of time. A non technical user is required to make changes to the template. There's a format model that must be matched with accuracy. Some of it's pages are optional and some fields are optional too. There's some anti-adobe sentiment in between (so no adobe authoring tools are allowed, publishing to pdf is fine though).

On the plus side using an SVG template reduces code and allows to track changes easily on git.

Adding ParseImageURI was easy, I've been testing too the rect to path clipping changes and see no problems with the result file, the scaling is just 3 lines of code (although I'd rather avoid it if possible) and I'm starting to make changes on the text but with the current implementation of the SVG parser seems like it's impossible to use any other font than embedded ones.

Would you consider having a Font Library as an optional parameter to the SVG parser? (In case that helps in getting the fonts from external sources. I don't know much about the innards of VectSharp)

I don't know if it would increase the complexity of the code considerably so I wonder if I'm asking for too much here. I need to check the VectSharp code further in case I'm missing some other way to have the font and still keep using the SVG template without embedded fonts.

Thanks for your help and attention!

arklumpus commented 1 year ago

Hi again, good news!

It turns out implementing the fix was easier than I expected 😉

I have just pushed to NuGet VectSharp.SVG version 1.8.2-a2 (it may take a few minutes to appear). If you install this, you only need to add the following lines somewhere before parsing the SVG document:

SimpleFontLibrary fontLibrary = new SimpleFontLibrary();
fontLibrary.Add(@"C:\Windows\Fonts\arialbd.ttf");           // Arial Bold
fontLibrary.Add(@"C:\Windows\Fonts\arialbi.ttf");           // Arial Bold Italic
fontLibrary.Add(@"C:\Windows\Fonts\arial.ttf");             // Arial Regular - ALWAYS load the regular font last!
FontFamily.DefaultFontLibrary = fontLibrary;

This will allow the SVG parser to load the Arial fonts when it finds them in the SVG file. Of course, you will need to add the Italic version too, if you're using that (it shouldn't hurt to add it even if you are not using it now - maybe you will need it in the future).

This is not limited to Arial, of course; you can use any font, but just make sure that you add the "regular" font style last. Actually, I would strongly recommend you distribute to the user whatever font files you need to be using (assuming that the licence allows it), so that you don't have to make any assumptions about their system.

As a bonus, I also fixed the issue where font styles were not propagated from the parent <text> element to the child <tspan> elements (item 2 in my previous reply), and clipping paths defined as <rect> objects now work too (item 3). It seems I was wrong about item 6 - text alignments already work correctly.

Therefore, I believe that with the ParseImageURI line and the above lines to load the fonts, you should be able to parse the original file you sent me correctly.

Please try this new version, and if everything works fine, I'll mark it as stable and update the docs!

johnHastings772 commented 1 year ago

Thanks you very much for all the effort the results are really really good!

My document now renders almost perfecly, there's only one minor issue:

There seems to be some problem with with this new version of VectSharp.SVG regarding kerning and/or alignment of the character '1' (might happen too with other characters but with '1' it's really evident).

Also, some improvements that would nice to have in order to reduce lines of code on my template rendering implementation could be:

1) Have the option to create a default font library from system fonts or specific font directory( similar as iText), that way the user could change the font in the template and I wouln't need to change a single line of code.

2) Apply the needed scaling on the parser, in my SVG file the units are specified as milimeters it seems the VectSharp.SVG parser takes the value but ignores the unit interpreting it as points.

As before I don't know if I'm asking for too much here, those are just a couple of improvements that would make using VectSharp even easier.

Here's a Proof of concept code to illustrate on the problem with font alignment of '1':

using System.Xml.Linq;

using VectSharp;
using VectSharp.SVG;
using VectSharp.PDF;

using iText.Kernel.Pdf;
using iText.Layout.Font;
using iText.Svg.Converter;
using iText.Svg.Processors.Impl;

var svgPOCXDocuemnt = XDocument.Load("POC2.svg");

var svgPOCXDocuemntMs = new MemoryStream();

VectSharp.SVG.Parser.ParseImageURI = VectSharp.ImageSharpUtils.ImageURIParser.Parser(VectSharp.SVG.Parser.ParseSVGURI);
var vectSharpPdf = new Document();
svgPOCXDocuemnt.Save(svgPOCXDocuemntMs, SaveOptions.DisableFormatting);
svgPOCXDocuemntMs.Position = 0;
SimpleFontLibrary fontLibrary = new SimpleFontLibrary();
var fontPath = Environment.GetFolderPath(Environment.SpecialFolder.Fonts);
fontLibrary.Add(Path.Join(fontPath, "arialbd.ttf"));   // Arial Bold
fontLibrary.Add(Path.Join(fontPath, "ariali.ttf"));    // Arial Italic
fontLibrary.Add(Path.Join(fontPath, "arialbi.ttf"));   // Arial Bold Italic
fontLibrary.Add(Path.Join(fontPath, "arial.ttf"));     // Arial Regular - ALWAYS load the regular font last!
FontFamily.DefaultFontLibrary = fontLibrary;
var vectSharpPage = Parser.FromStream(svgPOCXDocuemntMs);

double scalingFactor = 72 / 25.4;
var scaledvectSharpPage = new Page(vectSharpPage.Width * scalingFactor, vectSharpPage.Height * scalingFactor);
scaledvectSharpPage.Graphics.Scale(scalingFactor, scalingFactor);
scaledvectSharpPage.Graphics.DrawGraphics(0, 0, vectSharpPage.Graphics);
vectSharpPdf.Pages.Add(scaledvectSharpPage);
vectSharpPdf.Pages.Add(vectSharpPage);
vectSharpPdf.SaveAsPDF("vectSharpPOC.pdf", compressStreams: true);

var iTextPdf = new PdfDocument(new PdfWriter("itextPOC.pdf", new WriterProperties().SetCompressionLevel(CompressionConstants.BEST_COMPRESSION)));
var properties = new SvgConverterProperties();
FontProvider provider = new FontProvider();
provider.AddSystemFonts();
properties.SetFontProvider(provider);
iTextPdf.AddNewPage();
svgPOCXDocuemntMs = new MemoryStream();
svgPOCXDocuemnt.Save(svgPOCXDocuemntMs, SaveOptions.DisableFormatting);
svgPOCXDocuemntMs.Position = 0;
SvgConverter.DrawOnDocument(svgPOCXDocuemntMs, iTextPdf, 1, properties);
iTextPdf.Close();

Here's the new SVG file:

<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->

<svg
   width="210mm"
   height="297mm"
   viewBox="0 0 210 297"
   version="1.1"
   id="svg5"
   xml:space="preserve"
   xmlns="http://www.w3.org/2000/svg">
  <defs
   id="defs2">

    <clipPath
   clipPathUnits="userSpaceOnUse"
   id="clipPath31891">
      <rect
   style="fill:#00ff00;stroke-width:0.588809;stop-color:#000000"
   id="rect31893"
   width="10.251294"
   height="159.90102"
   x="14.945811"
   y="120.04552" />
    </clipPath>
    <clipPath
   clipPathUnits="userSpaceOnUse"
   id="clipPath31887">
      <rect
   style="fill:#00ff00;stroke-width:0.588809;stop-color:#000000"
   id="rect31889"
   width="10.251294"
   height="159.90102"
   x="14.945811"
   y="120.04552" />
    </clipPath>
    <clipPath
   clipPathUnits="userSpaceOnUse"
   id="clipPath31883">
      <rect
   style="fill:#00ff00;stroke-width:0.588809;stop-color:#000000"
   id="rect31885"
   width="10.251294"
   height="159.90102"
   x="14.945811"
   y="120.04552" />
    </clipPath>
    <clipPath
   clipPathUnits="userSpaceOnUse"
   id="clipPath31879">
      <rect
   style="fill:#00ff00;stroke-width:0.588809;stop-color:#000000"
   id="rect31881"
   width="10.251294"
   height="159.90102"
   x="14.945811"
   y="120.04552" />
    </clipPath>
    <clipPath
   clipPathUnits="userSpaceOnUse"
   id="clipPath31875">
      <rect
   style="fill:#00ff00;stroke-width:0.588809;stop-color:#000000"
   id="rect31877"
   width="10.251294"
   height="159.90102"
   x="14.945811"
   y="120.04552" />
    </clipPath>
    <clipPath
   clipPathUnits="userSpaceOnUse"
   id="clipPath31871">
      <rect
   style="fill:#00ff00;stroke-width:0.588809;stop-color:#000000"
   id="rect31873"
   width="10.251294"
   height="159.90102"
   x="14.945811"
   y="120.04552" />
    </clipPath>
    <clipPath
   clipPathUnits="userSpaceOnUse"
   id="clipPath31867">
      <rect
   style="fill:#00ff00;stroke-width:0.588809;stop-color:#000000"
   id="rect31869"
   width="10.251294"
   height="159.90102"
   x="14.945811"
   y="120.04552" />
    </clipPath>
    <clipPath
   clipPathUnits="userSpaceOnUse"
   id="clipPath31863">
      <rect
   style="fill:#00ff00;stroke-width:0.588809;stop-color:#000000"
   id="rect31865"
   width="10.251294"
   height="159.90102"
   x="14.945811"
   y="120.04552" />
    </clipPath>
    <clipPath
   clipPathUnits="userSpaceOnUse"
   id="clipPath31859">
      <rect
   style="fill:#00ff00;stroke-width:0.588809;stop-color:#000000"
   id="rect31861"
   width="10.251294"
   height="159.90102"
   x="14.945811"
   y="120.04552" />
    </clipPath>
    <clipPath
   clipPathUnits="userSpaceOnUse"
   id="clipPath31855">
      <rect
   style="fill:#00ff00;stroke-width:0.588809;stop-color:#000000"
   id="rect31857"
   width="10.251294"
   height="159.90102"
   x="14.945811"
   y="120.04552" />
    </clipPath>
    <clipPath
   clipPathUnits="userSpaceOnUse"
   id="clipPath31851">
      <rect
   style="fill:#00ff00;stroke-width:0.588809;stop-color:#000000"
   id="rect31853"
   width="10.251294"
   height="159.90102"
   x="14.945811"
   y="120.04552" />
    </clipPath>
    <clipPath
   clipPathUnits="userSpaceOnUse"
   id="clipPath31847">
      <rect
   style="fill:#00ff00;stroke-width:0.588809;stop-color:#000000"
   id="rect31849"
   width="10.251294"
   height="159.90102"
   x="14.945811"
   y="120.04552" />
    </clipPath>
    <clipPath
   clipPathUnits="userSpaceOnUse"
   id="clipPath31843">
      <rect
   style="fill:#00ff00;stroke-width:0.588809;stop-color:#000000"
   id="rect31845"
   width="10.251294"
   height="159.90102"
   x="14.945811"
   y="120.04552" />
    </clipPath>
    <clipPath
   clipPathUnits="userSpaceOnUse"
   id="clipPath31839">
      <rect
   style="fill:#00ff00;stroke-width:0.588809;stop-color:#000000"
   id="rect31841"
   width="10.251294"
   height="159.90102"
   x="14.945811"
   y="120.04552" />
    </clipPath>
    <clipPath
   clipPathUnits="userSpaceOnUse"
   id="clipPath31835">
      <rect
   style="fill:#00ff00;stroke-width:0.588809;stop-color:#000000"
   id="rect31837"
   width="10.251294"
   height="159.90102"
   x="14.945811"
   y="120.04552" />
    </clipPath>
    <clipPath
   clipPathUnits="userSpaceOnUse"
   id="clipPath31831">
      <rect
   style="fill:#00ff00;stroke-width:0.588809;stop-color:#000000"
   id="rect31833"
   width="10.251294"
   height="159.90102"
   x="14.945811"
   y="120.04552" />
    </clipPath>
    <clipPath
   clipPathUnits="userSpaceOnUse"
   id="clipPath31827">
      <rect
   style="fill:#00ff00;stroke-width:0.588809;stop-color:#000000"
   id="rect31829"
   width="10.251294"
   height="159.90102"
   x="14.945811"
   y="120.04552" />
    </clipPath>
    <clipPath
   clipPathUnits="userSpaceOnUse"
   id="clipPath31823">
      <rect
   style="fill:#00ff00;stroke-width:0.588809;stop-color:#000000"
   id="rect31825"
   width="10.251294"
   height="159.90102"
   x="14.945811"
   y="120.04552" />
    </clipPath>
    <clipPath
   clipPathUnits="userSpaceOnUse"
   id="clipPath31819">
      <rect
   style="fill:#00ff00;stroke-width:0.588809;stop-color:#000000"
   id="rect31821"
   width="10.251294"
   height="159.90102"
   x="14.945811"
   y="120.04552" />
    </clipPath>
    <clipPath
   clipPathUnits="userSpaceOnUse"
   id="clipPath31815">
      <rect
   style="fill:#00ff00;stroke-width:0.588809;stop-color:#000000"
   id="rect31817"
   width="10.251294"
   height="159.90102"
   x="14.945811"
   y="120.04552" />
    </clipPath>
    <clipPath
   clipPathUnits="userSpaceOnUse"
   id="clipPath31811">
      <rect
   style="fill:#00ff00;stroke-width:0.588809;stop-color:#000000"
   id="rect31813"
   width="10.251294"
   height="159.90102"
   x="14.945811"
   y="120.04552" />
    </clipPath>
    <clipPath
   clipPathUnits="userSpaceOnUse"
   id="clipPath31807">
      <rect
   style="fill:#00ff00;stroke-width:0.588809;stop-color:#000000"
   id="rect31809"
   width="10.251294"
   height="159.90102"
   x="14.945811"
   y="120.04552" />
    </clipPath>
    <clipPath
   clipPathUnits="userSpaceOnUse"
   id="clipPath31803">
      <rect
   style="fill:#00ff00;stroke-width:0.588809;stop-color:#000000"
   id="rect31805"
   width="10.251294"
   height="159.90102"
   x="14.945811"
   y="120.04552" />
    </clipPath>
    <clipPath
   clipPathUnits="userSpaceOnUse"
   id="clipPath31799">
      <rect
   style="fill:#00ff00;stroke-width:0.588809;stop-color:#000000"
   id="rect31801"
   width="10.251294"
   height="159.90102"
   x="14.945811"
   y="120.04552" />
    </clipPath>
    <clipPath
   clipPathUnits="userSpaceOnUse"
   id="clipPath31795">
      <rect
   style="fill:#00ff00;stroke-width:0.588809;stop-color:#000000"
   id="rect31797"
   width="10.251294"
   height="159.90102"
   x="14.945811"
   y="120.04552" />
    </clipPath>
    <clipPath
   clipPathUnits="userSpaceOnUse"
   id="clipPath31791">
      <rect
   style="fill:#00ff00;stroke-width:0.588809;stop-color:#000000"
   id="rect31793"
   width="10.251294"
   height="159.90102"
   x="14.945811"
   y="120.04552" />
    </clipPath>
    <clipPath
   clipPathUnits="userSpaceOnUse"
   id="clipPath31787">
      <rect
   style="fill:#00ff00;stroke-width:0.588809;stop-color:#000000"
   id="rect31789"
   width="10.251294"
   height="159.90102"
   x="14.945811"
   y="120.04552" />
    </clipPath>
    <clipPath
   clipPathUnits="userSpaceOnUse"
   id="clipPath31783">
      <rect
   style="fill:#00ff00;stroke-width:0.588809;stop-color:#000000"
   id="rect31785"
   width="10.251294"
   height="159.90102"
   x="14.945811"
   y="120.04552" />
    </clipPath>
    <clipPath
   clipPathUnits="userSpaceOnUse"
   id="clipPath31779">
      <rect
   style="fill:#00ff00;stroke-width:0.588809;stop-color:#000000"
   id="rect31781"
   width="10.251294"
   height="159.90102"
   x="14.945811"
   y="120.04552" />
    </clipPath>
    <clipPath
   clipPathUnits="userSpaceOnUse"
   id="clipPath31775">
      <rect
   style="fill:#00ff00;stroke-width:0.588809;stop-color:#000000"
   id="rect31777"
   width="10.251294"
   height="159.90102"
   x="14.945811"
   y="120.04552" />
    </clipPath>
    <clipPath
   clipPathUnits="userSpaceOnUse"
   id="clipPath31771">
      <rect
   style="fill:#00ff00;stroke-width:0.588809;stop-color:#000000"
   id="rect31773"
   width="10.251294"
   height="159.90102"
   x="14.945811"
   y="120.04552" />
    </clipPath>
    <clipPath
   clipPathUnits="userSpaceOnUse"
   id="clipPath31767">
      <rect
   style="fill:#00ff00;stroke-width:0.588809;stop-color:#000000"
   id="rect31769"
   width="10.251294"
   height="159.90102"
   x="14.945811"
   y="120.04552" />
    </clipPath>

    <clipPath
   clipPathUnits="userSpaceOnUse"
   id="clipPath31703">
      <rect
   style="fill:#00ff00;stroke-width:0.588809;stop-color:#000000"
   id="rect31705"
   width="10.251294"
   height="159.90102"
   x="14.945811"
   y="120.04552" />
    </clipPath>

  </defs>
  <g
   id="layer1">
    <path
   d="m 98.300279,82.224296 h 62.456281 v -41.9239 H 98.300279 Z"
   style="fill:none;stroke:#231f20;stroke-width:1.71475;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
   id="path617" /><path
   d="M 98.300281,137.26534 H 160.75656 V 95.34144 H 98.300281 Z"
   style="fill:none;stroke:#231f20;stroke-width:1.71475;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
   id="path623" /><path
   d="m 98.30028,188.79705 h 62.45628 v -41.9239 H 98.30028 Z"
   style="fill:none;stroke:#231f20;stroke-width:1.71475;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
   id="path26377" />
    <text
   xml:space="preserve"
   style="font-size:2.82223px;line-height:normal;font-family:Arial;-inkscape-font-specification:Arial;text-align:center;text-decoration-color:#000000;text-anchor:middle;fill:#000000;stroke-width:0.264583;stop-color:#000000"
   x="189.17186"
   y="22.57243"
   id="text621"
   clip-path="none"
   transform="matrix(4.860706,0,0,4.860706,-789.46796,-43.525681)"><tspan
     id="tspan619"
     x="189.17186"
     y="22.57243"
     style="stroke-width:0.264583">1</tspan></text>

    <text
   xml:space="preserve"
   style="font-size:2.82223px;line-height:normal;font-family:Arial;-inkscape-font-specification:Arial;text-align:center;text-decoration-color:#000000;text-anchor:middle;fill:#000000;stroke-width:0.264583;stop-color:#000000"
   x="189.17186"
   y="22.57243"
   id="text627"
   clip-path="none"
   transform="matrix(4.860706,0,0,4.860706,-789.82578,11.515363)"><tspan
     id="tspan625"
     x="189.17186"
     y="22.57243"
     style="stroke-width:0.264583">2</tspan></text>

    <text
   xml:space="preserve"
   style="font-size:2.82223px;line-height:normal;font-family:Arial;-inkscape-font-specification:Arial;text-align:center;text-decoration-color:#000000;text-anchor:middle;fill:#000000;stroke-width:0.264583;stop-color:#000000"
   x="189.17186"
   y="22.57243"
   id="Page1Text"
   clip-path="none"
   transform="matrix(4.860706,0,0,4.860706,-789.95693,62.959996)"><tspan
     id="Page1"
     x="189.17186"
     y="22.57243"
     style="stroke-width:0.264583">3</tspan></text>

    <path
   d="m 16.122185,124.25007 h 7.87788"
   style="fill:none;stroke:#231f20;stroke-width:0.0881944;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
   id="path25981"
   clip-path="url(#clipPath31891)"
   transform="matrix(1.7535341,0,0,1.7535341,7.6074121,-202.32325)" />
    <path
   d="m 16.122185,129.25006 h 7.87788"
   style="fill:none;stroke:#231f20;stroke-width:0.0881944;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
   id="path25985"
   clip-path="url(#clipPath31887)"
   transform="matrix(1.7535341,0,0,1.7535341,7.6074121,-202.32325)" />
    <path
   d="m 16.122185,134.25009 h 7.87788"
   style="fill:none;stroke:#231f20;stroke-width:0.0881944;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
   id="path25989"
   clip-path="url(#clipPath31883)"
   transform="matrix(1.7535341,0,0,1.7535341,7.6074121,-202.32325)" />
    <path
   d="m 16.122185,139.25007 h 7.87788"
   style="fill:none;stroke:#231f20;stroke-width:0.0881944;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
   id="path25993"
   clip-path="url(#clipPath31879)"
   transform="matrix(1.7535341,0,0,1.7535341,7.6074121,-202.32325)" />
    <path
   d="m 16.122185,144.25007 h 7.87788"
   style="fill:none;stroke:#231f20;stroke-width:0.0881944;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
   id="path25997"
   clip-path="url(#clipPath31875)"
   transform="matrix(1.7535341,0,0,1.7535341,7.6074121,-202.32325)" />
    <path
   d="m 16.122185,149.25009 h 7.87788"
   style="fill:none;stroke:#231f20;stroke-width:0.0881944;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
   id="path26001"
   clip-path="url(#clipPath31871)"
   transform="matrix(1.7535341,0,0,1.7535341,7.6074121,-202.32325)" />
    <path
   d="m 16.122185,154.25008 h 7.87788"
   style="fill:none;stroke:#231f20;stroke-width:0.0881944;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
   id="path26005"
   clip-path="url(#clipPath31867)"
   transform="matrix(1.7535341,0,0,1.7535341,7.6074121,-202.32325)" />
    <path
   d="m 16.122185,159.25011 h 7.87788"
   style="fill:none;stroke:#231f20;stroke-width:0.0881944;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
   id="path26009"
   clip-path="url(#clipPath31863)"
   transform="matrix(1.7535341,0,0,1.7535341,7.6074121,-202.32325)" />
    <path
   d="m 16.122185,164.2501 h 7.87788"
   style="fill:none;stroke:#231f20;stroke-width:0.0881944;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
   id="path26013"
   clip-path="url(#clipPath31859)"
   transform="matrix(1.7535341,0,0,1.7535341,7.6074121,-202.32325)" />
    <path
   d="m 16.122185,169.25008 h 7.87788"
   style="fill:none;stroke:#231f20;stroke-width:0.0881944;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
   id="path26017"
   clip-path="url(#clipPath31855)"
   transform="matrix(1.7535341,0,0,1.7535341,7.6074121,-202.32325)" />
    <path
   d="m 16.122185,174.25008 h 7.87788"
   style="fill:none;stroke:#231f20;stroke-width:0.0881944;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
   id="path26021"
   clip-path="url(#clipPath31851)"
   transform="matrix(1.7535341,0,0,1.7535341,7.6074121,-202.32325)" />
    <path
   d="m 16.122185,179.2501 h 7.87788"
   style="fill:none;stroke:#231f20;stroke-width:0.0881944;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
   id="path26025"
   clip-path="url(#clipPath31847)"
   transform="matrix(1.7535341,0,0,1.7535341,7.6074121,-202.32325)" />
    <path
   d="m 16.122185,184.25009 h 7.87788"
   style="fill:none;stroke:#231f20;stroke-width:0.0881944;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
   id="path26029"
   clip-path="url(#clipPath31843)"
   transform="matrix(1.7535341,0,0,1.7535341,7.6074121,-202.32325)" />
    <path
   d="m 16.122185,189.25008 h 7.87788"
   style="fill:none;stroke:#231f20;stroke-width:0.0881944;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
   id="path26033"
   clip-path="url(#clipPath31839)"
   transform="matrix(1.7535341,0,0,1.7535341,7.6074121,-202.32325)" />
    <path
   d="m 16.122185,194.25011 h 7.87788"
   style="fill:none;stroke:#231f20;stroke-width:0.0881944;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
   id="path26037"
   clip-path="url(#clipPath31835)"
   transform="matrix(1.7535341,0,0,1.7535341,7.6074121,-202.32325)" />
    <path
   d="m 16.122185,199.2501 h 7.87788"
   style="fill:none;stroke:#231f20;stroke-width:0.0881944;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
   id="path26041"
   clip-path="url(#clipPath31831)"
   transform="matrix(1.7535341,0,0,1.7535341,7.6074121,-202.32325)" />
    <path
   d="m 16.122185,204.25008 h 7.87788"
   style="fill:none;stroke:#231f20;stroke-width:0.0881944;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
   id="path26045"
   clip-path="url(#clipPath31827)"
   transform="matrix(1.7535341,0,0,1.7535341,7.6074121,-202.32325)" />
    <path
   d="m 16.122185,209.25011 h 7.87788"
   style="fill:none;stroke:#231f20;stroke-width:0.0881944;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
   id="path26049"
   clip-path="url(#clipPath31823)"
   transform="matrix(1.7535341,0,0,1.7535341,7.6074121,-202.32325)" />
    <path
   d="m 16.122185,214.25011 h 7.87788"
   style="fill:none;stroke:#231f20;stroke-width:0.0881944;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
   id="path26053"
   clip-path="url(#clipPath31819)"
   transform="matrix(1.7535341,0,0,1.7535341,7.6074121,-202.32325)" />
    <path
   d="m 16.122185,219.25013 h 7.87788"
   style="fill:none;stroke:#231f20;stroke-width:0.0881944;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
   id="path26057"
   clip-path="url(#clipPath31815)"
   transform="matrix(1.7535341,0,0,1.7535341,7.6074121,-202.32325)" />
    <path
   d="m 16.122185,224.25012 h 7.87788"
   style="fill:none;stroke:#231f20;stroke-width:0.0881944;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
   id="path26061"
   clip-path="url(#clipPath31811)"
   transform="matrix(1.7535341,0,0,1.7535341,7.6074121,-202.32325)" />
    <path
   d="m 16.122185,229.25011 h 7.87788"
   style="fill:none;stroke:#231f20;stroke-width:0.0881944;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
   id="path26065"
   clip-path="url(#clipPath31807)"
   transform="matrix(1.7535341,0,0,1.7535341,7.6074121,-202.32325)" />
    <path
   d="m 16.122185,234.2501 h 7.87788"
   style="fill:none;stroke:#231f20;stroke-width:0.0881944;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
   id="path26069"
   clip-path="url(#clipPath31803)"
   transform="matrix(1.7535341,0,0,1.7535341,7.6074121,-202.32325)" />
    <path
   d="m 16.122185,239.25012 h 7.87788"
   style="fill:none;stroke:#231f20;stroke-width:0.0881944;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
   id="path26073"
   clip-path="url(#clipPath31799)"
   transform="matrix(1.7535341,0,0,1.7535341,7.6074121,-202.32325)" />
    <path
   d="m 16.122185,244.25011 h 7.87788"
   style="fill:none;stroke:#231f20;stroke-width:0.0881944;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
   id="path26077"
   clip-path="url(#clipPath31795)"
   transform="matrix(1.7535341,0,0,1.7535341,7.6074121,-202.32325)" />
    <path
   d="m 16.122185,249.25011 h 7.87788"
   style="fill:none;stroke:#231f20;stroke-width:0.0881944;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
   id="path26081"
   clip-path="url(#clipPath31791)"
   transform="matrix(1.7535341,0,0,1.7535341,7.6074121,-202.32325)" />
    <path
   d="m 16.122185,254.25013 h 7.87788"
   style="fill:none;stroke:#231f20;stroke-width:0.0881944;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
   id="path26085"
   clip-path="url(#clipPath31787)"
   transform="matrix(1.7535341,0,0,1.7535341,7.6074121,-202.32325)" />
    <path
   d="m 16.122185,259.25012 h 7.87788"
   style="fill:none;stroke:#231f20;stroke-width:0.0881944;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
   id="path26089"
   clip-path="url(#clipPath31783)"
   transform="matrix(1.7535341,0,0,1.7535341,7.6074121,-202.32325)" />
    <path
   d="m 16.122185,264.25011 h 7.87788"
   style="fill:none;stroke:#231f20;stroke-width:0.0881944;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
   id="path26093"
   clip-path="url(#clipPath31779)"
   transform="matrix(1.7535341,0,0,1.7535341,7.6074121,-202.32325)" />
    <path
   d="m 16.122185,269.25013 h 7.87788"
   style="fill:none;stroke:#231f20;stroke-width:0.0881944;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
   id="path26097"
   clip-path="url(#clipPath31775)"
   transform="matrix(1.7535341,0,0,1.7535341,7.6074121,-202.32325)" />
    <path
   d="m 16.122185,274.25012 h 7.87788"
   style="fill:none;stroke:#231f20;stroke-width:0.0881944;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
   id="path26101"
   clip-path="url(#clipPath31771)"
   transform="matrix(1.7535341,0,0,1.7535341,7.6074121,-202.32325)" />
    <path
   d="M 35.878213,287.35141 H 49.692344"
   style="fill:none;stroke:#231f20;stroke-width:0.154652;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
   id="path26105" />
    <text
   xml:space="preserve"
   style="font-size:2.82223px;line-height:normal;font-family:Arial;-inkscape-font-specification:Arial;text-align:center;text-decoration-color:#000000;text-anchor:middle;fill:#000000;stroke-width:0.264583;stop-color:#000000"
   x="20.060436"
   y="122.67604"
   id="Ord1Text"
   clip-path="url(#clipPath31767)"
   transform="matrix(1.7535341,0,0,1.7535341,7.7934778,-202.32325)"><tspan
     id="Ord1"
     x="20.060436"
     y="122.67604"
     style="stroke-width:0.264583">1</tspan></text>
    <text
   xml:space="preserve"
   style="font-size:2.82223px;line-height:normal;font-family:Arial;-inkscape-font-specification:Arial;text-align:center;text-decoration-color:#000000;text-anchor:middle;fill:#000000;stroke-width:0.264583;stop-color:#000000"
   x="20.060436"
   y="127.67708"
   id="Ord2Text"
   clip-path="none"
   transform="matrix(1.7535341,0,0,1.7535341,7.6643914,-202.32325)"><tspan
     id="Ord2"
     x="20.060436"
     y="127.67708"
     style="stroke-width:0.264583">2</tspan></text>

    <text
   xml:space="preserve"
   style="font-size:2.82223px;line-height:normal;font-family:Arial;-inkscape-font-specification:Arial;text-align:center;text-decoration-color:#000000;text-anchor:middle;fill:#000000;stroke-width:0.264583;stop-color:#000000"
   x="20.060436"
   y="132.67812"
   id="Ord3Text"
   clip-path="none"
   transform="matrix(1.7535341,0,0,1.7535341,7.6170774,-202.32325)"><tspan
     id="Ord3"
     x="20.060436"
     y="132.67812"
     style="stroke-width:0.264583">3</tspan></text>

    <text
   xml:space="preserve"
   style="font-size:2.82223px;line-height:normal;font-family:Arial;-inkscape-font-specification:Arial;text-align:center;text-decoration-color:#000000;text-anchor:middle;fill:#000000;stroke-width:0.264583;stop-color:#000000"
   x="20.060436"
   y="137.67915"
   id="Ord4Text"
   clip-path="none"
   transform="matrix(1.7535341,0,0,1.7535341,7.69682,-202.32325)"><tspan
     id="Ord4"
     x="20.060436"
     y="137.67915"
     style="stroke-width:0.264583">4</tspan></text>

    <text
   xml:space="preserve"
   style="font-size:2.82223px;line-height:normal;font-family:Arial;-inkscape-font-specification:Arial;text-align:center;text-decoration-color:#000000;text-anchor:middle;fill:#000000;stroke-width:0.264583;stop-color:#000000"
   x="20.060436"
   y="142.68019"
   id="Ord5Text"
   clip-path="none"
   transform="matrix(1.7535341,0,0,1.7535341,7.6049952,-202.32325)"><tspan
     id="Ord5"
     x="20.060436"
     y="142.68019"
     style="stroke-width:0.264583">5</tspan></text>

    <text
   xml:space="preserve"
   style="font-size:2.82223px;line-height:normal;font-family:Arial;-inkscape-font-specification:Arial;text-align:center;text-decoration-color:#000000;text-anchor:middle;fill:#000000;stroke-width:0.264583;stop-color:#000000"
   x="20.060436"
   y="147.68123"
   id="Ord6Text"
   clip-path="none"
   transform="matrix(1.7535341,0,0,1.7535341,7.6291596,-202.32325)"><tspan
     id="Ord6"
     x="20.060436"
     y="147.68123"
     style="stroke-width:0.264583">6</tspan></text>

    <text
   xml:space="preserve"
   style="font-size:2.82223px;line-height:normal;font-family:Arial;-inkscape-font-specification:Arial;text-align:center;text-decoration-color:#000000;text-anchor:middle;fill:#000000;stroke-width:0.264583;stop-color:#000000"
   x="20.060436"
   y="152.68227"
   id="Ord7Text"
   clip-path="none"
   transform="matrix(1.7535341,0,0,1.7535341,7.603787,-202.32325)"><tspan
     id="Ord7"
     x="20.060436"
     y="152.68227"
     style="stroke-width:0.264583">7</tspan></text>

    <text
   xml:space="preserve"
   style="font-size:2.82223px;line-height:normal;font-family:Arial;-inkscape-font-specification:Arial;text-align:center;text-decoration-color:#000000;text-anchor:middle;fill:#000000;stroke-width:0.264583;stop-color:#000000"
   x="20.060436"
   y="157.6833"
   id="Ord8Text"
   clip-path="none"
   transform="matrix(1.7535341,0,0,1.7535341,7.6170774,-202.32325)"><tspan
     id="Ord8"
     x="20.060436"
     y="157.6833"
     style="stroke-width:0.264583">8</tspan></text>

    <text
   xml:space="preserve"
   style="font-size:2.82223px;line-height:normal;font-family:Arial;-inkscape-font-specification:Arial;text-align:center;text-decoration-color:#000000;text-anchor:middle;fill:#000000;stroke-width:0.264583;stop-color:#000000"
   x="20.060436"
   y="162.68434"
   id="Ord9Text"
   clip-path="none"
   transform="matrix(1.7535341,0,0,1.7535341,7.614661,-202.32325)"><tspan
     id="Ord9"
     x="20.060436"
     y="162.68434"
     style="stroke-width:0.264583">9</tspan></text>

    <text
   xml:space="preserve"
   style="font-size:2.82223px;line-height:normal;font-family:Arial;-inkscape-font-specification:Arial;text-align:center;text-decoration-color:#000000;text-anchor:middle;fill:#000000;stroke-width:0.264583;stop-color:#000000"
   x="20.060436"
   y="167.68538"
   id="Ord10Text"
   clip-path="none"
   transform="matrix(1.7535341,0,0,1.7535341,7.4575921,-202.32325)"><tspan
     id="Ord10"
     x="20.060436"
     y="167.68538"
     style="stroke-width:0.264583">10</tspan></text>

    <text
   xml:space="preserve"
   style="font-size:2.82223px;line-height:normal;font-family:Arial;-inkscape-font-specification:Arial;text-align:center;text-decoration-color:#000000;text-anchor:middle;fill:#000000;stroke-width:0.264583;stop-color:#000000"
   x="20.060436"
   y="172.68642"
   id="Ord11Text"
   clip-path="none"
   transform="matrix(1.7535341,0,0,1.7535341,7.7934778,-202.32325)"><tspan
     id="Ord11"
     x="20.060436"
     y="172.68642"
     style="stroke-width:0.264583">11</tspan></text>

    <text
   xml:space="preserve"
   style="font-size:2.82223px;line-height:normal;font-family:Arial;-inkscape-font-specification:Arial;text-align:center;text-decoration-color:#000000;text-anchor:middle;fill:#000000;stroke-width:0.264583;stop-color:#000000"
   x="20.060436"
   y="177.68745"
   id="Ord12Text"
   clip-path="none"
   transform="matrix(1.7535341,0,0,1.7535341,7.4696744,-202.32325)"><tspan
     id="Ord12"
     x="20.060436"
     y="177.68745"
     style="stroke-width:0.264583">12</tspan></text>

    <text
   xml:space="preserve"
   style="font-size:2.82223px;line-height:normal;font-family:Arial;-inkscape-font-specification:Arial;text-align:center;text-decoration-color:#000000;text-anchor:middle;fill:#000000;stroke-width:0.264583;stop-color:#000000"
   x="20.060436"
   y="182.68849"
   id="Ord13Text"
   clip-path="none"
   transform="matrix(1.7535341,0,0,1.7535341,7.451551,-202.32325)"><tspan
     id="Ord13"
     x="20.060436"
     y="182.68849"
     style="stroke-width:0.264583">13</tspan></text>

    <text
   xml:space="preserve"
   style="font-size:2.82223px;line-height:normal;font-family:Arial;-inkscape-font-specification:Arial;text-align:center;text-decoration-color:#000000;text-anchor:middle;fill:#000000;stroke-width:0.264583;stop-color:#000000"
   x="20.060436"
   y="187.68953"
   id="Ord14Text"
   clip-path="none"
   transform="matrix(1.7535341,0,0,1.7535341,7.4588004,-202.32325)"><tspan
     id="Ord14"
     x="20.060436"
     y="187.68953"
     style="stroke-width:0.264583">14</tspan></text>

    <text
   xml:space="preserve"
   style="font-size:2.82223px;line-height:normal;font-family:Arial;-inkscape-font-specification:Arial;text-align:center;text-decoration-color:#000000;text-anchor:middle;fill:#000000;stroke-width:0.264583;stop-color:#000000"
   x="20.060436"
   y="192.69057"
   id="Ord15Text"
   clip-path="none"
   transform="matrix(1.7535341,0,0,1.7535341,7.4382606,-202.32325)"><tspan
     id="Ord15"
     x="20.060436"
     y="192.69057"
     style="stroke-width:0.264583">15</tspan></text>

    <text
   xml:space="preserve"
   style="font-size:2.82223px;line-height:normal;font-family:Arial;-inkscape-font-specification:Arial;text-align:center;text-decoration-color:#000000;text-anchor:middle;fill:#000000;stroke-width:0.264583;stop-color:#000000"
   x="20.060436"
   y="197.6916"
   id="Ord16Text"
   clip-path="none"
   transform="matrix(1.7535341,0,0,1.7535341,7.4527593,-202.32325)"><tspan
     id="Ord16"
     x="20.060436"
     y="197.6916"
     style="stroke-width:0.264583">16</tspan></text>

    <text
   xml:space="preserve"
   style="font-size:2.82223px;line-height:normal;font-family:Arial;-inkscape-font-specification:Arial;text-align:center;text-decoration-color:#000000;text-anchor:middle;fill:#000000;stroke-width:0.264583;stop-color:#000000"
   x="20.060436"
   y="202.69263"
   id="Ord17Text"
   clip-path="url(#clipPath31703)"
   transform="matrix(1.7535341,0,0,1.7535341,7.451551,-202.32325)"><tspan
     id="Ord17"
     x="20.060436"
     y="202.69263"
     style="stroke-width:0.264583">17</tspan></text>
    <text
   xml:space="preserve"
   style="font-size:2.82223px;line-height:normal;font-family:Arial;-inkscape-font-specification:Arial;text-align:center;text-decoration-color:#000000;text-anchor:middle;fill:#000000;stroke-width:0.264583;stop-color:#000000"
   x="20.060436"
   y="207.69366"
   id="Ord18Text"
   clip-path="none"
   transform="matrix(1.7535341,0,0,1.7535341,7.4479264,-202.32325)"><tspan
     id="Ord18"
     x="20.060436"
     y="207.69366"
     style="stroke-width:0.264583">18</tspan></text>

    <text
   xml:space="preserve"
   style="font-size:2.82223px;line-height:normal;font-family:Arial;-inkscape-font-specification:Arial;text-align:center;text-decoration-color:#000000;text-anchor:middle;fill:#000000;stroke-width:0.264583;stop-color:#000000"
   x="20.060436"
   y="212.6947"
   id="Ord19Text"
   clip-path="none"
   transform="matrix(1.7535341,0,0,1.7535341,7.4479264,-202.32325)"><tspan
     id="Ord19"
     x="20.060436"
     y="212.6947"
     style="stroke-width:0.264583">19</tspan></text>

    <text
   xml:space="preserve"
   style="font-size:2.82223px;line-height:normal;font-family:Arial;-inkscape-font-specification:Arial;text-align:center;text-decoration-color:#000000;text-anchor:middle;fill:#000000;stroke-width:0.264583;stop-color:#000000"
   x="20.060436"
   y="217.69574"
   id="Ord20Text"
   clip-path="none"
   transform="matrix(1.7535341,0,0,1.7535341,7.6523092,-202.32325)"><tspan
     id="Ord20"
     x="20.060436"
     y="217.69574"
     style="stroke-width:0.264583">20</tspan></text>

    <text
   xml:space="preserve"
   style="font-size:2.82223px;line-height:normal;font-family:Arial;-inkscape-font-specification:Arial;text-align:center;text-decoration-color:#000000;text-anchor:middle;fill:#000000;stroke-width:0.264583;stop-color:#000000"
   x="20.060436"
   y="222.69678"
   id="Ord21Text"
   clip-path="none"
   transform="matrix(1.7535341,0,0,1.7535341,7.7934778,-202.32325)"><tspan
     id="Ord21"
     x="20.060436"
     y="222.69678"
     style="stroke-width:0.264583">1</tspan></text>

    <text
   xml:space="preserve"
   style="font-size:2.82223px;line-height:normal;font-family:Arial;-inkscape-font-specification:Arial;text-align:center;text-decoration-color:#000000;text-anchor:middle;fill:#000000;stroke-width:0.264583;stop-color:#000000"
   x="20.060436"
   y="227.69781"
   id="Ord22Text"
   clip-path="none"
   transform="matrix(1.7535341,0,0,1.7535341,7.6643914,-202.32325)"><tspan
     id="Ord22"
     x="20.060436"
     y="227.69781"
     style="stroke-width:0.264583">2</tspan></text>

    <text
   xml:space="preserve"
   style="font-size:2.82223px;line-height:normal;font-family:Arial;-inkscape-font-specification:Arial;text-align:center;text-decoration-color:#000000;text-anchor:middle;fill:#000000;stroke-width:0.264583;stop-color:#000000"
   x="20.060436"
   y="232.69885"
   id="Ord23Text"
   clip-path="none"
   transform="matrix(1.7535341,0,0,1.7535341,7.6170774,-202.32325)"><tspan
     id="Ord23"
     x="20.060436"
     y="232.69885"
     style="stroke-width:0.264583">3</tspan></text>

    <text
   xml:space="preserve"
   style="font-size:2.82223px;line-height:normal;font-family:Arial;-inkscape-font-specification:Arial;text-align:center;text-decoration-color:#000000;text-anchor:middle;fill:#000000;stroke-width:0.264583;stop-color:#000000"
   x="20.060436"
   y="237.69989"
   id="Ord24Text"
   clip-path="none"
   transform="matrix(1.7535341,0,0,1.7535341,7.69682,-202.32325)"><tspan
     id="Ord24"
     x="20.060436"
     y="237.69989"
     style="stroke-width:0.264583">4</tspan></text>

    <text
   xml:space="preserve"
   style="font-size:2.82223px;line-height:normal;font-family:Arial;-inkscape-font-specification:Arial;text-align:center;text-decoration-color:#000000;text-anchor:middle;fill:#000000;stroke-width:0.264583;stop-color:#000000"
   x="20.060436"
   y="242.70093"
   id="Ord25Text"
   clip-path="none"
   transform="matrix(1.7535341,0,0,1.7535341,7.6049952,-202.32325)"><tspan
     id="Ord25"
     x="20.060436"
     y="242.70093"
     style="stroke-width:0.264583">5</tspan></text>

    <text
   xml:space="preserve"
   style="font-size:2.82223px;line-height:normal;font-family:Arial;-inkscape-font-specification:Arial;text-align:center;text-decoration-color:#000000;text-anchor:middle;fill:#000000;stroke-width:0.264583;stop-color:#000000"
   x="20.060436"
   y="247.70197"
   id="Ord26Text"
   clip-path="none"
   transform="matrix(1.7535341,0,0,1.7535341,7.6291596,-202.32325)"><tspan
     id="Ord26"
     x="20.060436"
     y="247.70197"
     style="stroke-width:0.264583">6</tspan></text>

    <text
   xml:space="preserve"
   style="font-size:2.82223px;line-height:normal;font-family:Arial;-inkscape-font-specification:Arial;text-align:center;text-decoration-color:#000000;text-anchor:middle;fill:#000000;stroke-width:0.264583;stop-color:#000000"
   x="20.060436"
   y="252.703"
   id="Ord27Text"
   clip-path="none"
   transform="matrix(1.7535341,0,0,1.7535341,7.603787,-202.32325)"><tspan
     id="Ord27"
     x="20.060436"
     y="252.703"
     style="stroke-width:0.264583">7</tspan></text>

    <text
   xml:space="preserve"
   style="font-size:2.82223px;line-height:normal;font-family:Arial;-inkscape-font-specification:Arial;text-align:center;text-decoration-color:#000000;text-anchor:middle;fill:#000000;stroke-width:0.264583;stop-color:#000000"
   x="20.060436"
   y="257.70404"
   id="Ord28Text"
   clip-path="none"
   transform="matrix(1.7535341,0,0,1.7535341,7.6170774,-202.32325)"><tspan
     id="Ord28"
     x="20.060436"
     y="257.70404"
     style="stroke-width:0.264583">8</tspan></text>

    <text
   xml:space="preserve"
   style="font-size:2.82223px;line-height:normal;font-family:Arial;-inkscape-font-specification:Arial;text-align:center;text-decoration-color:#000000;text-anchor:middle;fill:#000000;stroke-width:0.264583;stop-color:#000000"
   x="20.060436"
   y="262.70508"
   id="Ord29Text"
   clip-path="none"
   transform="matrix(1.7535341,0,0,1.7535341,7.614661,-202.32325)"><tspan
     id="Ord29"
     x="20.060436"
     y="262.70508"
     style="stroke-width:0.264583">9</tspan></text>

    <text
   xml:space="preserve"
   style="font-size:2.82223px;line-height:normal;font-family:Arial;-inkscape-font-specification:Arial;text-align:center;text-decoration-color:#000000;text-anchor:middle;fill:#000000;stroke-width:0.264583;stop-color:#000000"
   x="20.060436"
   y="267.70612"
   id="Ord30Text"
   clip-path="none"
   transform="matrix(1.7535341,0,0,1.7535341,7.4575921,-202.32325)"><tspan
     id="Ord30"
     x="20.060436"
     y="267.70612"
     style="stroke-width:0.264583">10</tspan></text>

    <text
   xml:space="preserve"
   style="font-size:2.82223px;line-height:normal;font-family:Arial;-inkscape-font-specification:Arial;text-align:center;text-decoration-color:#000000;text-anchor:middle;fill:#000000;stroke-width:0.264583;stop-color:#000000"
   x="20.060436"
   y="272.70715"
   id="Ord31Text"
   clip-path="none"
   transform="matrix(1.7535341,0,0,1.7535341,7.7934778,-202.32325)"><tspan
     id="Ord31"
     x="20.060436"
     y="272.70715"
     style="stroke-width:0.264583">11</tspan></text>

    <text
   xml:space="preserve"
   style="font-size:2.82223px;line-height:normal;font-family:Arial;-inkscape-font-specification:Arial;text-align:center;text-decoration-color:#000000;text-anchor:middle;fill:#000000;stroke-width:0.264583;stop-color:#000000"
   x="20.060436"
   y="277.70819"
   id="Ord32Text"
   clip-path="none"
   transform="matrix(1.7535341,0,0,1.7535341,7.4696744,-202.32325)"><tspan
     id="Ord32"
     x="20.060436"
     y="277.70819"
     style="stroke-width:0.264583">12</tspan></text>

  <path
   style="opacity:0.5;fill:none;stroke:#0044aa;stroke-width:2.23429;stroke-dasharray:none;stop-color:#000000"
   d="M 129.52842,31.583954 V 200.58582"
   id="path692" /></g>
</svg>

Here's the result of the rasterization from firefox with the pdf generated by the previous version of VectSharp.SVG:

imagen vectSharpPOC_old.pdf

Here's the result of the rasterization from firefox with the pdf generated by the current version of VectSharp.SVG:

imagen vectSharpPOC_new.pdf

Here's the result of the rasterization from firefox with the pdf generated by iText: imagen ItextPOC.pdf

Here's the result of the rasterization from firefox with the pdf generated by inkscape: imagen InkscapePOC.pdf

Note, I've been playing around with the clippings in case that's what is causing the issue, here's a different svg file which I have yet to test:

<?xml version="1.0" encoding="UTF-8"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg width="210mm" height="297mm" version="1.1" viewBox="0 0 210 297" xml:space="preserve" xmlns="http://www.w3.org/2000/svg">

  <g fill="none" stroke="#231f20" stroke-width="1.7148">
    <path d="m98.3 82.224h62.456v-41.924h-62.456z"/><path d="m98.3 137.27h62.456v-41.924h-62.456z"/><path d="m98.3 188.8h62.456v-41.924h-62.456z"/></g><g fill="#000000" font-family="Arial" font-size="2.8222px" stroke-width=".26458" text-anchor="middle">
    <text transform="matrix(4.8607 0 0 4.8607 -789.47 -43.526)" x="189.17186" y="22.57243" stop-color="#000000" text-align="center" style="line-height:normal;text-decoration-color:#000000" xml:space="preserve"><tspan x="189.17186" y="22.57243" stroke-width=".26458">1</tspan></text>

    <text transform="matrix(4.8607 0 0 4.8607 -789.83 11.515)" x="189.17186" y="22.57243" stop-color="#000000" text-align="center" style="line-height:normal;text-decoration-color:#000000" xml:space="preserve"><tspan x="189.17186" y="22.57243" stroke-width=".26458">2</tspan></text>

    <text id="Page1Text" transform="matrix(4.8607 0 0 4.8607 -789.96 62.96)" x="189.17186" y="22.57243" stop-color="#000000" text-align="center" style="line-height:normal;text-decoration-color:#000000" xml:space="preserve"><tspan x="189.17186" y="22.57243" stroke-width=".26458">3</tspan></text></g><g fill="none" stroke="#231f20"><g stroke-width=".088194">

    <path transform="matrix(1.7535 0 0 1.7535 7.6074 -202.32)" d="m16.122 124.25h7.8779"/>

    <path transform="matrix(1.7535 0 0 1.7535 7.6074 -202.32)" d="m16.122 129.25h7.8779"/>

    <path transform="matrix(1.7535 0 0 1.7535 7.6074 -202.32)" d="m16.122 134.25h7.8779"/>

    <path transform="matrix(1.7535 0 0 1.7535 7.6074 -202.32)" d="m16.122 139.25h7.8779"/>

    <path transform="matrix(1.7535 0 0 1.7535 7.6074 -202.32)" d="m16.122 144.25h7.8779"/>

    <path transform="matrix(1.7535 0 0 1.7535 7.6074 -202.32)" d="m16.122 149.25h7.8779"/>

    <path transform="matrix(1.7535 0 0 1.7535 7.6074 -202.32)" d="m16.122 154.25h7.8779"/>

    <path transform="matrix(1.7535 0 0 1.7535 7.6074 -202.32)" d="m16.122 159.25h7.8779"/>

    <path transform="matrix(1.7535 0 0 1.7535 7.6074 -202.32)" d="m16.122 164.25h7.8779"/>

    <path transform="matrix(1.7535 0 0 1.7535 7.6074 -202.32)" d="m16.122 169.25h7.8779"/>

    <path transform="matrix(1.7535 0 0 1.7535 7.6074 -202.32)" d="m16.122 174.25h7.8779"/>

    <path transform="matrix(1.7535 0 0 1.7535 7.6074 -202.32)" d="m16.122 179.25h7.8779"/>

    <path transform="matrix(1.7535 0 0 1.7535 7.6074 -202.32)" d="m16.122 184.25h7.8779"/>

    <path transform="matrix(1.7535 0 0 1.7535 7.6074 -202.32)" d="m16.122 189.25h7.8779"/>

    <path transform="matrix(1.7535 0 0 1.7535 7.6074 -202.32)" d="m16.122 194.25h7.8779"/>

    <path transform="matrix(1.7535 0 0 1.7535 7.6074 -202.32)" d="m16.122 199.25h7.8779"/>

    <path transform="matrix(1.7535 0 0 1.7535 7.6074 -202.32)" d="m16.122 204.25h7.8779"/>

    <path transform="matrix(1.7535 0 0 1.7535 7.6074 -202.32)" d="m16.122 209.25h7.8779"/>

    <path transform="matrix(1.7535 0 0 1.7535 7.6074 -202.32)" d="m16.122 214.25h7.8779"/>

    <path transform="matrix(1.7535 0 0 1.7535 7.6074 -202.32)" d="m16.122 219.25h7.8779"/>

    <path transform="matrix(1.7535 0 0 1.7535 7.6074 -202.32)" d="m16.122 224.25h7.8779"/>

    <path transform="matrix(1.7535 0 0 1.7535 7.6074 -202.32)" d="m16.122 229.25h7.8779"/>

    <path transform="matrix(1.7535 0 0 1.7535 7.6074 -202.32)" d="m16.122 234.25h7.8779"/>

    <path transform="matrix(1.7535 0 0 1.7535 7.6074 -202.32)" d="m16.122 239.25h7.8779"/>

    <path transform="matrix(1.7535 0 0 1.7535 7.6074 -202.32)" d="m16.122 244.25h7.8779"/>

    <path transform="matrix(1.7535 0 0 1.7535 7.6074 -202.32)" d="m16.122 249.25h7.8779"/>

    <path transform="matrix(1.7535 0 0 1.7535 7.6074 -202.32)" d="m16.122 254.25h7.8779"/>

    <path transform="matrix(1.7535 0 0 1.7535 7.6074 -202.32)" d="m16.122 259.25h7.8779"/>

    <path transform="matrix(1.7535 0 0 1.7535 7.6074 -202.32)" d="m16.122 264.25h7.8779"/>

    <path transform="matrix(1.7535 0 0 1.7535 7.6074 -202.32)" d="m16.122 269.25h7.8779"/>

    <path transform="matrix(1.7535 0 0 1.7535 7.6074 -202.32)" d="m16.122 274.25h7.8779"/>

    </g><path d="m35.878 287.35h13.814" stroke-width=".15465"/></g><g fill="#000000" font-family="Arial" font-size="2.8222px" stroke-width=".26458" text-anchor="middle">
    <text id="Ord1Text" transform="matrix(1.7535 0 0 1.7535 7.7935 -202.32)" x="20.060436" y="122.67604" stop-color="#000000" text-align="center" style="line-height:normal;text-decoration-color:#000000" xml:space="preserve"><tspan x="20.060436" y="122.67604" stroke-width=".26458">1</tspan></text>

    <text id="Ord2Text" transform="matrix(1.7535 0 0 1.7535 7.6644 -202.32)" x="20.060436" y="127.67708" stop-color="#000000" text-align="center" style="line-height:normal;text-decoration-color:#000000" xml:space="preserve"><tspan x="20.060436" y="127.67708" stroke-width=".26458">2</tspan></text>

    <text id="Ord3Text" transform="matrix(1.7535 0 0 1.7535 7.6171 -202.32)" x="20.060436" y="132.67812" stop-color="#000000" text-align="center" style="line-height:normal;text-decoration-color:#000000" xml:space="preserve"><tspan x="20.060436" y="132.67812" stroke-width=".26458">3</tspan></text>

    <text id="Ord4Text" transform="matrix(1.7535 0 0 1.7535 7.6968 -202.32)" x="20.060436" y="137.67915" stop-color="#000000" text-align="center" style="line-height:normal;text-decoration-color:#000000" xml:space="preserve"><tspan x="20.060436" y="137.67915" stroke-width=".26458">4</tspan></text>

    <text id="Ord5Text" transform="matrix(1.7535 0 0 1.7535 7.605 -202.32)" x="20.060436" y="142.68019" stop-color="#000000" text-align="center" style="line-height:normal;text-decoration-color:#000000" xml:space="preserve"><tspan x="20.060436" y="142.68019" stroke-width=".26458">5</tspan></text>

    <text id="Ord6Text" transform="matrix(1.7535 0 0 1.7535 7.6292 -202.32)" x="20.060436" y="147.68123" stop-color="#000000" text-align="center" style="line-height:normal;text-decoration-color:#000000" xml:space="preserve"><tspan x="20.060436" y="147.68123" stroke-width=".26458">6</tspan></text>

    <text id="Ord7Text" transform="matrix(1.7535 0 0 1.7535 7.6038 -202.32)" x="20.060436" y="152.68227" stop-color="#000000" text-align="center" style="line-height:normal;text-decoration-color:#000000" xml:space="preserve"><tspan x="20.060436" y="152.68227" stroke-width=".26458">7</tspan></text>

    <text id="Ord8Text" transform="matrix(1.7535 0 0 1.7535 7.6171 -202.32)" x="20.060436" y="157.6833" stop-color="#000000" text-align="center" style="line-height:normal;text-decoration-color:#000000" xml:space="preserve"><tspan x="20.060436" y="157.6833" stroke-width=".26458">8</tspan></text>

    <text id="Ord9Text" transform="matrix(1.7535 0 0 1.7535 7.6147 -202.32)" x="20.060436" y="162.68434" stop-color="#000000" text-align="center" style="line-height:normal;text-decoration-color:#000000" xml:space="preserve"><tspan x="20.060436" y="162.68434" stroke-width=".26458">9</tspan></text>

    <text id="Ord10Text" transform="matrix(1.7535 0 0 1.7535 7.4576 -202.32)" x="20.060436" y="167.68538" stop-color="#000000" text-align="center" style="line-height:normal;text-decoration-color:#000000" xml:space="preserve"><tspan x="20.060436" y="167.68538" stroke-width=".26458">10</tspan></text>

    <text id="Ord11Text" transform="matrix(1.7535 0 0 1.7535 7.7935 -202.32)" x="20.060436" y="172.68642" stop-color="#000000" text-align="center" style="line-height:normal;text-decoration-color:#000000" xml:space="preserve"><tspan x="20.060436" y="172.68642" stroke-width=".26458">11</tspan></text>

    <text id="Ord12Text" transform="matrix(1.7535 0 0 1.7535 7.4697 -202.32)" x="20.060436" y="177.68745" stop-color="#000000" text-align="center" style="line-height:normal;text-decoration-color:#000000" xml:space="preserve"><tspan x="20.060436" y="177.68745" stroke-width=".26458">12</tspan></text>

    <text id="Ord13Text" transform="matrix(1.7535 0 0 1.7535 7.4516 -202.32)" x="20.060436" y="182.68849" stop-color="#000000" text-align="center" style="line-height:normal;text-decoration-color:#000000" xml:space="preserve"><tspan x="20.060436" y="182.68849" stroke-width=".26458">13</tspan></text>

    <text id="Ord14Text" transform="matrix(1.7535 0 0 1.7535 7.4588 -202.32)" x="20.060436" y="187.68953" stop-color="#000000" text-align="center" style="line-height:normal;text-decoration-color:#000000" xml:space="preserve"><tspan x="20.060436" y="187.68953" stroke-width=".26458">14</tspan></text>

    <text id="Ord15Text" transform="matrix(1.7535 0 0 1.7535 7.4383 -202.32)" x="20.060436" y="192.69057" stop-color="#000000" text-align="center" style="line-height:normal;text-decoration-color:#000000" xml:space="preserve"><tspan x="20.060436" y="192.69057" stroke-width=".26458">15</tspan></text>

    <text id="Ord16Text" transform="matrix(1.7535 0 0 1.7535 7.4528 -202.32)" x="20.060436" y="197.6916" stop-color="#000000" text-align="center" style="line-height:normal;text-decoration-color:#000000" xml:space="preserve"><tspan x="20.060436" y="197.6916" stroke-width=".26458">16</tspan></text>

    <text id="Ord17Text" transform="matrix(1.7535 0 0 1.7535 7.4516 -202.32)" x="20.060436" y="202.69263" stop-color="#000000" text-align="center" style="line-height:normal;text-decoration-color:#000000" xml:space="preserve"><tspan x="20.060436" y="202.69263" stroke-width=".26458">17</tspan></text>

    <text id="Ord18Text" transform="matrix(1.7535 0 0 1.7535 7.4479 -202.32)" x="20.060436" y="207.69366" stop-color="#000000" text-align="center" style="line-height:normal;text-decoration-color:#000000" xml:space="preserve"><tspan x="20.060436" y="207.69366" stroke-width=".26458">18</tspan></text>

    <text id="Ord19Text" transform="matrix(1.7535 0 0 1.7535 7.4479 -202.32)" x="20.060436" y="212.6947" stop-color="#000000" text-align="center" style="line-height:normal;text-decoration-color:#000000" xml:space="preserve"><tspan x="20.060436" y="212.6947" stroke-width=".26458">19</tspan></text>

    <text id="Ord20Text" transform="matrix(1.7535 0 0 1.7535 7.6523 -202.32)" x="20.060436" y="217.69574" stop-color="#000000" text-align="center" style="line-height:normal;text-decoration-color:#000000" xml:space="preserve"><tspan x="20.060436" y="217.69574" stroke-width=".26458">20</tspan></text>

    <text id="Ord21Text" transform="matrix(1.7535 0 0 1.7535 7.7935 -202.32)" x="20.060436" y="222.69678" stop-color="#000000" text-align="center" style="line-height:normal;text-decoration-color:#000000" xml:space="preserve"><tspan x="20.060436" y="222.69678" stroke-width=".26458">1</tspan></text>

    <text id="Ord22Text" transform="matrix(1.7535 0 0 1.7535 7.6644 -202.32)" x="20.060436" y="227.69781" stop-color="#000000" text-align="center" style="line-height:normal;text-decoration-color:#000000" xml:space="preserve"><tspan x="20.060436" y="227.69781" stroke-width=".26458">2</tspan></text>

    <text id="Ord23Text" transform="matrix(1.7535 0 0 1.7535 7.6171 -202.32)" x="20.060436" y="232.69885" stop-color="#000000" text-align="center" style="line-height:normal;text-decoration-color:#000000" xml:space="preserve"><tspan x="20.060436" y="232.69885" stroke-width=".26458">3</tspan></text>

    <text id="Ord24Text" transform="matrix(1.7535 0 0 1.7535 7.6968 -202.32)" x="20.060436" y="237.69989" stop-color="#000000" text-align="center" style="line-height:normal;text-decoration-color:#000000" xml:space="preserve"><tspan x="20.060436" y="237.69989" stroke-width=".26458">4</tspan></text>

    <text id="Ord25Text" transform="matrix(1.7535 0 0 1.7535 7.605 -202.32)" x="20.060436" y="242.70093" stop-color="#000000" text-align="center" style="line-height:normal;text-decoration-color:#000000" xml:space="preserve"><tspan x="20.060436" y="242.70093" stroke-width=".26458">5</tspan></text>

    <text id="Ord26Text" transform="matrix(1.7535 0 0 1.7535 7.6292 -202.32)" x="20.060436" y="247.70197" stop-color="#000000" text-align="center" style="line-height:normal;text-decoration-color:#000000" xml:space="preserve"><tspan x="20.060436" y="247.70197" stroke-width=".26458">6</tspan></text>

    <text id="Ord27Text" transform="matrix(1.7535 0 0 1.7535 7.6038 -202.32)" x="20.060436" y="252.703" stop-color="#000000" text-align="center" style="line-height:normal;text-decoration-color:#000000" xml:space="preserve"><tspan x="20.060436" y="252.703" stroke-width=".26458">7</tspan></text>

    <text id="Ord28Text" transform="matrix(1.7535 0 0 1.7535 7.6171 -202.32)" x="20.060436" y="257.70404" stop-color="#000000" text-align="center" style="line-height:normal;text-decoration-color:#000000" xml:space="preserve"><tspan x="20.060436" y="257.70404" stroke-width=".26458">8</tspan></text>

    <text id="Ord29Text" transform="matrix(1.7535 0 0 1.7535 7.6147 -202.32)" x="20.060436" y="262.70508" stop-color="#000000" text-align="center" style="line-height:normal;text-decoration-color:#000000" xml:space="preserve"><tspan x="20.060436" y="262.70508" stroke-width=".26458">9</tspan></text>

    <text id="Ord30Text" transform="matrix(1.7535 0 0 1.7535 7.4576 -202.32)" x="20.060436" y="267.70612" stop-color="#000000" text-align="center" style="line-height:normal;text-decoration-color:#000000" xml:space="preserve"><tspan x="20.060436" y="267.70612" stroke-width=".26458">10</tspan></text>

    <text id="Ord31Text" transform="matrix(1.7535 0 0 1.7535 7.7935 -202.32)" x="20.060436" y="272.70715" stop-color="#000000" text-align="center" style="line-height:normal;text-decoration-color:#000000" xml:space="preserve"><tspan x="20.060436" y="272.70715" stroke-width=".26458">11</tspan></text>

    <text id="Ord32Text" transform="matrix(1.7535 0 0 1.7535 7.4697 -202.32)" x="20.060436" y="277.70819" stop-color="#000000" text-align="center" style="line-height:normal;text-decoration-color:#000000" xml:space="preserve"><tspan x="20.060436" y="277.70819" stroke-width=".26458">12</tspan></text>

  </g><path d="m129.53 31.584v169" fill="none" opacity=".5" stop-color="#000000" stroke="#04a" stroke-width="2.2343"/>
</svg>

POC2_V2

Strangely this new file is rendering with no text at all

Thanks for all your help!

arklumpus commented 1 year ago

Hi! So, there were three issues that were causing the mis-alignment of the 1 and 11:

All of these should be fixed in VectSharp.SVG 1.8.2-a6 and VectSharp 2.5.0-a1 (you will need to update both NuGet packages).

VectSharp 2.5.0-a1 also has two new font library classes:

I think this is the closest we'll get to a "system fonts" library (at least for now)... The problem is that while on Windows the system fonts are always in the same folder, on other OSs there may be multiple folders, and it would take a lot of guesswork to figure out where they are (Environment.GetFolderPath(Environment.SpecialFolder.Fonts) is not reliable). Furthermore, VectSharp only supports TrueType fonts, so if someone has incompatible OpenType fonts, these will not work. This is why (in general) I advocate shipping fonts with the app and/or only using the standard fonts.

For the page size issue, I have made a small change, allowing other types of units other than px to be parsed correctly. If you want the page to have the same size in Inkscape as in the finished PDF file without having to scale it, you should go in the document properties in Inkscape, and make sure that the units are expressed in pt (for an A4 sheet of paper, these should be ~595x842pt). This will allow you to remove the scaling bit in the code (as the Page size is now expressed in the same unit as the units of a PDF file).

Finally, the problem with the second file was that the font family attribute was set in a parent g object, rather than on the text objects themselves, and this was not propagated. This is also solved in the latest version.

So, in short:

I hope I got everything, please let me know if you have other issues!

johnHastings772 commented 1 year ago

Hats off, everything is working flawlessly!

I only have one question left: Do you accept donations?

arklumpus commented 1 year ago

Glad to hear that it worked! Let me know if you have any other issues.

Thank you for the thought, I had actually never considered it... I need to figure out if I can do this legally!