Skip to main content
All docs
V25.1
  • PdfMarkupAnnotationFacade Class

    Contains a set of properties used to manage markup annotations without access to their inner structure.

    Namespace: DevExpress.Pdf

    Assembly: DevExpress.Pdf.v25.1.Core.dll

    NuGet Package: DevExpress.Pdf.Core

    Declaration

    public class PdfMarkupAnnotationFacade :
        PdfAnnotationFacade

    Remarks

    Markup annotations are used to mark up document content. The following markups are available:

    • Caret
    • Rubber Stamp
    • Shape (circle, square)
    • File Attachment
    • Free Text (text box, callout, typewriter)
    • Ink
    • Path (line, polyline, polygon)
    • Redaction

    You can create, delete, and flatten annotations, edit their content, and add related comments and reviews.

    Create Markup Annotations

    The table below lists available markup annotation types and API used to create these annotations:

    Annotation Class Method
    Text Markup PdfTextMarkupAnnotationFacade PdfPageFacade.AddTextMarkupAnnotation
    Sticky Note PdfTextAnnotationFacade PdfPageFacade.AddTextAnnotation
    Caret PdfCaretAnnotationFacade PdfPageFacade.AddCaretAnnotation
    Rubber Stamp PdfRubberStampAnnotationFacade PdfPageFacade.AddRubberStampAnnotation
    Circle PdfCircleAnnotationFacade PdfPageFacade.AddCircleAnnotation
    Square PdfSquareAnnotationFacade PdfPageFacade.AddSquareAnnotation
    File Attachment PdfFileAttachmentAnnotationFacade PdfPageFacade.AddFileAttachmentAnnotation
    Free Text PdfFreeTextAnnotationFacade PdfPageFacade.AddFreeTextAnnotation
    Ink PdfInkAnnotationFacade PdfPageFacade.AddInkAnnotation
    Line PdfLineAnnotationFacade PdfPageFacade.AddLineAnnotation
    Polyline PdfPolyLineAnnotationFacade PdfPageFacade.AddPolyLineAnnotation
    Polygon PdfPolygonAnnotationFacade PdfPageFacade.AddPolygonAnnotation
    Redaction PdfRedactAnnotationFacade PdfPageFacade.AddRedactAnnotation

    The code sample below creates a rubber stamp, file attachment, free text, and a circle annotation:

    markup annotations

    using DevExpress.Pdf;
    using System;
    using System.IO;
    
    using (PdfDocumentProcessor processor = new PdfDocumentProcessor())
    {
        // Load a document
        processor.LoadDocument("..\\..\\Document.pdf");
    
        // Access the first page properties
        PdfPageFacade pageFacade = processor.DocumentFacade.Pages[0];
    
        // Define a rubber stamp rectangle
        PdfRectangle rubberStampRectangle = new PdfRectangle(663, 526, 763, 576);
    
        // Create a "Draft" rubber stamp annotation
        PdfRubberStampAnnotationFacade rubberStamp =
            pageFacade.AddRubberStampAnnotation(rubberStampRectangle,
            PdfRubberStampAnnotationIconName.Draft);
        rubberStamp.Author = "Jesse Faden";
        rubberStamp.Contents = "Made in PDF Document API";
    
        // Define a file attachment area
        PdfPoint attachmentPoint = new PdfPoint(52, 550);
    
        // Specify attachment data
        PdfFileAttachment attachment = new PdfFileAttachment()
        {
            CreationDate = DateTime.Now,
            Description = "This is my attached file",
            FileName = "MyAttach.txt",
            Data = File.ReadAllBytes("..\\..\\FileToAttach.txt")
        };
    
        // Create a file attachment annotation
        PdfFileAttachmentAnnotationFacade pdfFileAttachment =
            pageFacade.AddFileAttachmentAnnotation(attachmentPoint, attachment,
            PdfFileAttachmentAnnotationIconName.PaperClip);
        pdfFileAttachment.Author = "Nancy Skywalker";
        pdfFileAttachment.Contents = "Additional Content";
    
        // Specify a free text annotation area
        PdfRectangle freeTextRectangle = new PdfRectangle(14, 321, 145, 340);
    
        // Create a free text annotation in this area
        PdfFreeTextAnnotationFacade freeTextAnnotation =
           pageFacade.AddFreeTextAnnotation(freeTextRectangle, "Free Text Annotation");
        freeTextAnnotation.Author = "Rayn Anita W";
    
        // Add a callout line
        freeTextAnnotation.SetCallout(PdfAnnotationLineEndingStyle.OpenArrow, new PdfPoint(152,351));
    
        // Find the target phrase in the document
        string circleText = "dogfooded";
        PdfTextSearchResults searchResults = processor.FindText(circleText);
    
        if (searchResults.Status == PdfTextSearchStatus.Found)
        {
            // Define an area around the phrase to add an annotation
            PdfRectangle circleRectangle = searchResults.Rectangles[0].BoundingRectangle;
    
            // Create a circle annotation in this area
            PdfCircleAnnotationFacade circleAnnotation = pageFacade.AddCircleAnnotation(circleRectangle);
            circleAnnotation.Author = "Cardle Anita W";
            circleAnnotation.Contents = "It's better to say 'used' in this case";
        }
    
        // Save the result
        processor.SaveDocument("..\\..\\Result.pdf");
    }
    

    Edit Annotations

    The PdfPageFacade.Annotations property returns all page annotation properties. You can filter annotation properties, cast them to the corresponding class, and use class properties to modify annotation parameters.

    The code sample below changes annotations created in the previous example, so they appear as follows:

    markup edited

    using DevExpress.Pdf;
    using System.Linq;
    
    using (PdfDocumentProcessor processor = new PdfDocumentProcessor())
    {
        // Load a document
        processor.LoadDocument("..\\..\\Result.pdf");
    
        // Access the first page properties
        PdfPageFacade pageFacade = processor.DocumentFacade.Pages[0];
    
        // Obtain all free text annotations
        var freeTextAnnotations = pageFacade.Annotations.Where
            (annotation => annotation.Type == PdfAnnotationType.FreeText);
        foreach (PdfFreeTextAnnotationFacade freeText in freeTextAnnotations) 
        { 
            // Change border parameters and text justification
            freeText.InteriorColor = new PdfRGBColor(0.36, 0.54, 0.66);
            freeText.BorderWidth = 0.5;
            freeText.TextJustification = PdfTextJustification.Centered;
        }
    
        // Retrieve all circle annotations
        var circleAnnotations = pageFacade.Annotations.Where
            (annotation => annotation.Type == PdfAnnotationType.Circle);
        foreach (PdfCircleAnnotationFacade pdfCircle in circleAnnotations)
        { 
            // Change border style and color
            pdfCircle.BorderStyle = PdfBorderStyle.Dash; 
            pdfCircle.Color = new PdfRGBColor(0.52, 0.87, 0.01);
        }
    
        // Get all rubber stamps 
        var rubberStampAnnotations = pageFacade.Annotations.Where
            (annotation => annotation.Type == PdfAnnotationType.RubberStamp);
        foreach (PdfRubberStampAnnotationFacade pdfRubberStamp in rubberStampAnnotations)
        {
            // Generate a stamp from another document’s page
            pdfRubberStamp.SetCustomIcon("..\\..\\Demo.pdf", 4);
        }
    
        // Obtain all file attachments
        var fileAttachments = pageFacade.Annotations.Where
            (annotation => annotation.Type == PdfAnnotationType.FileAttachment);
        foreach (PdfFileAttachmentAnnotationFacade fileAttachment in fileAttachments) 
        {
            // Change the icon and its color
            fileAttachment.Color = new PdfRGBColor(0.83, 0.13, 0.18);
            fileAttachment.IconName = PdfFileAttachmentAnnotationIconName.Tag;
        }
            // Save the result
            processor.SaveDocument("..\\..\\Result_1.pdf");
    }
    

    Add Comments to Annotations

    Use API from the table below to add comments to markup annotations:

    API Description
    AddReply Adds a comment to the annotation. This method returns the PdfMarkupAnnotationComment object. Use this class’ members to change the reply’s author, subject and text.
    Replies Obtains all annotation comments.
    PdfMarkupAnnotationComment.AddReply Creates a nested comment.
    PdfMarkupAnnotationComment.Replies Gets all nested comments added to the comment.
    PdfMarkupAnnotationComment.AddReview Adds a review to the comment. Use the PdfMarkupAnnotationFacade.Reviews property to get all reviews.

    The code sample below adds two nested comments to all sticky notes (the document in opened in WinForms PDF Viewer):

    added comments

    using (PdfDocumentProcessor processor = new PdfDocumentProcessor())
    {
        // Load a document
        processor.LoadDocument("..\\..\\Document.pdf");
    
        // Access the first page properties
        PdfPageFacade pageFacade = processor.DocumentFacade.Pages[0];
    
        // Retrieve all text annotations
        var stickyNotes = pageFacade.Annotations.Where
                (annotation => annotation.Type == PdfAnnotationType.Text);
        foreach (PdfTextAnnotationFacade stickyNote in stickyNotes)
        {
            // Add comments
            AddAnnotationComments(stickyNote);
        }
    
        // Save the result
        processor.SaveDocument("..\\..\\Result.pdf");
    }
    
    private static void AddAnnotationComments(PdfMarkupAnnotationFacade annotation)
    {
        PdfMarkupAnnotationComment comment =
           annotation.AddReply("Reviewer", "Done");
        comment.Subject = "Proofread";
    
        PdfMarkupAnnotationComment nestedComment =
           comment.AddReply(annotation.Author, "Thanks");
        nestedComment.Subject = "Reviewed";
    }
    

    Add Reviews to Annotations

    Call the AddReview method to add a review to the markup annotation. The Reviews property obtains all annotation reviews.

    To remove all reviews, call the ClearReviews() method.

    The code sample below adds a review to the annotations from a specific author (the document is opened in the WinForms PDF Viewer):

    added reviews

    using DevExpress.Pdf;
    
    using (PdfDocumentProcessor processor = new PdfDocumentProcessor())
    {
        // Load a document
        processor.LoadDocument("..\\..\\Document.pdf");
    
        // Access the first page properties
        PdfPageFacade pageFacade = processor.DocumentFacade.Pages[0];
    
        foreach(PdfMarkupAnnotationFacade markupAnnotation in pageFacade.Annotations)
        {
    
            // Check the annotation author
            if (markupAnnotation.Author == "Brian Zetc") 
            {
    
              // Add a review to the annotation
                markupAnnotation.AddReview("Cardle Anita W", PdfAnnotationReviewStatus.Accepted);
            }
        }
        // Save the result
        processor.SaveDocument("..\\..\\Result.pdf");
    }
    

    Flatten Annotations

    Call one of the following methods to flatten an annotation:

    Method Description
    PdfDocumentFacade.FlattenAnnotations Flattens document annotations.
    PdfPageFacade.FlattenAnnotations Flattens annotations of a specific page.
    PdfAnnotationFacade.Flatten() Flattens a specific annotation.

    Note

    When you call one of the Flatten… methods for redaction annotations, their overlay parameters (text, fill color, and so on) are not applied and the redacted content is not removed. Use one of the ApplyRedactAnnotations methods to apply these annotations.

    The code sample below flattens all text annotations in the document:

    using (PdfDocumentProcessor processor = new PdfDocumentProcessor())
    {
      // Load a document:
      processor.LoadDocument("..\\..\\Document.pdf");
    
      // Flatten all text annotations:
      PdfDocumentFacade documentFacade = processor.DocumentFacade;
      documentFacade.FlattenAnnotations(PdfAnnotationType.Text);
    
      // Save the result:
      processor.SaveDocument("..\\..\\Result.pdf");
    }
    

    Remove Annotations

    Call the PdfAnnotationFacade.Remove() method to remove an annotation.

    The code sample below removes all annotations from a specific author:

    using DevExpress.Pdf;
    using System.Linq;
    
    using (PdfDocumentProcessor processor = new PdfDocumentProcessor())
    {
        // Load a document
        processor.LoadDocument("..\\..\\Document.pdf");
    
        // Access the first page properties
        PdfPageFacade pageFacade = processor.DocumentFacade.Pages[0];
    
        // Retrieve all markup annotations
        var markups = pageFacade.Annotations.Where
                (annotation => annotation.Type != PdfAnnotationType.Link).ToList();
        foreach(PdfMarkupAnnotationFacade markupAnnotation in markups)
        {
            // Check the annotation author
            if (markupAnnotation.Author == "Brian Zetc")
            {
                // Remove the annotation
                markupAnnotation.Remove();
            }
        }
        // Save the result
        processor.SaveDocument("..\\..\\Result.pdf");
    }
    
    See Also