Addons

HOWTO: Import Documents With Nev Annotations

Updated: March 18, 2024

This tutorial provides guidelines on how to import documents with annotations in a way that allow having those annotations available in ARender.

The main use case is the migration from a legacy system to Nuxeo.

General Process

The recommendation is to use the Nuxeo REST API to create annotation object and add it to the document.

All the annotations displayed on ARender are stored on Nuxeo as Annotations objects (cf. Comments documentation).

The Nuxeo annotation object includes several datas as the origin of the annotation. The main part is the “entity” one which includes the annotation content (annotation type, text, position in the document, color,…) in the ARender format.

You can find an example of ARender annotation expected format below in this page.

Here is an example of the Nuxeo annotations for a document with 3 ARender annotations:

{
  "entity-type": "annotations",
  "entries": [
    {
      "entity-type": "annotation",
      "id": "b7285100-ab01-45c0-a7a1-1d519ed9a871",
      "parentId": "fc9a17a7-8560-4b4b-b477-feff43922e4f",
      "ancestorIds": [
        "fc9a17a7-8560-4b4b-b477-feff43922e4f"
      ],
      "author": "nco-admin",
      "text": "This a sticky note",
      "creationDate": "2020-12-21T09:00:39.955Z",
      "modificationDate": "2020-12-21T09:00:40.836Z",
      "entityId": "9a3d2762-fddf-4415-991d-0894b2ff2ebc",
      "origin": "ARender",
      "entity": "<?xml version=\"1.0\" encoding=\"UTF-8\"?><ns0:xfdf xmlns:ns0=\"http://ns.adobe.com/xfdf/\"><ns0:annots><ns0:text color=\"#DDEAFF\" flags=\"\" name=\"9a3d2762-fddf-4415-991d-0894b2ff2ebc\" last-modifier=\"NCO Admin\" page=\"0\" rect=\"239.75699,748.2474,268.06332,776.5537\" title=\"NCO Admin\" creationdate=\"D:20201221090039+00'00'\" opacity=\"1.0\"><ns0:contents-richtext><html xmlns=\"http://www.w3.org/1999/xhtml\"><head/><body>This a sticky note</body></html></ns0:contents-richtext><ns0:contents>This a sticky note</ns0:contents><ns0:popup open=\"yes\" color=\"\" flags=\"\" page=\"\" rect=\"254.75699,408.5537,537.75696,761.5537\"/></ns0:text></ns0:annots></ns0:xfdf>",
      "xpath": "file:content",
      "permissions": [
        "Write",
        "WriteVersion",
        "ReadProperties",
        "ReadCanCollect",
        "ReadSecurity",
        "Remove",
        "ReadVersion",
        "Read",
        "WriteLifeCycle",
        "Everything",
        "Moderate",
        "Version",
        "ManageLegalHold",
        "MakeRecord",
        "ReadChildren",
        "AddChildren",
        "Comment",
        "ReadLifeCycle",
        "RemoveChildren",
        "DataVisualization",
        "ReviewParticipant",
        "Unlock",
        "CanAskForPublishing",
        "RestrictedRead",
        "ReadWrite",
        "ReadRemove",
        "Browse",
        "SetRetention",
        "WriteProperties",
        "WriteSecurity",
        "ManageWorkflows"
      ]
    },
    {
      "entity-type": "annotation",
      "id": "b60d39bf-ce32-4d4c-9ec8-841e60225dd2",
      "parentId": "fc9a17a7-8560-4b4b-b477-feff43922e4f",
      "ancestorIds": [
        "fc9a17a7-8560-4b4b-b477-feff43922e4f"
      ],
      "author": "nco-admin",
      "text": "This is a freetext box",
      "creationDate": "2020-12-21T09:01:08.431Z",
      "modificationDate": "2020-12-21T09:01:09.018Z",
      "entityId": "d4a3ac45-3f36-44be-a49d-ecb41a25871f",
      "origin": "ARender",
      "entity": "<?xml version=\"1.0\" encoding=\"UTF-8\"?><ns0:xfdf xmlns:ns0=\"http://ns.adobe.com/xfdf/\"><ns0:annots><ns0:freetext color=\"#EEEEEE\" flags=\"\" name=\"d4a3ac45-3f36-44be-a49d-ecb41a25871f\" last-modifier=\"NCO Admin\" page=\"0\" rect=\"1462.0221,870.53314,1796.0369,976.6819\" title=\"NCO Admin\" creationdate=\"D:20201221090108+00'00'\" opacity=\"0.7\" rotation=\"\" width=\"2.0\"><ns0:contents-richtext><html xmlns=\"http://www.w3.org/1999/xhtml\"><head/><body><span style=\"font-size:13px\">This is a freetext box</span></body></html></ns0:contents-richtext><ns0:contents>This is a freetext box</ns0:contents><ns0:defaultappearance>0 R 1 0 0 </ns0:defaultappearance></ns0:freetext></ns0:annots></ns0:xfdf>",
      "xpath": "file:content",
      "permissions": [
        "Write",
        "WriteVersion",
        "ReadProperties",
        "ReadCanCollect",
        "ReadSecurity",
        "Remove",
        "ReadVersion",
        "Read",
        "WriteLifeCycle",
        "Everything",
        "Moderate",
        "Version",
        "ManageLegalHold",
        "MakeRecord",
        "ReadChildren",
        "AddChildren",
        "Comment",
        "ReadLifeCycle",
        "RemoveChildren",
        "DataVisualization",
        "ReviewParticipant",
        "Unlock",
        "CanAskForPublishing",
        "RestrictedRead",
        "ReadWrite",
        "ReadRemove",
        "Browse",
        "SetRetention",
        "WriteProperties",
        "WriteSecurity",
        "ManageWorkflows"
      ]
    },
    {
      "entity-type": "annotation",
      "id": "07554c04-e277-4958-bd70-15c53eea82ca",
      "parentId": "fc9a17a7-8560-4b4b-b477-feff43922e4f",
      "ancestorIds": [
        "fc9a17a7-8560-4b4b-b477-feff43922e4f"
      ],
      "author": "nco-admin",
      "text": "This is a circle",
      "creationDate": "2020-12-21T09:01:24Z",
      "modificationDate": "2020-12-21T09:02:18.694Z",
      "entityId": "efe76373-8bae-40e3-b1fa-3dcc1226f02d",
      "origin": "ARender",
      "entity": "<?xml version=\"1.0\" encoding=\"UTF-8\"?><ns0:xfdf xmlns:ns0=\"http://ns.adobe.com/xfdf/\"><ns0:annots><ns0:circle color=\"#EAF39C\" date=\"D:20201221090218+00'00'\" flags=\"\" name=\"efe76373-8bae-40e3-b1fa-3dcc1226f02d\" last-modifier=\"NCO Admin\" page=\"0\" rect=\"1432.3004,123.24596,1630.4447,294.49927\" title=\"NCO Admin\" creationdate=\"D:20201221090124+00'00'\" opacity=\"0.7\" fringe=\"0.0,0.0,0.0,0.0\" interior-color=\"#EAF39C\" width=\"0.0\" style=\"solid\" intensity=\"\"><ns0:contents-richtext><html xmlns=\"http://www.w3.org/1999/xhtml\"><head/><body>This is a circle</body></html></ns0:contents-richtext><ns0:contents>This is a circle</ns0:contents><ns0:popup open=\"no\" color=\"#EAF39C\" flags=\"\" page=\"0\" rect=\"1650.0,-53.991165,1890.6039,130.0\"/></ns0:circle></ns0:annots></ns0:xfdf>",
      "xpath": "file:content",
      "permissions": [
        "Write",
        "WriteVersion",
        "ReadProperties",
        "ReadCanCollect",
        "ReadSecurity",
        "Remove",
        "ReadVersion",
        "Read",
        "WriteLifeCycle",
        "Everything",
        "Moderate",
        "Version",
        "ManageLegalHold",
        "MakeRecord",
        "ReadChildren",
        "AddChildren",
        "Comment",
        "ReadLifeCycle",
        "RemoveChildren",
        "DataVisualization",
        "ReviewParticipant",
        "Unlock",
        "CanAskForPublishing",
        "RestrictedRead",
        "ReadWrite",
        "ReadRemove",
        "Browse",
        "SetRetention",
        "WriteProperties",
        "WriteSecurity",
        "ManageWorkflows"
      ]
    }
  ]
}

