Skip to content
ComPDF
New Release

Open-Source PDF SDK & AI Document Processing

Get the full self-hosted SDK and AI document processing on GitHub. One-click deploy to quickly build your document workflows.

Add Annotations to PDF

This sample shows how to set the annotations (including markup, notes, ink, free text, shapes, stamp, and so on), and delete them

javascript
// Import the JS file of ComPDFKit Web Demo.
<script src="/webviewer.global.js"></script>;

const viewer = document.getElementById('webviewer');
ComPDFKitViewer.init({
  pdfUrl: 'Your PDF Url',
  license: 'Input your license here'
}, viewer)
.then((core) => {
  const docViewer = core.docViewer;
  docViewer.addEvent('documentloaded', () => {
    console.log('ComPDFKit Web Demo loaded');

    // Sample1: Create annotations.
    CreateAnnots(docViewer);

    // Sample2: Delete Annotations.
    DeleteAnnotations(docViewer);
  })
})

function CreateAnnots(docViewer) {
  CreateNoteAnnotation(docViewer);
  CreateLinkAnnotation(docViewer);
  CreateFreetextAnnotation(docViewer);
  CreateShapeAnnotation(docViewer);
  CreateMarkupAnnotation(docViewer);
  CreateInkAnnotation(docViewer);
  CreateStampAnnotation(docViewer);
}

// Create note annotation.
function CreateNoteAnnotation(docViewer) {
  docViewer.addAnnotations({
    type: 'text',
    pageIndex: 0,
    color: '#FF0000',
    fontSize: 16,
    fontName: 'Helvetica',
    opacity: 1,
    contents: 'test',
    rect: {
      left: 100,
      top: 30,
      right: 124,
      bottom: 54
    }
  });
}

// Create link annotation.
function CreateLinkAnnotation(docViewer) {
  // Add a hyperlink.
  docViewer.addAnnotations({
    type: 'link',
    pageIndex: 0,
    rect: {
      left: 92,
      top: 200,
      right: 167,
      bottom: 230
    },
    url: 'https://example.com'
  });

  // Add a intra-document link.
  docViewer.addAnnotations({
    type: 'link',
    pageIndex: 0,
    rect: {
      left: 92,
      top: 200,
      right: 167,
      bottom: 230
    },
    destPage: 2
  });
}

// Create freetext annotation.
function CreateFreetextAnnotation(docViewer) {
  docViewer.addAnnotations({
    type: 'freetext',
    pageIndex: 0,
    color: '#000000',
    fontSize: 16,
    fontName: 'Helvetica',
    opacity: 1,
    textAlignment: 'left',
    contents: 'test',
    rect: {
      left: 100,
      top: 200,
      right: 160,
      bottom: 240
    }
  });
}

