How to: Replace a Form Field with an Image
- 4 minutes to read
This topic describes how to substitute an interactive form field in a PDF document with an image. To perform this task, 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 the 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. Access the PdfAcroFormFacade object by the PdfDocumentFacade.AcroForm property.
Use the PdfWidgetFacade.Rectangle property to obtain the 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. After that use the PdfPageTreeObject.CropBox property to obtain the page boundaries defined by the crop box. Note that the crop box is measured according to 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. The following formula is used to convert user coordinates to world coordinates.
UnitX = ((rect.Left – cropBox.Left) / 72) * dpiX;
UnitY = ((cropBox.Top – rect.Bottom) / 72 ) * dpiY;
where
PdfRectangle rect = field.Widget.Rect;
PdfRectangle cropBox = field.Widget.Page.CropBox;
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.
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);
}