Code Sample

You can find below a simple method to use if you want to migrate former annotations with Java code:

package com.nuxeo.arender;

import static java.nio.charset.StandardCharsets.UTF_8;
import static java.util.Collections.singletonList;

import java.io.InputStream;
import java.util.Date;
import java.util.Map;
import java.util.UUID;

import org.apache.commons.io.IOUtils;
import org.nuxeo.client.NuxeoClient;
import org.nuxeo.client.objects.comment.AnnotationAdapter;

import com.arondor.viewer.annotation.api.Annotation;
import com.arondor.viewer.annotation.api.TextualAnnotation;
import com.arondor.viewer.annotation.common.AnnotationId;
import com.arondor.viewer.client.api.document.DocumentId;
import com.arondor.viewer.client.api.document.DocumentLayout;
import com.arondor.viewer.client.api.document.DocumentPageLayout;
import com.arondor.viewer.client.api.document.PageDimensions;
import com.arondor.viewer.common.client.util.annotation.AnnotationIdAdapter;
import com.arondor.viewer.common.documentservice.DocumentServiceDelegate;
import com.arondor.viewer.common.documentservice.DocumentServiceDelegateNotAvailable;
import com.arondor.viewer.rendition.api.document.DocumentAccessor;
import com.arondor.viewer.rendition.api.document.DocumentAccessorSelector;
import com.arondor.viewer.rendition.api.document.DocumentService;
import com.arondor.viewer.xfdf.annotation.AnnotationPositionTransformer;
import com.arondor.viewer.xfdf.annotation.AnnotationTransformer;
import com.arondor.viewer.xfdf.annotation.XFDFAnnotationConverter;

