Add shapes to PDF files in C# and VB.NET

A PDF shape, also known as a path, is a geometrical content of one or more subpaths composed of lines and curves.

With GemBox.Pdf, you can get, create, or edit shapes (paths) in your C# or VB.NET application. It supports commonly used shapes in PDF: Rectangle, Line, Circle, Ellipse, Arc, and Bezier curve.

When attaching a shape in PDF we can represent it by the PdfPathContent class. Then you can manipulate PdfSize, PdfPoint, and other properties for each path.

In the code snippet example below, you can see how to add various shapes to a PDF page and how to format them.

PDF shapes created with GemBox.Pdf C#/VB.NET library
Screenshot of PDF shapes (paths) created with GemBox.Pdf library
using GemBox.Pdf;
using GemBox.Pdf.Content;

class Program
{
    static void Main()
    {
        // If using Professional version, put your serial key below.
        ComponentInfo.SetLicense("FREE-LIMITED-KEY");

        using (var document = new PdfDocument())
        {
            // Add a page.
            var page = document.Pages.Add();

            // NOTE: In PDF, location (0, 0) is at the bottom-left corner of the page
            // and the positive y axis extends vertically upward.
            var pageBounds = page.CropBox;

            // Add a thick red line at the top of the page.
            var line = page.Content.Elements.AddPath();
            line.BeginSubpath(new PdfPoint(100, pageBounds.Top - 100)).
                LineTo(new PdfPoint(pageBounds.Right - 100, pageBounds.Top - 200));
            var lineFormat = line.Format;
            lineFormat.Stroke.IsApplied = true;
            lineFormat.Stroke.Width = 5;
            lineFormat.Stroke.Color = PdfColor.FromRgb(1, 0, 0);

            // Add a filled and stroked rectangle in the middle of the page.
            var rectangle = page.Content.Elements.AddPath();
            // NOTE: The start point of the rectangle is the bottom left corner of the rectangle.
            rectangle.AddRectangle(new PdfPoint(100, pageBounds.Top - 400), 
                new PdfSize(pageBounds.Width - 200, 100));
            var rectangleFormat = rectangle.Format;
            rectangleFormat.Fill.IsApplied = true;
            rectangleFormat.Fill.Color = PdfColor.FromRgb(0, 1, 0);
            rectangleFormat.Stroke.IsApplied = true;
            rectangleFormat.Stroke.Width = 10;
            rectangleFormat.Stroke.Color = PdfColor.FromRgb(0, 0, 1);

            // Add a more complex semi-transparent filled and stroked path at the bottom of the page.
            var shape = page.Content.Elements.AddPath();
            shape.BeginSubpath(new PdfPoint(100, 100)).
                BezierTo(new PdfPoint(100 + pageBounds.Width / 4, 200),
                    new PdfPoint(pageBounds.Right - 100 - pageBounds.Width / 4, 0),
                    new PdfPoint(pageBounds.Right - 100, 100)).
                LineTo(new PdfPoint(pageBounds.Right - 100, 300)).
                BezierTo(new PdfPoint(pageBounds.Right - 100 - pageBounds.Width / 4, 200),
                    new PdfPoint(100 + pageBounds.Width / 4, 400),
                    new PdfPoint(100, 300)).
                CloseSubpath();
            var shapeFormat = shape.Format;
            shapeFormat.Fill.IsApplied = true;
            shapeFormat.Fill.Color = PdfColor.FromRgb(0, 1, 0);
            shapeFormat.Fill.Opacity = 0.5;
            shapeFormat.Stroke.IsApplied = true;
            shapeFormat.Stroke.Width = 4;
            shapeFormat.Stroke.Color = PdfColor.FromRgb(0, 0, 1);
            shapeFormat.Stroke.Opacity = 0.5;
            shapeFormat.Stroke.DashPattern = PdfLineDashPatterns.DashDot;

            // Add a grid to visualize the bounds of each drawn shape.
            var grid = page.Content.Elements.AddPath();
            grid.AddRectangle(new PdfPoint(100, 100), 
                new PdfSize(pageBounds.Width - 200, pageBounds.Height - 200));
            grid.BeginSubpath(new PdfPoint(100, pageBounds.Top - 200)).
                LineTo(new PdfPoint(pageBounds.Right - 100, pageBounds.Top - 200)).
                BeginSubpath(new PdfPoint(100, pageBounds.Top - 300)).
                LineTo(new PdfPoint(pageBounds.Right - 100, pageBounds.Top - 300)).
                BeginSubpath(new PdfPoint(100, pageBounds.Top - 400)).
                LineTo(new PdfPoint(pageBounds.Right - 100, pageBounds.Top - 400)).
                BeginSubpath(new PdfPoint(100, 300)).
                LineTo(new PdfPoint(pageBounds.Right - 100, 300));
            grid.Format.Stroke.IsApplied = true;
            // A line width of 0 denotes the thinnest line that can be rendered at device resolution: 1 device pixel wide.
            grid.Format.Stroke.Width = 0;

            document.Save("Paths.%OutputFileType%");
        }
    }
}
Imports GemBox.Pdf
Imports GemBox.Pdf.Content

