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