public class NuxeoARenderMapper {

    // to initialize with appropriate credentials
    protected NuxeoClient client;

    public void importAnnotation(Map<String, Object> formerAnnotation) throws Exception {
        // document layout definition
        final DocumentPageLayout documentPageLayout = new DocumentPageLayout();
        documentPageLayout.addPageDimensions(0, new PageDimensions());
        documentPageLayout.addPageDimensions(1, new PageDimensions());

        // create annotation marshaller
        DocumentService documentService = new NuxeoDocumentService(documentPageLayout);
        AnnotationTransformer annotationTransformer = new AnnotationPositionTransformer(documentService);
        XFDFAnnotationConverter annotationConverter = new XFDFAnnotationConverter(annotationTransformer);

        // Nuxeo Document Id to annotate - replace it by real one
        String nuxeoDocId = UUID.randomUUID().toString();
        DocumentId arenderDocumentId = new DocumentId(nuxeoDocId);

        // extract information from former annotation
        Date creationDate = (Date) formerAnnotation.getOrDefault("creationDate", new Date());
        Date modificationDate = (Date) formerAnnotation.getOrDefault("modificationDate", new Date());
        // display name
        String creator = (String) formerAnnotation.getOrDefault("creator", "John Doe");

        // here chose the type of annotation you want
        Annotation arenderAnnotation = new Annotation();
        // id is used for parent <-> children relationship - it could be random
        AnnotationId arenderAnnotationId = new AnnotationId(UUID.randomUUID().toString());
        arenderAnnotation.setId(arenderAnnotationId);
        // arenderAnnotation.setInreplyto(new AnnotationId(...));
        arenderAnnotation.setCreator(creator);
        arenderAnnotation.setCreationDate(creationDate);
        arenderAnnotation.setDate(modificationDate);
        // then use appropriate setter depending on the annotation type you choose
        // ....

        // then serialize the annotation
        org.nuxeo.client.objects.comment.Annotation nuxeoAnnotation = new org.nuxeo.client.objects.comment.Annotation();
        nuxeoAnnotation.setEntityId(new AnnotationIdAdapter().marshal(arenderAnnotation.getId()));
        nuxeoAnnotation.setOrigin("ARender"); // has to be ARender
        try (InputStream stream = annotationConverter.serialize(arenderDocumentId, singletonList(arenderAnnotation))) {
            nuxeoAnnotation.setEntity(IOUtils.toString(stream, UTF_8));
        }
        nuxeoAnnotation.setXpath("file:content");
        nuxeoAnnotation.setAuthor("jdoe"); // user id
        nuxeoAnnotation.setCreationDate(creationDate.toInstant());
        nuxeoAnnotation.setModificationDate(modificationDate.toInstant());
        // if the annotation is a TextualAnnotation, you can set the text in order to display it into Nuxeo
        nuxeoAnnotation.setText(((TextualAnnotation) arenderAnnotation).getContents());

        // then save it to Nuxeo
        client.repository().newDocumentAdapter(nuxeoDocId, AnnotationAdapter::new).create(nuxeoAnnotation);

    }

