VintaSoft Imaging .NET SDK 12.5: Документация для .NET разработчика
В этом разделе
    PDF: Рисование графики на PDF странице
    В этом разделе
    Класс PdfGraphics, аналогичный классу System.Drawing.Graphics, предназначен для рисования графики на PDF странице, аннотации или форме.


    Класс PdfGraphics предоставляет возможность рисовать графические примитивы (линию, прямоугольник, изображение, текст) на PDF странице, аннотации или форме. Также класс PdfGraphics предоставляет возможность рисовать PDF страницу, аннотацию или форму на другой PDF странице, аннотации или форме.

    Процесс рисования с помощью класса PdfGraphics состоит из следующих шагов:

    Рисование с использованием графических примитивов может занять много времени, если необходимо нарисовать много графики. Поэтому SDK включает в себя иерархию графических фигур, которая позволяет значительно упростить и ускорить процесс рисования.

    ВАЖНО! Координаты и размеры, которые используются при рисовании графики на PDF странице, задаются в единицах измерения и системе координат PDF страницы. Подробную информацию о единицах измерения и системе координат PDF страницы пожалуйста читайте здесь .


    Рисование графических примитивов на PDF странице, аннотации или форме.

    Класс PdfGraphics может рисовать следующие примитивы:
    Для рисования линии используется перо - класс PdfPen. Для заливки поверхности используется кисть - класс PdfBrush. Для определения наконечника линии используется класс PdfLineCap.

    SDK содержит демонстрационное приложение PDF Drawing Demo, которое демонстрирует, как выполнять рисование на PDF странице с помощью графических примитивов. Исходные коды приложения PDF Drawing Demo доступны на языках C# и VB.NET.

    Вот C#/VB.NET код, который демонстрирует, как нарисовать несколько графических примитивов на PDF странице:
    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
    


    Вот C#/VB.NET код, который демонстрирует, как нарисовать несколько графических примитивов без вращения на повернутой PDF странице:
    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
    



    Рисование графических фигур на PDF странице

    Графическая фигура - это графический объект, который может быть нарисован с помощью графических примитивов или других графических фигур. Класс GraphicsFigure является базовым классом для всех графических фигур.

    Вот список графических фигур, реализованных в SDK:
    Фигуры, реализующие интерфейс IAutoSizeGraphicsFigure, могут автоматически рассчитывать свой размер при измененииразмера панели, в которой находится фигура.

    Иерархия графических фигур открыта и позволяет создавать новые или настраивать существующие фигуры.

    SDK содержит демо-приложение PDF Drawing Demo, которое демонстрирует, как выполнять рисование на PDF странице с помощью графических фигур. Исходные коды приложения PDF Drawing Demo доступны на языках C# и VB.NET.

    Вот C#/VB.NET код, который демонстрирует, как нарисовать несколько графических фигур на PDF странице:
    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