SvgRandomArt.vb
C# VB
'''' This code is part of Document Solutions for PDF .NET demos.'' Copyright (c) MESCIUS inc. All rights reserved.''Imports SystemImports System.IOImports System.DrawingImports System.LinqImports System.Collections.GenericImports GrapeCity.Documents.PdfImports GrapeCity.Documents.SvgImports GCDRAW = GrapeCity.Documents.Drawing
'' This sample generates some random abstract art using the SVG path API'' provided by GcSvgDocument.Public Class SvgRandomArt Private _rnd As Random = Util.NewRandom()
Function CreatePDF(ByVal stream As Stream) As Integer Using svgDoc = New GcSvgDocument() Dim svg = svgDoc.RootSvg svg.ViewBox = New SvgViewBox(0, 0, 100, 100)
'' Random art: Dim i = 0 Do While i < _rnd.Next(6, 12) AddFigure(svg, _rnd) i += 1 Loop
'' Border: svg.Children.Add(New SvgRectElement() With { .Width = New SvgLength(100), .Height = New SvgLength(100), .Stroke = New SvgPaint(Color.FromArgb(_rnd.Next(256), _rnd.Next(256), _rnd.Next(256))), .Fill = SvgPaint.None }) '' Clip: svg.Clip = New SvgClip(New SvgLength(0), New SvgLength(0), New SvgLength(100), New SvgLength(100))
'' Render the SVG image to a PDF: Dim doc = New GcPdfDocument() Dim page = doc.NewPage() Dim g = page.Graphics Dim s = svgDoc.GetIntrinsicSize(SvgLengthUnits.Points)
Dim margin = 72 Dim rect = New RectangleF(margin, margin, page.Size.Width - margin * 2, page.Size.Width - margin * 2) g.DrawSvg(svgDoc, rect)
'' Done: doc.Save(stream) Return doc.Pages.Count End Using End Function
Function Next100() As Integer Return _rnd.Next(100) End Function
Sub AddFigure(ByVal svg As SvgSvgElement, ByVal rnd As Random) Dim pb = New SvgPathBuilder() Dim startX = Next100() Dim startY = Next100() pb.AddMoveTo(False, startX, startY) Dim i = 0 Do While i < rnd.Next(20, 80) AddCurve(pb, rnd) i += 1 Loop pb.AddCurveTo(False, Next100(), Next100(), Next100(), Next100(), startX, startY)
svg.Children.Add(New SvgPathElement() With { .FillRule = SvgFillRule.EvenOdd, .Fill = New SvgPaint(Color.FromArgb(rnd.Next(256), rnd.Next(256), rnd.Next(256))), .Stroke = New SvgPaint(Color.FromArgb(rnd.Next(256), rnd.Next(256), rnd.Next(256))), .StrokeWidth = New SvgLength(rnd.Next(20) / 10.0F, SvgLengthUnits.Percentage), .PathData = pb.ToPathData(), .FillOpacity = Next100() / 100.0F, .StrokeOpacity = Next100() / 100.0F }) End Sub
Sub AddCurve(ByVal pb As SvgPathBuilder, ByVal rnd As Random) Select Case rnd.Next(5) Case 0 pb.AddCurveTo(False, Next100(), Next100(), Next100(), Next100(), Next100(), Next100()) Case 1 pb.AddSmoothCurveTo(False, Next100(), Next100(), Next100(), Next100()) Case 2 pb.AddQuadraticBezierCurveTo(False, Next100(), Next100(), Next100(), Next100()) Case 3 pb.AddSmoothQuadraticBezierCurveTo(False, Next100(), Next100()) Case 4 pb.AddEllipticalArc(False, Next100(), Next100(), rnd.Next(360), If(rnd.Next(2) = 0, GCDRAW.ArcSize.Small, GCDRAW.ArcSize.Large), If(rnd.Next(2) = 0, GCDRAW.SweepDirection.Clockwise, GCDRAW.SweepDirection.CounterClockwise), Next100(), Next100()) End Select End SubEnd Class