    public static class NuxeoDocumentService extends DocumentServiceDelegate {

        private final DocumentLayout layout;

        protected NuxeoDocumentService(DocumentLayout layout) {
            super(true);
            this.layout = layout;
        }

        @Override
        public DocumentLayout getDocumentLayout(DocumentId documentId) {
            return layout;
        }

        @Override
        public void loadDocumentAccessor(DocumentAccessor documentAccessor,
                DocumentAccessorSelector documentAccessorSelector) {
            // not needed
        }

        @Override
        public DocumentService getDelegate() throws DocumentServiceDelegateNotAvailable {
            // not needed
            return null;
        }

        @Override
        protected void checkDocumentAvailability(DocumentId documentId) {
            // not needed

        }

        @Override
        public DocumentId mayProcessAnnotationRendition(DocumentId documentId) {
            // not needed
            return null;
        }

        @Override
        public boolean needsToProcessRenditionsForDocument(DocumentId documentId) {
            // not needed
            return false;
        }
    }

}

You will need the following Maven dependencies:

<properties>
    <!-- properties were taken from 10.4.x -->
    <arender.version>4.2.0.NX1.2</arender.version>
    <!-- doesn't change a lot -->
    <nuxeo.java.client.version>3.8.0</nuxeo.java.client.version>
  </properties>

  <dependencyManagement>
    <dependencies>
      <dependency>
        <groupId>com.arondor.arender</groupId>
        <artifactId>arender-bom-web-ui</artifactId>
        <version>${arender.version}</version>
        <type>pom</type>
        <scope>import</scope>
      </dependency>
    </dependencies>
  </dependencyManagement>

  <dependencies>
    <dependency>
      <groupId>org.nuxeo.client</groupId>
      <artifactId>nuxeo-java-client</artifactId>
      <version>${nuxeo.java.client.version}</version>
    </dependency>
    <dependency>
      <groupId>com.arondor.arender</groupId>
      <artifactId>arondor-arender-annotation-api</artifactId>
    </dependency>
    <dependency>
      <groupId>com.arondor.arender</groupId>
      <artifactId>arondor-arender-common</artifactId>
      <version>${arender.version}</version>
    </dependency>
    <dependency>
      <groupId>com.arondor.arender</groupId>
      <artifactId>arondor-arender-xfdf-annotation</artifactId>
      <version>${arender.version}</version>
    </dependency>
  </dependencies>

Annotations Samples

Below is an example of ARender annotation format for each kind of annotation.

Arrow Annotation Sample