// Create shape annotations.
function CreateShapeAnnotation(docViewer) {
  // Square.
  docViewer.addAnnotations({
    type: 'square',
    pageIndex: 0,
    rect: {
      left: 50,
      top: 50,
      right: 100,
      bottom: 100
    },
    borderWidth: 2,
    opacity: 1,
    fillTransparency: 1,
    fillColor: '',
    color: '#FF0000',
    borderColor: '#FF0000',
    borderStyle: 'solid',
    dashes: []
  });

  // Circle.
  docViewer.addAnnotations({
    type: 'circle',
    pageIndex: 0,
    rect: {
      left: 50,
      top: 50,
      right: 100,
      bottom: 100
    },
    borderWidth: 2,
    opacity: 1,
    fillTransparency: 1,
    fillColor: '',
    color: '#FF0000',
    borderColor: '#FF0000',
    borderStyle: 'solid',
    dashes: []
  });

  // Line.
  docViewer.addAnnotations({
    type: 'line',
    pageIndex: 0,
    linePoints: [50, 50, 100, 100],
    rect: {
      left: 50,
      top: 50,
      right: 100,
      bottom: 100
    },
    borderWidth: 2,
    opacity: 1,
    color: '#FF0000',
    borderColor: '#FF0000',
    borderStyle: 'solid',
    dashes: [],
  });

  // Polygon.
  docViewer.addAnnotations({
    type: 'polygon',
    pageIndex: 0,
    rect: {
      left: 114,
      top: 302,
      right: 310,
      bottom: 447
    },
    vertices: [
      { x: 156, y: 328 },
      { x: 230, y: 302 },
      { x: 300, y: 362 },
      { x: 310, y: 436 },
      { x: 180, y: 447 },
      { x: 114, y: 395 }
    ],
    borderWidth: 2,
    opacity: 1,
    fillTransparency: 1,
    fillColor: '',
    color: '#FF0000',
    borderColor: '#FF0000',
    borderStyle: 'solid',
    dashes: [],
  });

  // Multiline.
  docViewer.addAnnotations({
    type: 'polyline',
    pageIndex: 0,
    rect: {
      left: 130,
      top: 120,
      right: 263,
      bottom: 232
    },
    vertices: [
      { x: 130, y: 156 },
      { x: 202, y: 120 },
      { x: 263, y: 223 },
      { x: 157, y: 232 }
    ],
    borderWidth: 2,
    opacity: 1,
    color: '#FF0000',
    borderColor: '#FF0000',
    borderStyle: 'solid',
    dashes: [],
  });

  // Arc.
  docViewer.addAnnotations({
    type: 'ink',
    pageIndex: 0,
    arcPoints: [
      { x: 92, y: 225 },
      { x: 233, y: 169 },
      { x: 143, y: 98 }
    ],
    inkPointes: [
      [
        { PointX: 92, PointY: 225 },
        { PointX: 233, PointY: 169 },
        { PointX: 143, PointY: 98 }
      ]
    ],
    borderWidth: 2,
    opacity: 1,
    color: '#FF0000',
    borderColor: '#FF0000',
  });
}

// Create markup annotation.
function CreateMarkupAnnotation(docViewer) {
  docViewer.addAnnotations({
    type: 'highlight',  // Types include highlight, underline, strikeout, squiggly.
    pageIndex: 0,
    opacity: 0.8,
    quadPoints: [
      { PointX: 116, PointY: 300 },
      { PointX: 360, PointY: 300 },
      { PointX: 116, PointY: 360 },
      { PointX: 360, PointY: 360 },
    ],
    rect: {
      left: 116,
      top: 300,
      right: 360,
      bottom: 360
    },
    color: '#FF0000',
    contents: 'test'
  });
}

// Create ink annotation.
function CreateInkAnnotation(docViewer) {
  docViewer.addAnnotations({
    type: 'ink',
    pageIndex: 0,
    borderWidth: 2,
    opacity: 0.8,
    borderColor: '#FF0000',
    inkPointes: [[
      { PointX: 9.20, PointY: 34 },
      { PointX: 9.20, PointY: 34 },
      { PointX: 9.20, PointY: 33 },
      { PointX: 9.20, PointY: 31 },
      { PointX: 10.20, PointY: 31 },
      { PointX: 11.20, PointY: 30 },
      { PointX: 12.20, PointY: 28 },
      { PointX: 13.2, PointY: 27 },
      { PointX: 13.2, PointY: 26 },
      { PointX: 15.2, PointY: 24 },
      { PointX: 17.2, PointY: 23 },
      { PointX: 22.2, PointY: 19 }
    ]],
    rect: {
      left: 9.2,
      top: 19,
      right: 22.2,
      bottom: 34
    }
  });
}

// Create stamp annotation.
function CreateStampAnnotation(docViewer) {
  // Standard stamp.
  docViewer.addAnnotations({
    type: 'stamp',
    pageIndex: 0,
    rect: {
      left: 205,
      top: 379,
      right: 435,
      bottom: 431
    },
    stampType: 'standard',
    contents: 'NotApproved'
  });

  // Text stamp.
  docViewer.addAnnotations({
    type: 'stamp',
    pageIndex: 0,
    rect: {
      left: 220,
      top: 367,
      right: 320,
      bottom: 412
    },
    stampType: 'text',
    contents: 'REVISED',
    time: '28/07/2023 07:28:28',
    stampColor: 1,
    stampShape: 0
  });
}

// Delete all annotations.
async function DeleteAnnotations(docViewer) {
  docViewer.deleteAnnotations();
}