Module Program

    Sub Main()

        ' If using Professional version, put your serial key below.
        ComponentInfo.SetLicense("FREE-LIMITED-KEY")

        Using document = New PdfDocument()

            ' Add a page.
            Dim page = document.Pages.Add()

            ' NOTE: In PDF, location (0, 0) is at the bottom-left corner of the page
            ' and the positive y axis extends vertically upward.
            Dim pageBounds = page.CropBox

            ' Add a thick red line at the top of the page.
            Dim line = page.Content.Elements.AddPath()
            line.BeginSubpath(New PdfPoint(100, pageBounds.Top - 100)).
                LineTo(New PdfPoint(pageBounds.Right - 100, pageBounds.Top - 200))
            Dim lineFormat = line.Format
            lineFormat.Stroke.IsApplied = True
            lineFormat.Stroke.Width = 5
            lineFormat.Stroke.Color = PdfColor.FromRgb(1, 0, 0)

            ' Add a filled and stroked rectangle in the middle of the page.
            Dim rectangle = page.Content.Elements.AddPath()
            ' NOTE: The start point of the rectangle is the bottom left corner of the rectangle.
            rectangle.AddRectangle(New PdfPoint(100, pageBounds.Top - 400),
                                   New PdfSize(pageBounds.Width - 200, 100))
            Dim rectangleFormat = rectangle.Format
            rectangleFormat.Fill.IsApplied = True
            rectangleFormat.Fill.Color = PdfColor.FromRgb(0, 1, 0)
            rectangleFormat.Stroke.IsApplied = True
            rectangleFormat.Stroke.Width = 10
            rectangleFormat.Stroke.Color = PdfColor.FromRgb(0, 0, 1)

            ' Add a more complex semi-transparent filled and dashed path at the bottom of the page.
            Dim shape = page.Content.Elements.AddPath()
            shape.BeginSubpath(New PdfPoint(100, 100)).
                BezierTo(New PdfPoint(100 + pageBounds.Width / 4, 200),
                         New PdfPoint(pageBounds.Right - 100 - pageBounds.Width / 4, 0),
                         New PdfPoint(pageBounds.Right - 100, 100)).
                LineTo(New PdfPoint(pageBounds.Right - 100, 300)).
                BezierTo(New PdfPoint(pageBounds.Right - 100 - pageBounds.Width / 4, 200),
                         New PdfPoint(100 + pageBounds.Width / 4, 400),
                         New PdfPoint(100, 300)).
                CloseSubpath()
            Dim shapeFormat = shape.Format
            shapeFormat.Fill.IsApplied = True
            shapeFormat.Fill.Color = PdfColor.FromRgb(0, 1, 0)
            shapeFormat.Fill.Opacity = 0.5
            shapeFormat.Stroke.IsApplied = True
            shapeFormat.Stroke.Width = 4
            shapeFormat.Stroke.Color = PdfColor.FromRgb(0, 0, 1)
            shapeFormat.Stroke.Opacity = 0.5
            shapeFormat.Stroke.DashPattern = PdfLineDashPatterns.DashDot

            ' Add a grid to visualize the bounds of each drawn shape.
            Dim grid = page.Content.Elements.AddPath()
            grid.AddRectangle(New PdfPoint(100, 100),
                              New PdfSize(pageBounds.Width - 200, pageBounds.Height - 200))
            grid.BeginSubpath(New PdfPoint(100, pageBounds.Top - 200)).
                LineTo(New PdfPoint(pageBounds.Right - 100, pageBounds.Top - 200)).
                BeginSubpath(New PdfPoint(100, pageBounds.Top - 300)).
                LineTo(New PdfPoint(pageBounds.Right - 100, pageBounds.Top - 300)).
                BeginSubpath(New PdfPoint(100, pageBounds.Top - 400)).
                LineTo(New PdfPoint(pageBounds.Right - 100, pageBounds.Top - 400)).
                BeginSubpath(New PdfPoint(100, 300)).
                LineTo(New PdfPoint(pageBounds.Right - 100, 300))
            grid.Format.Stroke.IsApplied = True
            ' A line width of 0 denotes the thinnest line that can be rendered at device resolution: 1 device pixel wide.
            grid.Format.Stroke.Width = 0

            document.Save("Paths.%OutputFileType%")
        End Using
    End Sub
End Module

Take a time and have a look at the complete documentation to learn more about manipulating all kinds of shapes.

Want more?

Next example GitHub

Check the next example or select an example from the menu. You can also download our examples from the GitHub.


Like it?

Download Buy

If you want to try the GemBox.Pdf yourself, you can download the free version. It delivers the same performance and set of features as the professional version, but with some operations limited. To remove the limitation, you need to purchase a license.