SvgGraphicsText.cs
C# VB
//// This code is part of Document Solutions for Imaging demos.// Copyright (c) MESCIUS inc. All rights reserved.//using System;using System.IO;using System.Drawing;using GrapeCity.Documents.Svg;using GrapeCity.Documents.Text;using GrapeCity.Documents.Drawing;using GCTEXT = GrapeCity.Documents.Text;
namespace DsImagingWeb.Demos{ // This sample demonstrates drawing text on an SVG using GcSvgGraphics. // It shows how to render text as true SVG <text> elements (rather than paths), // so that the text remains searchable, selectable, and copyable. // The demo draws rounded rectangles in two ways: using the dedicated // DrawRoundRect/FillRoundRect methods, and by constructing a custom // graphics path. Labels are added inside the shapes using DrawString, // and the result is saved as an SVG document. // See also RoundRectangle and SvgGraphicsRoundRectangle samples. public class SvgGraphicsText { public string DefaultMime { get => Common.Util.MimeTypes.SVG; }
public Stream GenerateImageStream(string targetMime, Size pixelSize, float dpi, bool opaque, string[] sampleParams = null) { if (targetMime != Common.Util.MimeTypes.SVG) throw new Exception("This sample only supports SVG output format.");
var Inch = dpi; var ms = new MemoryStream(); using var g = new GcSvgGraphics(pixelSize.Width, pixelSize.Height);
// IMPORTANT: this property is true by default on GcSvgGraphics, which usually yields better text fidelity, // but text cannot be searched/selected/copied in this case, and the SVG file size is larger. // Setting this property to false results in text rendered using SVG 'text' elements, so that // text can be searched/selected/copied. Compare to the SvgGraphicsRoundRectangle example // which is identical to this example but draws text as paths: g.DrawTextAsPath = false;
if (opaque) g.FillRectangle(new RectangleF(0, 0, g.Width, g.Height), Color.White);
var rc = Common.Util.AddNote( "GcGraphics has dedicated methods to easily draw and fill rectangles with rounded corners. " + "This sample also shows how the same result may be achieved using graphics paths. " + "While they are not really needed for drawing round rectangles, graphics paths allow " + "to draw and fill arbitrary figures with complex geometries.\r\n\r\n" + "Note that this version of the \"Round Rectangles\" sample draws on a GcSvgGraphics, " + "and produces a vector SVG image rather than a raster image (JPEG, PNG etc.).", g);
// Rounded rectangle's radii: float rx = 36, ry = 24;
// Using dedicated methods to draw and fill round rectangles: var rEasy = new RectangleF(rc.Left, rc.Bottom + Inch / 2, Inch * 2, Inch); g.FillRoundRect(rEasy, rx, ry, Color.PaleGreen); g.DrawRoundRect(rEasy, rx, ry, Color.Blue, 4); // Add a label: var tf = new TextFormat() { Font = GCTEXT.Font.FromFile(Path.Combine("Resources", "Fonts", "FreeSerif.ttf")), FontSize = Inch / 6 }; g.DrawString("The easy way.", tf, rEasy, TextAlignment.Center, ParagraphAlignment.Center, false);
// Using graphics path to achieve the same result: var rHard = rEasy; rHard.Offset(0, rEasy.Height + Inch / 2); var path = MakeRoundRect(g, rHard, rx, ry); g.FillPath(path, Color.PaleVioletRed); g.DrawPath(path, Color.Purple, 4); // Add a label: g.DrawString("The hard way.", tf, rHard, TextAlignment.Center, ParagraphAlignment.Center, false);
// Done: var svg = g.ToSvgDocument(); svg.Save(ms); ms.Seek(0, SeekOrigin.Begin); return ms; }
// This method shows how to create a graphics path that may be used // to fill or draw arbitrary shapes on a GcGraphics. private IPath MakeRoundRect(GcGraphics g, RectangleF rc, float rx, float ry) { var path = g.CreatePath(); var sz = new SizeF(rx, ry); // start from horizontal top left path.BeginFigure(new PointF(rc.Left + rx, rc.Top)); path.AddLine(new PointF(rc.Right - rx, rc.Top)); path.AddArc(new ArcSegment() { Point = new PointF(rc.Right, rc.Top + ry), SweepDirection = SweepDirection.Clockwise, Size = sz }); path.AddLine(new PointF(rc.Right, rc.Bottom - ry)); path.AddArc(new ArcSegment() { Point = new PointF(rc.Right - rx, rc.Bottom), SweepDirection = SweepDirection.Clockwise, Size = sz }); path.AddLine(new PointF(rc.Left + rx, rc.Bottom)); path.AddArc(new ArcSegment() { Point = new PointF(rc.Left, rc.Bottom - ry), SweepDirection = SweepDirection.Clockwise, Size = sz }); path.AddLine(new PointF(rc.Left, rc.Top + ry)); path.AddArc(new ArcSegment() { Point = new PointF(rc.Left + rx, rc.Top), SweepDirection = SweepDirection.Clockwise, Size = sz }); path.EndFigure(FigureEnd.Closed); return path; } }}