VintaSoft Imaging .NET SDK 15.1: Documentation for .NET developer
In This Topic
PDF: Drawing graphics on PDF page
In This Topic
PdfGraphics class, similar to System.Drawing.Graphics class, is intended for drawing graphics on PDF page, annotation or form.

PdfGraphics class provides the ability to draw graphic primitives (line, rectangle, image, text) on PDF page, annotation or form. Also PdfGraphics class provides the ability to draw PDF page, annotation or form on another PDF page, annotation or form.

The process of drawing using PdfGraphics class consists form the following steps:

Drawing using graphic primitives might take long time, if it is needed to draw lots of graphics. Because of that the SDK includes an hierarchy of graphic figures, which allows significantly simplify and speed up the drawing process.

IMPORTANT! The coordinates and sizes, which are used while drawing graphics on PDF page, are specified in measurement unitsand coordinate system of PDF page. For detailed information about measurement units and coordinate system of PDF page goto here.


Draw graphic primitives on PDF page, annotation or form

PdfGraphics class can draw the following primitives:
For drawing a line is used a pen - PdfPen class. For filling a surface is used a brush - PdfBrush class. For defining a line cap is used PdfLineCap class.

The SDK contains PDF Drawing Demo application, which demonstrates how to perform drawing on PDF page using graphic primitives. Source codes of the PDF Drawing Demo application are available in C# and VB.NET.

