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:
- create an empty template of specified size using constructor of class that takes a rectangle defining a bounding rectangle of template
- create a template, based on specified page, using constructor of class that takes the PDF page
- obtain information about template size using PdfFormXObjectResource.BoundingBox property
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