How to: Replace a Form Field with an Image
- 5 minutes to read
This topic describes how to substitute an interactive form field in a PDF document with an image. To do this, remove the required form field from the document and display an image instead of the deleted field. Form field removal is necessary, because widget annotation is drawn over page content and can overlap an image added at the form field’s position.
Follow the steps below to replace a form field with an image that maintains the same size and position.
- Use the PdfAcroFormFacade.GetFormField method to obtain a required form field. Use the PdfDocumentFacade.AcroForm property to access the PdfAcroFormFacade object.
- Use the PdfWidgetFacade.Rectangle property to obtain widget annotations and get the annotation rectangle (defines the annotation location on the page). Note that this property is measured in default user space units.
- Use the PdfWidgetFacade.PageNumber property to get the page where the annotation is located. Once you obtain that page, use the PdfPageTreeObject.CropBox property to get the page boundaries (the crop box). Note that the crop box uses the user coordinate system.
Call the PdfGraphics.DrawImage method to draw an image at the form field’s position.
Note that PdfGraphics uses the world coordinate system. Use the following formula to convert user coordinates to world coordinates:
Unit
X = ((rect. Left – crop Box. Left) / 72) * dpi X; Unit
Y = ((crop Box. Top – rect. Bottom) / 72 ) * dpi Y; where
Pdf
Rectangle rect = field. Widget. Rect; Pdf
Rectangle crop Box = field. Widget. Page. Crop Box; This code example uses 72 for dpiX and dpiY values to simplify the formula above. 72 is a standard DPI value used for most printouts. You can use the DPI value as required.
Expand Conversion Formula DetailsTo perform this conversion, we modify page coordinates to correspond to the world coordinates conversion formula.
UnitX = (Xu / 72) * dpiX; UnitY = ((cropBox.Height - Yu) / 72) * dpiY;
*Xu and Yu are user coordinates.
Since the page coordinates system origin (0, 0) is shifted by page crop bottom and page crop box left values relative to the user coordinate system’s origin, the page coordinates are converted to user coordinates using the formula below:
Xu = rect.Left – cropBox.Left; Yu = rect.Bottom – cropBox.Bottom;
Insert Xu and Yu into the user coordinates to world coordinates conversion formula as follows:
UnitX = ((rect.Left – cropBox.Left) / 72) * dpiX; UnitY = ((cropBox.Height – rect.Bottom + cropBox.Bottom) / 72 ) * dpiY = ((cropBox.Top – rect.Bottom) / 72 ) * dpiY
Use the PdfGraphics.AddToPageForeground method to add graphics to the PDF page’s foreground. Pass 72 as DPI values to this method to transform world coordinates to page coordinates without scaling.
- Call the PdfDocumentProcessor.RemoveFormField method to remove the form field.
using System.Drawing;
using DevExpress.Pdf;
static void Main(string[] args)
{
const float dpiX = 72f;
const float dpiY = 72f;
using (PdfDocumentProcessor processor = new PdfDocumentProcessor()) {
// Load a PDF document with AcroForm data.
processor.LoadDocument("..\\..\\InteractiveForm.pdf");
PdfDocumentFacade documentFacade = processor.DocumentFacade;
PdfAcroFormFacade acroForm = documentFacade.AcroForm;
string fieldName = "Address";
// Obtain the required form field
PdfTextFormFieldFacade formField = acroForm.GetFormField(fieldName) as PdfTextFormFieldFacade;
if (formField == null) return;
foreach (PdfWidgetFacade widget in formField) {
PdfRectangle rect = widget.Rectangle;
PdfPage page = processor.Document.Pages[widget.PageNumber - 1];
double x = (rect.Left - page.CropBox.Left)/72 * dpiX;
double y = (page.CropBox.Top - rect.Bottom)/72 * dpiY;
// Create graphics and draw an image.
using (PdfGraphics graphics = processor.CreateGraphics())
{
DrawImage(graphics, rect, x, y);
graphics.AddToPageForeground(page, dpiX, dpiY);
}
}
processor.RemoveFormField(fieldName);
processor.SaveDocument("..\\..\\Result.pdf");
}
}
static void DrawImage(PdfGraphics graphics, PdfRectangle rect, double x, double y) {
Bitmap image = new Bitmap("..\\..\\AddressFormField.png");
double aspectRatio = image.Width / image.Height;
double scaleX = image.Width / rect.Width;
double scaleY = image.Height / rect.Height;
double width;
double height;
if (scaleX < scaleY) {
width = rect.Width;
height = width / aspectRatio;
}
else {
height = rect.Height;
width = height * aspectRatio;
}
// Calculate the rectangle
// to use in the world coordinate system
RectangleF imageRect = new RectangleF((float)x, (float)(y - height), (float)width, (float)height);
graphics.DrawImage(image, imageRect);
}