Here is C#/VB.NET code that demonstrates how to draw some graphic primitives on PDF page:
public static void TestPDFGraphics(string pdfFileName)
{
    // create new PDF document
    Vintasoft.Imaging.Pdf.PdfDocument document = 
        new Vintasoft.Imaging.Pdf.PdfDocument();
    // add new page
    document.Pages.Add(new System.Drawing.SizeF(1000, 1000));
    // get graphics object associated with page
    using (Vintasoft.Imaging.Pdf.Drawing.PdfGraphics graphics = document.Pages[0].GetGraphics())
    {
        // draw primitives
        Vintasoft.Imaging.Pdf.Drawing.PdfPen pen = 
            new Vintasoft.Imaging.Pdf.Drawing.PdfPen(System.Drawing.Color.Red);
        pen.Width = 3;
        Vintasoft.Imaging.Pdf.Drawing.PdfBrush brush = 
            new Vintasoft.Imaging.Pdf.Drawing.PdfBrush(System.Drawing.Color.Green);
        graphics.DrawLine(pen, 0, 0, 50, 150);
        graphics.DrawCurve(pen, 50, 150, 100, 200, 200, 20, 300, 150);
        pen.Color = System.Drawing.Color.Blue;
        graphics.DrawEllipse(pen, 400, 400, 200, 300);
        graphics.FillEllipse(brush, 500, 500, 70, 150);
        brush.Color = System.Drawing.Color.FromArgb(127, System.Drawing.Color.Red);
        graphics.FillRectangle(brush, 450, 550, 300, 300);
        pen.Width = 10;
        graphics.DrawRectangle(pen, 0, 0, 1000, 1000);

        // draw vector string
        brush.Color = System.Drawing.Color.Green;
        Vintasoft.Imaging.Drawing.IDrawingFont font = Vintasoft.Imaging.Drawing.DrawingFactory.Default.CreateGenericSansSerifFont(30);
        graphics.DrawString("Vector string", font, brush, new System.Drawing.PointF(100, 500));
        Vintasoft.Imaging.Pdf.Tree.Fonts.PdfFont pdfFont = document.FontManager.GetStandardFont(
            Vintasoft.Imaging.Pdf.Tree.Fonts.PdfStandardFontType.TimesRoman);
        // draw text string
        graphics.DrawString("Text string", pdfFont, 30, brush, new System.Drawing.PointF(100, 600));
    }

    // get graphics object associated with page
    using (Vintasoft.Imaging.Pdf.Drawing.PdfGraphics graphics = document.Pages[0].GetGraphics())
    {
        // draw rendered page image (500x500 pixels) onto page
        using (Vintasoft.Imaging.VintasoftImage img = document.Pages[0].Render(500, 500))
            graphics.DrawImage(img, new System.Drawing.RectangleF(600, 0, 300, 300));
    }

    // save document
    document.SaveChanges(pdfFileName);

    // close document
    document.Dispose();
}
Public Shared Sub TestPDFGraphics(pdfFileName As String)
    ' create new PDF document
    Dim document As New Vintasoft.Imaging.Pdf.PdfDocument()
    ' add new page
    document.Pages.Add(New System.Drawing.SizeF(1000, 1000))
    ' get graphics object associated with page
    Using graphics As Vintasoft.Imaging.Pdf.Drawing.PdfGraphics = document.Pages(0).GetGraphics()
        ' draw primitives
        Dim pen As New Vintasoft.Imaging.Pdf.Drawing.PdfPen(System.Drawing.Color.Red)
        pen.Width = 3
        Dim brush As New Vintasoft.Imaging.Pdf.Drawing.PdfBrush(System.Drawing.Color.Green)
        graphics.DrawLine(pen, 0, 0, 50, 150)
        graphics.DrawCurve(pen, 50, 150, 100, 200, 200, _
            20, 300, 150)
        pen.Color = System.Drawing.Color.Blue
        graphics.DrawEllipse(pen, 400, 400, 200, 300)
        graphics.FillEllipse(brush, 500, 500, 70, 150)
        brush.Color = System.Drawing.Color.FromArgb(127, System.Drawing.Color.Red)
        graphics.FillRectangle(brush, 450, 550, 300, 300)
        pen.Width = 10
        graphics.DrawRectangle(pen, 0, 0, 1000, 1000)

        ' draw vector string
        brush.Color = System.Drawing.Color.Green
        Dim font As Vintasoft.Imaging.Drawing.IDrawingFont = Vintasoft.Imaging.Drawing.DrawingFactory.[Default].CreateGenericSansSerifFont(30)
        graphics.DrawString("Vector string", font, brush, New System.Drawing.PointF(100, 500))
        Dim pdfFont As Vintasoft.Imaging.Pdf.Tree.Fonts.PdfFont = document.FontManager.GetStandardFont(Vintasoft.Imaging.Pdf.Tree.Fonts.PdfStandardFontType.TimesRoman)
        ' draw text string
        graphics.DrawString("Text string", pdfFont, 30, brush, New System.Drawing.PointF(100, 600))
    End Using

    ' get graphics object associated with page
    Using graphics As Vintasoft.Imaging.Pdf.Drawing.PdfGraphics = document.Pages(0).GetGraphics()
        ' draw rendered page image (500x500 pixels) onto page
        Using img As Vintasoft.Imaging.VintasoftImage = document.Pages(0).Render(500, 500)
            graphics.DrawImage(img, New System.Drawing.RectangleF(600, 0, 300, 300))
        End Using
    End Using

    ' save document
    document.SaveChanges(pdfFileName)

    ' close document
    document.Dispose()
End Sub


