Skip to main content

DevExpress v25.1 Update — Your Feedback Matters

Our What's New in v25.1 webpage includes product-specific surveys. Your response to our survey questions will help us measure product satisfaction for features released in this major update and help us refine our plans for our next major release.

Take the survey Not interested

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.

  1. Use the PdfAcroFormFacade.GetFormField method to obtain a required form field. Use the PdfDocumentFacade.AcroForm property to access the PdfAcroFormFacade object.
  2. 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.
  3. 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.
  4. 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:

    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.

    Expand Conversion Formula Details

    To 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
    
  5. 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.

  6. Call the PdfDocumentProcessor.RemoveFormField method to remove the form field.

View Example: How to replace a form field with an image

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);
}
See Also