<?xml version="1.0" encoding="UTF-8"?>
<ns0:xfdf xmlns:ns0="http://ns.adobe.com/xfdf/">
   <ns0:annots>
      <ns0:line color="#0000D5" date="D:20200225142734+00'00'" flags="" name="9b4c724e-797d-4ba0-97fc-26a4976d5626" last-modifier="Administrator" page="0" rect="88.97648,318.74036,389.86642,322.1364" title="Administrator" creationdate="D:20200225141628+00'00'" opacity="1.0" start="88.97648,318.74036" end="389.86642,322.1364" head="OpenArrow" tail="ROpenArrow" interior-color="" width="4.0">
         <ns0:contents-richtext>
            <html xmlns="http://www.w3.org/1999/xhtml">
               <head />
               <body>Arrow annotation content</body>
            </html>
         </ns0:contents-richtext>
         <ns0:contents>Arrow annotation content</ns0:contents>
         <ns0:popup open="no" color="#EAF39C" flags="" page="0" rect="409.0,210.70273,524.46564,299.0" />
      </ns0:line>
   </ns0:annots>
</ns0:xfdf>

Freetext Annotation Sample

<?xml version="1.0" encoding="UTF-8"?>
<ns0:xfdf xmlns:ns0="http://ns.adobe.com/xfdf/">
   <ns0:annots>
      <ns0:freetext color="#EEEEEE" date="D:20200225142754+00'00'" flags="" name="ec335e39-927d-42aa-ad65-b612a6667a25" last-modifier="Administrator" page="3" rect="291.381,150.97552,487.67264,264.40356" title="Administrator" creationdate="D:20200225141817+00'00'" opacity="0.7" rotation="" width="2.0">
         <ns0:contents-richtext>
            <html xmlns="http://www.w3.org/1999/xhtml">
               <head />
               <body>Freetext annotation content</body>
            </html>
         </ns0:contents-richtext>
         <ns0:contents>Freetext annotation content</ns0:contents>
         <ns0:defaultappearance>0 R 1 0 0</ns0:defaultappearance>
      </ns0:freetext>
   </ns0:annots>
</ns0:xfdf>

Sticky Note Annotation Sample

<?xml version="1.0" encoding="UTF-8"?>
<ns0:xfdf xmlns:ns0="http://ns.adobe.com/xfdf/">
   <ns0:annots>
      <ns0:text color="#DDEAFF" date="D:20200225142746+00'00'" flags="" name="d140e145-c7fd-4cc6-a45f-e94e2562bc3b" last-modifier="Administrator" page="2" rect="370.79117,301.8175,384.37537,315.4017" title="Administrator" creationdate="D:20200225141743+00'00'" opacity="1.0" state="None">
         <ns0:contents-richtext>
            <html xmlns="http://www.w3.org/1999/xhtml">
               <head />
               <body>sticky note annotation content</body>
            </html>
         </ns0:contents-richtext>
         <ns0:contents>sticky note annotation content</ns0:contents>
         <ns0:popup open="yes" color="" flags="" page="" rect="385.79117,170.4017,535.79114,300.4017" />
      </ns0:text>
   </ns0:annots>
</ns0:xfdf>

Circle Annotation Sample

<?xml version="1.0" encoding="UTF-8"?>
<ns0:xfdf xmlns:ns0="http://ns.adobe.com/xfdf/">
   <ns0:annots>
      <ns0:circle color="#00C000" date="D:20200225142804+00'00'" flags="" name="0f7f7dd5-15c5-4343-a78f-15ca5798374b" last-modifier="Administrator" page="5" rect="271.0047,229.08469,409.56348,360.85138" title="Administrator" creationdate="D:20200225141930+00'00'" opacity="0.95" fringe="0.0,0.0,0.0,0.0" interior-color="#C000C0" width="1.0" style="solid" intensity="">
         <ns0:contents-richtext>
            <html xmlns="http://www.w3.org/1999/xhtml">
               <head />
               <body>Circle annotation content</body>
            </html>
         </ns0:contents-richtext>
         <ns0:contents>Circle annotation content</ns0:contents>
         <ns0:popup open="no" color="#EAF39C" flags="" page="5" rect="429.0,121.70273,544.46564,210.0" />
      </ns0:circle>
   </ns0:annots>