Here is C#/VB.NET code that demonstrates how to draw some graphic primitives without rotation on rotated PDF page:
public static void TestPdfGraphicsOnRotatedPage(string pdfFileName)
{
    // create new PDF document
    Vintasoft.Imaging.Pdf.PdfDocument document =
        new Vintasoft.Imaging.Pdf.PdfDocument();
    // add new page
    Vintasoft.Imaging.Pdf.Tree.PdfPage page = new Vintasoft.Imaging.Pdf.Tree.PdfPage(document, new System.Drawing.RectangleF(0, 0, 1000, 1000));
    document.Pages.Add(page);
    
    // create rotate command
    Vintasoft.Imaging.Pdf.Processing.PdfPageRotateOrthogonallyCommand rotateCommand = 
        new Vintasoft.Imaging.Pdf.Processing.PdfPageRotateOrthogonallyCommand(90);
    // execute command
    rotateCommand.Execute(page);
    
    // get page transform
    Vintasoft.Imaging.AffineMatrix transform = page.GetPageRotateCropAffineTransform();
    // invert page transform
    transform.Invert();

    // get graphics object associated with page
    using (Vintasoft.Imaging.Pdf.Drawing.PdfGraphics graphics = document.Pages[0].GetGraphics())
    {
        // apply inverted transform to ignore page rotation while drawing
        graphics.MultiplyTransform(transform);
        
        // draw primitives
        Vintasoft.Imaging.Pdf.Drawing.PdfPen pen =
            new Vintasoft.Imaging.Pdf.Drawing.PdfPen(System.Drawing.Color.Red);
        pen.Width = 3;
        Vintasoft.Imaging.Pdf.Drawing.PdfBrush brush =
            new Vintasoft.Imaging.Pdf.Drawing.PdfBrush(System.Drawing.Color.Green);
        graphics.DrawLine(pen, 0, 0, 50, 150);
        graphics.DrawCurve(pen, 50, 150, 100, 200, 200, 20, 300, 150);
        pen.Color = System.Drawing.Color.Blue;
        graphics.DrawEllipse(pen, 400, 400, 200, 300);
        graphics.FillEllipse(brush, 500, 500, 70, 150);
        brush.Color = System.Drawing.Color.FromArgb(127, System.Drawing.Color.Red);
        graphics.FillRectangle(brush, 450, 550, 300, 300);
        pen.Width = 10;
        graphics.DrawRectangle(pen, 0, 0, 1000, 1000);

        // draw vector string
        brush.Color = System.Drawing.Color.Green;
        Vintasoft.Imaging.Drawing.IDrawingFont font = Vintasoft.Imaging.Drawing.DrawingFactory.Default.CreateGenericSansSerifFont(30);
        graphics.DrawString("Vector string", font, brush, new System.Drawing.PointF(100, 500));
        Vintasoft.Imaging.Pdf.Tree.Fonts.PdfFont pdfFont = document.FontManager.GetStandardFont(
            Vintasoft.Imaging.Pdf.Tree.Fonts.PdfStandardFontType.TimesRoman);
        // draw text string
        graphics.DrawString("Text string", pdfFont, 30, brush, new System.Drawing.PointF(100, 600));
    }

    // get graphics object associated with page
    using (Vintasoft.Imaging.Pdf.Drawing.PdfGraphics graphics = document.Pages[0].GetGraphics())
    {
        // apply inverted transform to ignore page rotation while drawing
        graphics.MultiplyTransform(transform);

        // draw rendered page image (500x500 pixels) onto page
        using (Vintasoft.Imaging.VintasoftImage img = document.Pages[0].Render(500, 500))
            graphics.DrawImage(img, new System.Drawing.RectangleF(600, 0, 300, 300));
    }

    // save document
    document.SaveChanges(pdfFileName);

    // close document
    document.Dispose();
}
Public Shared Sub TestPdfGraphicsOnRotatedPage(pdfFileName As String)
    ' create new PDF document
    Dim document As New Vintasoft.Imaging.Pdf.PdfDocument()
    ' add new page
    Dim page As New Vintasoft.Imaging.Pdf.Tree.PdfPage(document, New System.Drawing.RectangleF(0, 0, 1000, 1000))
    document.Pages.Add(page)

    ' create rotate command
    Dim rotateCommand As New Vintasoft.Imaging.Pdf.Processing.PdfPageRotateOrthogonallyCommand(90)
    ' execute command
    rotateCommand.Execute(page)

    ' get page transform
    Dim transform As Vintasoft.Imaging.AffineMatrix = page.GetPageRotateCropAffineTransform()
    ' invert page transform
    transform.Invert()

    ' get graphics object associated with page
    Using graphics As Vintasoft.Imaging.Pdf.Drawing.PdfGraphics = document.Pages(0).GetGraphics()
        ' apply inverted transform to ignore page rotation while drawing
        graphics.MultiplyTransform(transform)

        ' draw primitives
        Dim pen As New Vintasoft.Imaging.Pdf.Drawing.PdfPen(System.Drawing.Color.Red)
        pen.Width = 3
        Dim brush As New Vintasoft.Imaging.Pdf.Drawing.PdfBrush(System.Drawing.Color.Green)
        graphics.DrawLine(pen, 0, 0, 50, 150)
        graphics.DrawCurve(pen, 50, 150, 100, 200, 200, _
            20, 300, 150)
        pen.Color = System.Drawing.Color.Blue
        graphics.DrawEllipse(pen, 400, 400, 200, 300)
        graphics.FillEllipse(brush, 500, 500, 70, 150)
        brush.Color = System.Drawing.Color.FromArgb(127, System.Drawing.Color.Red)
        graphics.FillRectangle(brush, 450, 550, 300, 300)
        pen.Width = 10
        graphics.DrawRectangle(pen, 0, 0, 1000, 1000)

        ' draw vector string
        brush.Color = System.Drawing.Color.Green
        Dim font As Vintasoft.Imaging.Drawing.IDrawingFont = Vintasoft.Imaging.Drawing.DrawingFactory.[Default].CreateGenericSansSerifFont(30)
        graphics.DrawString("Vector string", font, brush, New System.Drawing.PointF(100, 500))
        Dim pdfFont As Vintasoft.Imaging.Pdf.Tree.Fonts.PdfFont = document.FontManager.GetStandardFont(Vintasoft.Imaging.Pdf.Tree.Fonts.PdfStandardFontType.TimesRoman)
        ' draw text string
        graphics.DrawString("Text string", pdfFont, 30, brush, New System.Drawing.PointF(100, 600))
    End Using

    ' get graphics object associated with page
    Using graphics As Vintasoft.Imaging.Pdf.Drawing.PdfGraphics = document.Pages(0).GetGraphics()
        ' apply inverted transform to ignore page rotation while drawing
        graphics.MultiplyTransform(transform)

        ' draw rendered page image (500x500 pixels) onto page
        Using img As Vintasoft.Imaging.VintasoftImage = document.Pages(0).Render(500, 500)
            graphics.DrawImage(img, New System.Drawing.RectangleF(600, 0, 300, 300))
        End Using
    End Using

    ' save document
    document.SaveChanges(pdfFileName)

    ' close document
    document.Dispose()
