VintaSoft Imaging .NET SDK 15.1: Documentation for .NET developer
In This Topic
PDF: Working with Form XObjects (templates) of PDF document
In This Topic
A PDF document could include some templates for drawing of the entire PDF page or its region. In PDF specification template for drawing called "Form XObject". The template could include any sequence of graphical commands and objects, and may be drawn on one or more pages.

PdfFormXObjectResource class represents Form XObject and allows to:

Draw on a form template (form XObject)

To perform drawing on a template (Form XObject ) it is necessary to do the following:
Here is C#/VB.NET code that demonstrates how to create an empty Form XObject, draw a text on it and then draw the Form Xobject itself in the right lower corner of each page of PDF document:
/// <summary>
/// Creates an empty Form XObject, draws a text on it
/// and then draws the Form XObject itself in the right lower corner
/// of each page of PDF document.
/// </summary>
/// <param name="pdfFilename">The filename of PDF document.</param>
/// <remarks>
/// This method doesn't consider the rotation of the page.
/// </remarks>
public static void DrawingOnTemplate(string pdfFilename)
{
    // open PDF document
    using (Vintasoft.Imaging.Pdf.PdfDocument pdfDocument = new Vintasoft.Imaging.Pdf.PdfDocument(pdfFilename))
    {
        // bounding box of the form
        System.Drawing.RectangleF boundingBox = new System.Drawing.RectangleF(0, 0, 100, 50);
        // create a form with specified bounding box
        Vintasoft.Imaging.Pdf.Tree.PdfFormXObjectResource form = 
            new Vintasoft.Imaging.Pdf.Tree.PdfFormXObjectResource(pdfDocument, boundingBox);
        // open PdfGraphics from the form
        using (Vintasoft.Imaging.Pdf.Drawing.PdfGraphics formGraphics = 
            Vintasoft.Imaging.Pdf.Drawing.PdfGraphics.FromForm(form))
        {
            // text of the string
            string text = "Template";
            // get standard font
            Vintasoft.Imaging.Pdf.Tree.Fonts.PdfFont font = pdfDocument.FontManager.GetStandardFont(
                Vintasoft.Imaging.Pdf.Tree.Fonts.PdfStandardFontType.TimesRoman);
            // rectangle of text string on the form
            System.Drawing.RectangleF textRect = new System.Drawing.RectangleF(10, 10, 80, 30);
            // get font size for specified rectangle
            float fontSize = formGraphics.MeasureFontSize(text, font, textRect.Width, textRect.Height);
            // create brush for the text string
            Vintasoft.Imaging.Pdf.Drawing.PdfBrush brush = new Vintasoft.Imaging.Pdf.Drawing.PdfBrush(
                System.Drawing.Color.Red);
            // draw the text string on the form
            formGraphics.DrawString(text, font, fontSize, brush, textRect, 
                Vintasoft.Imaging.Pdf.Drawing.PdfContentAlignment.Center, false);
        }

        // get original dimensions of the form
        float formWidth = form.BoundingBox.Width;
        float formHeight = form.BoundingBox.Height;

        // for each page of the PDF document
        foreach (Vintasoft.Imaging.Pdf.Tree.PdfPage page in pdfDocument.Pages)
        {
            // open PdfGraphics from the page
            using (Vintasoft.Imaging.Pdf.Drawing.PdfGraphics pageGraphics = 
                Vintasoft.Imaging.Pdf.Drawing.PdfGraphics.FromPage(page))
            {
                // get the crop box of the page
                System.Drawing.RectangleF cropBox = page.CropBox;
                // width of form area on the page
                float formAreaWidth = cropBox.Width / 3;
                // height of form area on the page
                float formAreaHeight = cropBox.Height / 3;

                // calculate ratios of form area dimensions to form dimensions
                float horizontalRatio = formAreaWidth / formWidth;
                float verticalRatio = formAreaHeight / formHeight;
                // destination rectangle
                System.Drawing.RectangleF rect;

                // calculate destination rectanle that is fitted into the specified
                // form area with the same width-to-height ratio as the form has

                if (horizontalRatio > verticalRatio)
                {
                    // calculate actual form area width
                    float actualFormAreaWidth = formAreaWidth * (verticalRatio / horizontalRatio);
                    // calculate the destination rectangle in the right lower corner of the page
                    rect = new System.Drawing.RectangleF(
                        cropBox.X + cropBox.Width - actualFormAreaWidth,
                        cropBox.Y,
                        actualFormAreaWidth,
                        formAreaHeight);
                }
                else
                {
                    // calculate actual form area height
                    float actualFormAreaHeight = formAreaHeight * (horizontalRatio / verticalRatio);
                    // calculate the destination rectangle in the right lower corner of the page
                    rect = new System.Drawing.RectangleF(
                        cropBox.X + 2 * cropBox.Width / 3,
                        cropBox.Y,
                        formAreaWidth,
                        actualFormAreaHeight);
                }
                // set clip rectangle
                pageGraphics.IntersectClip(rect);
                // draw the form on the page
                pageGraphics.DrawForm(form, rect);
            }
        }
        // save changes to the source
        pdfDocument.SaveChanges();
    }
}
''' <summary>
''' Creates an empty Form XObject, draws a text on it
''' and then draws the Form XObject itself in the right lower corner
''' of each page of PDF document.
''' </summary>
''' <param name="pdfFilename">The filename of PDF document.</param>
''' <remarks>
''' This method doesn't consider the rotation of the page.
''' </remarks>
Public Shared Sub DrawingOnTemplate(pdfFilename As String)
    ' open PDF document
    Using pdfDocument As New Vintasoft.Imaging.Pdf.PdfDocument(pdfFilename)
        ' bounding box of the form
        Dim boundingBox As New System.Drawing.RectangleF(0, 0, 100, 50)
        ' create a form with specified bounding box
        Dim form As New Vintasoft.Imaging.Pdf.Tree.PdfFormXObjectResource(pdfDocument, boundingBox)
        ' open PdfGraphics from the form
        Using formGraphics As Vintasoft.Imaging.Pdf.Drawing.PdfGraphics = Vintasoft.Imaging.Pdf.Drawing.PdfGraphics.FromForm(form)
            ' text of the string
            Dim text As String = "Template"
            ' get standard font
            Dim font As Vintasoft.Imaging.Pdf.Tree.Fonts.PdfFont = pdfDocument.FontManager.GetStandardFont(Vintasoft.Imaging.Pdf.Tree.Fonts.PdfStandardFontType.TimesRoman)
            ' rectangle of text string on the form
            Dim textRect As New System.Drawing.RectangleF(10, 10, 80, 30)
            ' get font size for specified rectangle
            Dim fontSize As Single = formGraphics.MeasureFontSize(text, font, textRect.Width, textRect.Height)
            ' create brush for the text string
            Dim brush As New Vintasoft.Imaging.Pdf.Drawing.PdfBrush(System.Drawing.Color.Red)
            ' draw the text string on the form
            formGraphics.DrawString(text, font, fontSize, brush, textRect, Vintasoft.Imaging.Pdf.Drawing.PdfContentAlignment.Center, _
                False)
        End Using

        ' get original dimensions of the form
        Dim formWidth As Single = form.BoundingBox.Width
        Dim formHeight As Single = form.BoundingBox.Height

        ' for each page of the PDF document
        For Each page As Vintasoft.Imaging.Pdf.Tree.PdfPage In pdfDocument.Pages
            ' open PdfGraphics from the page
            Using pageGraphics As Vintasoft.Imaging.Pdf.Drawing.PdfGraphics = Vintasoft.Imaging.Pdf.Drawing.PdfGraphics.FromPage(page)
                ' get the crop box of the page
                Dim cropBox As System.Drawing.RectangleF = page.CropBox
                ' width of form area on the page
                Dim formAreaWidth As Single = cropBox.Width / 3
                ' height of form area on the page
                Dim formAreaHeight As Single = cropBox.Height / 3

                ' calculate ratios of form area dimensions to form dimensions
                Dim horizontalRatio As Single = formAreaWidth / formWidth
                Dim verticalRatio As Single = formAreaHeight / formHeight
                ' destination rectangle
                Dim rect As System.Drawing.RectangleF

                ' calculate destination rectanle that is fitted into the specified
                ' form area with the same width-to-height ratio as the form has

                If horizontalRatio > verticalRatio Then
                    ' calculate actual form area width
                    Dim actualFormAreaWidth As Single = formAreaWidth * (verticalRatio / horizontalRatio)
                    ' calculate the destination rectangle in the right lower corner of the page
                    rect = New System.Drawing.RectangleF(cropBox.X + cropBox.Width - actualFormAreaWidth, cropBox.Y, actualFormAreaWidth, formAreaHeight)
                Else
                    ' calculate actual form area height
                    Dim actualFormAreaHeight As Single = formAreaHeight * (horizontalRatio / verticalRatio)
                    ' calculate the destination rectangle in the right lower corner of the page
                    rect = New System.Drawing.RectangleF(cropBox.X + 2 * cropBox.Width / 3, cropBox.Y, formAreaWidth, actualFormAreaHeight)
                End If
                ' set clip rectangle
                pageGraphics.IntersectClip(rect)
                ' draw the form on the page
                pageGraphics.DrawForm(form, rect)
            End Using
        Next
        ' save changes to the source
        pdfDocument.SaveChanges()
    End Using
End Sub



Draw a form template (form XObject) on a page or another form template

To draw a form template (Form XObject ) on a page or another form template it is necessary to do the following:
Here is C#/VB.NET code that demonstrates how to draw one PDF page in the left upper corner of another PDF page:
/// <summary>
/// Draws one PDF page in the left upper corner of another PDF page
/// using Form XObject that represents the page.
/// </summary>
/// <param name="pdfFilename">The filename of PDF document.</param>
/// <remarks>
/// This method doesn't consider the rotation of the page.
/// </remarks>
public static void DrawingTemplateOnAnotherTemplate(string pdfFilename)
{
    // open PDF document
    using (Vintasoft.Imaging.Pdf.PdfDocument pdfDocument = 
        new Vintasoft.Imaging.Pdf.PdfDocument(pdfFilename))
    {
        if (pdfDocument.Pages.Count == 1)
            return;

        // get first page of the document
        Vintasoft.Imaging.Pdf.Tree.PdfPage firstPage = pdfDocument.Pages[0];
        // get second page of the document
        Vintasoft.Imaging.Pdf.Tree.PdfPage secondPage = pdfDocument.Pages[1];
        // create a form that represents the second page
        Vintasoft.Imaging.Pdf.Tree.PdfFormXObjectResource form = 
            new Vintasoft.Imaging.Pdf.Tree.PdfFormXObjectResource(pdfDocument, secondPage);
        // get original dimensions of the form
        float formWidth = form.BoundingBox.Width;
        float formHeight = form.BoundingBox.Height;

        // open PdfGraphics from the page
        using (Vintasoft.Imaging.Pdf.Drawing.PdfGraphics pageGraphics = 
            Vintasoft.Imaging.Pdf.Drawing.PdfGraphics.FromPage(firstPage))
        {
            // get the crop box of the page
            System.Drawing.RectangleF cropBox = firstPage.CropBox;
            // width of form area on the page
            float formAreaWidth = cropBox.Width / 3;
            // height of form area on the page
            float formAreaHeight = cropBox.Height / 3;

            // calculate ratios of form area dimensions to form dimensions
            float horizontalRatio = formAreaWidth / formWidth;
            float verticalRatio = formAreaHeight / formHeight;
            // destination rectangle
            System.Drawing.RectangleF rect;

            // calculate destination rectanle that is fitted into the specified
            // form area with the same width-to-height ratio as the form has

            if (horizontalRatio > verticalRatio)
            {
                // calculate actual form area width
                float actualFormAreaWidth = formAreaWidth * (verticalRatio / horizontalRatio);
                // calculate the destination rectangle in the right lower corner of the page
                rect = new System.Drawing.RectangleF(
                    cropBox.X,
                    cropBox.Y + 2 * cropBox.Height / 3,
                    actualFormAreaWidth,
                    formAreaHeight);
            }
            else
            {
                // calculate actual form area height
                float actualFormAreaHeight = formAreaHeight * (horizontalRatio / verticalRatio);
                // calculate the destination rectangle in the right lower corner of the page
                rect = new System.Drawing.RectangleF(
                    cropBox.X,
                    cropBox.Y + cropBox.Height - actualFormAreaHeight,
                    formAreaWidth,
                    actualFormAreaHeight);
            }
            // set clip rectangle
            pageGraphics.IntersectClip(rect);
            // fill a rectangle with white color as a background
            pageGraphics.FillRectangle(
                new Vintasoft.Imaging.Pdf.Drawing.PdfBrush(System.Drawing.Color.White), rect);
            // draw red border
            pageGraphics.DrawRectangle(
                new Vintasoft.Imaging.Pdf.Drawing.PdfPen(System.Drawing.Color.Red, 2), rect);
            // draw the form on the page
            pageGraphics.DrawForm(form, rect);
        }

        // save changes to the source
        pdfDocument.SaveChanges();
    }
}
''' <summary>
''' Draws one PDF page in the left upper corner of another PDF page
''' using Form XObject that represents the page.
''' </summary>
''' <param name="pdfFilename">The filename of PDF document.</param>
''' <remarks>
''' This method doesn't consider the rotation of the page.
''' </remarks>
Public Shared Sub DrawingTemplateOnAnotherTemplate(pdfFilename As String)
    ' open PDF document
    Using pdfDocument As New Vintasoft.Imaging.Pdf.PdfDocument(pdfFilename)
        If pdfDocument.Pages.Count = 1 Then
            Return
        End If

        ' get first page of the document
        Dim firstPage As Vintasoft.Imaging.Pdf.Tree.PdfPage = pdfDocument.Pages(0)
        ' get second page of the document
        Dim secondPage As Vintasoft.Imaging.Pdf.Tree.PdfPage = pdfDocument.Pages(1)
        ' create a form that represents the second page
        Dim form As New Vintasoft.Imaging.Pdf.Tree.PdfFormXObjectResource(pdfDocument, secondPage)
        ' get original dimensions of the form
        Dim formWidth As Single = form.BoundingBox.Width
        Dim formHeight As Single = form.BoundingBox.Height

        ' open PdfGraphics from the page
        Using pageGraphics As Vintasoft.Imaging.Pdf.Drawing.PdfGraphics = Vintasoft.Imaging.Pdf.Drawing.PdfGraphics.FromPage(firstPage)
            ' get the crop box of the page
            Dim cropBox As System.Drawing.RectangleF = firstPage.CropBox
            ' width of form area on the page
            Dim formAreaWidth As Single = cropBox.Width / 3
            ' height of form area on the page
            Dim formAreaHeight As Single = cropBox.Height / 3

            ' calculate ratios of form area dimensions to form dimensions
            Dim horizontalRatio As Single = formAreaWidth / formWidth
            Dim verticalRatio As Single = formAreaHeight / formHeight
            ' destination rectangle
            Dim rect As System.Drawing.RectangleF

            ' calculate destination rectanle that is fitted into the specified
            ' form area with the same width-to-height ratio as the form has

            If horizontalRatio > verticalRatio Then
                ' calculate actual form area width
                Dim actualFormAreaWidth As Single = formAreaWidth * (verticalRatio / horizontalRatio)
                ' calculate the destination rectangle in the right lower corner of the page
                rect = New System.Drawing.RectangleF(cropBox.X, cropBox.Y + 2 * cropBox.Height / 3, actualFormAreaWidth, formAreaHeight)
            Else
                ' calculate actual form area height
                Dim actualFormAreaHeight As Single = formAreaHeight * (horizontalRatio / verticalRatio)
                ' calculate the destination rectangle in the right lower corner of the page
                rect = New System.Drawing.RectangleF(cropBox.X, cropBox.Y + cropBox.Height - actualFormAreaHeight, formAreaWidth, actualFormAreaHeight)
            End If
            ' set clip rectangle
            pageGraphics.IntersectClip(rect)
            ' fill a rectangle with white color as a background
            pageGraphics.FillRectangle(New Vintasoft.Imaging.Pdf.Drawing.PdfBrush(System.Drawing.Color.White), rect)
            ' draw red border
            pageGraphics.DrawRectangle(New Vintasoft.Imaging.Pdf.Drawing.PdfPen(System.Drawing.Color.Red, 2), rect)
            ' draw the form on the page
            pageGraphics.DrawForm(form, rect)
        End Using

        ' save changes to the source
        pdfDocument.SaveChanges()
    End Using
End Sub