</ns0:xfdf>

Freehand Annotation Sample

<?xml version="1.0" encoding="UTF-8"?>
<ns0:xfdf xmlns:ns0="http://ns.adobe.com/xfdf/">
   <ns0:annots>
      <ns0:ink color="#2A4869" date="D:20200225142740+00'00'" flags="" name="4c41abcd-ceaa-4f83-b3b0-4214ce47da6a" last-modifier="Administrator" page="1" rect="171.16086,157.76762,362.0188,296.32642" title="Administrator" creationdate="D:20200225141712+00'00'" opacity="1.0" width="2.0" style="solid">
         <ns0:contents-richtext>
            <html xmlns="http://www.w3.org/1999/xhtml">
               <head />
               <body>Freehand annotation content</body>
            </html>
         </ns0:contents-richtext>
         <ns0:contents>Freehand annotation content</ns0:contents>
         <ns0:popup open="no" color="#EAF39C" flags="" page="1" rect="382.0,49.70273,497.46567,138.0" />
         <ns0:inklist>
            <ns0:gesture>232.28975,294.28882;232.28975,294.28882;226.85606,294.28882;221.4224,294.28882;211.23424,294.28882;200.36688,292.9304;196.29163,290.21356;194.254,287.4967;189.49953,280.70462;184.06586,271.19568;179.99059,262.36597;177.27376,254.89464;174.55692,246.74413;173.1985,237.9144;171.84007,230.44308;171.16086,222.29257;171.16086,214.14204;171.16086,206.67075;171.16086,199.19943;171.84007,194.44496;174.55692,187.65286;179.31139,181.53998;184.06586,176.7855;188.82031,172.71025;192.89558,169.99341;198.32925,166.59737;203.08372,163.88052;209.19661,161.8429;213.95108,161.16368;220.06396,159.80527;227.53528,159.80527;255.38287,158.44685;263.5334,157.76764;271.0047,157.76764;275.7592,157.76764;281.19284,157.76764;287.98495,157.76764;292.0602,157.76764;296.81467,158.44685;300.88992,158.44685;307.68204,159.12605;313.11572,159.80527;321.26624,159.80527;327.37912,160.48448;332.13358,161.8429;335.52963,163.20132;338.9257,165.23895;341.64252,167.27658;346.397,174.74788;348.43463,176.7855;353.1891,183.5776;356.58514,188.33208;357.94354,191.04892;359.30197,193.76576;359.98117,197.1618;360.6604,200.55786;362.01883,206.67075;362.01883,212.10442;362.01883,216.85889;362.01883,222.29257;362.01883,226.36783;362.01883,233.15993;361.3396,236.55597;358.62277,243.34807;357.26434,246.74413;354.54752,251.4986;351.83066,255.57385;349.11383,258.9699;343.68015,267.79962;331.45438,280.70462;325.3415,284.77988;321.94543,286.8175;317.87018,288.85513;313.11572,290.21356;309.04047,292.25116;302.92755,294.28882;298.1731,295.64722;293.41864,295.64722;287.98495,296.32642;279.1552,296.32642;273.72156,296.32642;268.28787,296.32642;261.49576,296.32642;255.38287,296.32642;249.26999,295.64722;245.19473,294.28882;241.11948,294.28882;237.04422,294.28882;232.28975,294.96802</ns0:gesture>
         </ns0:inklist>
      </ns0:ink>
   </ns0:annots>
</ns0:xfdf>

Strike Through Text Annotation Sample