End Sub



Draw graphic figures on PDF page

Graphic figure - is a graphic object, that can be drawn using graphic primitives or other graphic figures. GraphicsFigure class is the base class for all graphic figures.

Here is a list of graphic figures implemented in the SDK:
The figures implementing IAutoSizeGraphicsFigure interface can calculate their size automatically when changes the size of panel in which the figure is located.

Hierarchy of graphic figures is open and allows to create new or customize existing figures.

The SDK contains PDF Drawing Demo application, which demonstrates how to perform drawing on PDF page using graphic figures. Source codes of the PDF Drawing Demo application are available in C# and VB.NET.

Here is C#/VB.NET code that demonstrates how to draw some graphic figures on PDF page:
public static void CreatePdfDocument(string pdfFilename, string imageFilename)
{
    // create PDF document
    using (Vintasoft.Imaging.Pdf.PdfDocument document = 
        new Vintasoft.Imaging.Pdf.PdfDocument(pdfFilename, Vintasoft.Imaging.Pdf.PdfFormat.Pdf_14))
    {
        // open image
        using (Vintasoft.Imaging.VintasoftImage image = new Vintasoft.Imaging.VintasoftImage(imageFilename))
        {
            // add new page to PDF document
            Vintasoft.Imaging.Pdf.Tree.PdfPage page = document.Pages.Add(
                Vintasoft.Imaging.PaperSizeKind.A4);
            // add image resource to PDF document
            Vintasoft.Imaging.Pdf.Tree.PdfImageResource imageResource = 
                new Vintasoft.Imaging.Pdf.Tree.PdfImageResource(
                    document, image, Vintasoft.Imaging.Pdf.PdfCompression.Auto);

            // create layout panel
            Vintasoft.Imaging.Pdf.Drawing.GraphicsFigures.AlignmentPanel rootLayout = 
                new Vintasoft.Imaging.Pdf.Drawing.GraphicsFigures.AlignmentPanel();
            rootLayout.Location = page.MediaBox.Location;
            rootLayout.Size = page.MediaBox.Size;
            // set layout panel margin (5 mm)
            double margin = Vintasoft.Imaging.Utils.UnitOfMeasureConverter.ConvertToPoints(
                5, Vintasoft.Imaging.UnitOfMeasure.Millimeters);
            rootLayout.Margin = new Vintasoft.Imaging.Pdf.Drawing.PdfContentPadding(margin);

            // create image figure
            Vintasoft.Imaging.Pdf.Drawing.GraphicsFigures.ImageFigure imageFigure = 
                new Vintasoft.Imaging.Pdf.Drawing.GraphicsFigures.ImageFigure(imageResource);
            // maintain aspect ratio of image
            imageFigure.MaintainAspectRatio = true;
            // add image figure to layout panel
            rootLayout.Add(imageFigure);

            // draw figures on graphics of PDF page
            using (Vintasoft.Imaging.Pdf.Drawing.PdfGraphics g = page.GetGraphics())
                rootLayout.Draw(g);

            // save document changes
            document.SaveChanges();
        }
    }
}
Public Shared Sub CreatePdfDocument(pdfFilename As String, imageFilename As String)
    ' create PDF document
    Using document As New Vintasoft.Imaging.Pdf.PdfDocument(pdfFilename, Vintasoft.Imaging.Pdf.PdfFormat.Pdf_14)
        ' open image
        Using image As New Vintasoft.Imaging.VintasoftImage(imageFilename)
            ' add new page to PDF document
            Dim page As Vintasoft.Imaging.Pdf.Tree.PdfPage = document.Pages.Add(Vintasoft.Imaging.PaperSizeKind.A4)
            ' add image resource to PDF document
            Dim imageResource As New Vintasoft.Imaging.Pdf.Tree.PdfImageResource(document, image, Vintasoft.Imaging.Pdf.PdfCompression.Auto)

            ' create layout panel
            Dim rootLayout As New Vintasoft.Imaging.Pdf.Drawing.GraphicsFigures.AlignmentPanel()
            rootLayout.Location = page.MediaBox.Location
            rootLayout.Size = page.MediaBox.Size
            ' set layout panel margin (5 mm)
            Dim margin As Double = Vintasoft.Imaging.Utils.UnitOfMeasureConverter.ConvertToPoints(5, Vintasoft.Imaging.UnitOfMeasure.Millimeters)
            rootLayout.Margin = New Vintasoft.Imaging.Pdf.Drawing.PdfContentPadding(margin)

            ' create image figure
            Dim imageFigure As New Vintasoft.Imaging.Pdf.Drawing.GraphicsFigures.ImageFigure(imageResource)
            ' maintain aspect ratio of image
            imageFigure.MaintainAspectRatio = True
            ' add image figure to layout panel
            rootLayout.Add(imageFigure)

            ' draw figures on graphics of PDF page
            Using g As Vintasoft.Imaging.Pdf.Drawing.PdfGraphics = page.GetGraphics()
                rootLayout.Draw(g)
            End Using

            ' save document changes
            document.SaveChanges()
        End Using
    End Using
End Sub