<?xml version="1.0" encoding="UTF-8"?>
<ns0:xfdf xmlns:ns0="http://ns.adobe.com/xfdf/">
   <ns0:annots>
      <ns0:strikeout color="#EAF39C" date="D:20200225142818+00'00'" flags="" name="e4d910a0-ccfb-403f-8e5f-eaf03401629c" last-modifier="Administrator" page="7" rect="43.2,346.02597,227.70802,384.8708" title="Administrator" creationdate="D:20200225142114+00'00'" opacity="0.7" coords="43.2,384.8708,227.70802,384.8708,43.2,346.02597,227.70802,346.02597">
         <ns0:contents-richtext>
            <html xmlns="http://www.w3.org/1999/xhtml">
               <head />
               <body>Strike through text annotation content</body>
            </html>
         </ns0:contents-richtext>
         <ns0:contents>Strike through text annotation content</ns0:contents>
         <ns0:popup open="no" color="#EAF39C" flags="" page="7" rect="247.0,238.70273,362.46567,327.0" />
      </ns0:strikeout>
   </ns0:annots>
</ns0:xfdf>

Highlight Text Annotation Sample

<?xml version="1.0" encoding="UTF-8"?>
<ns0:xfdf xmlns:ns0="http://ns.adobe.com/xfdf/">
   <ns0:annots>
      <ns0:highlight color="#FF0000" date="D:20200225142809+00'00'" flags="" name="f0a2f3b6-8e37-4e50-a89a-4006432fe993" last-modifier="Administrator" page="6" rect="35.712,343.42673,234.31656,383.772" title="Administrator" creationdate="D:20200225142012+00'00'" opacity="1.0" coords="35.712,383.772,234.31656,383.772,35.712,343.42673,234.31656,343.42673">
         <ns0:contents-richtext>
            <html xmlns="http://www.w3.org/1999/xhtml">
               <head />
               <body>Highlight text annotation content</body>
            </html>
         </ns0:contents-richtext>
         <ns0:contents>Highlight text annotation content</ns0:contents>
         <ns0:popup open="no" color="#EAF39C" flags="" page="6" rect="254.0,235.70273,369.46567,324.0" />
      </ns0:highlight>
   </ns0:annots>
</ns0:xfdf>

Stamp Annotation Sample

<?xml version="1.0" encoding="UTF-8"?>
<ns0:xfdf xmlns:ns0="http://ns.adobe.com/xfdf/">
   <ns0:annots>
      <ns0:stamp color="#FF0000" date="D:20200225142813+00'00'" flags="" name="0c3c78d7-0e74-48c8-a61e-94ee2b22c91a" last-modifier="Administrator" page="7" rect="132.4459,197.1618,419.75165,220.25494" title="Administrator" creationdate="D:20200225142137+00'00'" opacity="1.0" rotation="350">
         <ns0:contents-richtext>
            <html xmlns="http://www.w3.org/1999/xhtml">
               <head />
               <body>Urgent stamp annotation content</body>
            </html>
         </ns0:contents-richtext>
         <ns0:contents>Urgent stamp annotation content</ns0:contents>
         <ns0:popup open="no" color="#EAF39C" flags="" page="7" rect="212.0,89.70273,327.46567,178.0" />
         <ns0:appearance>fontSize:20;fontColor:red;borderWidth:1;borderColor:red;backgroundColor:none;</ns0:appearance>
      </ns0:stamp>
   </ns0:annots>
</ns0:xfdf>

Redaction Sample

<?xml version="1.0" encoding="UTF-8"?>
<ns0:xfdf xmlns:ns0="http://ns.adobe.com/xfdf/">
  <ns0:annots>
    <ns0:square color="#000000" flags="obfuscate" name"cc69e194-a069-42bd-b884-d6925501c606" last-modifier="Administrator" page="0" rect="60.588005,209.8001,413.76715,331.5406" title="Administrator" creationdate="D:20220705101305+00'00'" opacity="1.0" fringe="0.0,0.0,0.0,0.0" interior-color="#000000" width="0.0" style="solid" intensity=""/>
  </ns0:annots>
</ns0:xfdf>