Guides
Add Annotations to PDF
This sample shows how to print the annotation list information, set the annotations (including markup, note, ink, freetext, circle, square, line, stamp, and sound annotations), and delete the annotations
C#
using ComPDFKit.Import;
using ComPDFKit.PDFAnnotation;
using ComPDFKit.PDFDocument;
using ComPDFKit.PDFPage;
using System;
using System.Collections.Generic;
using System.IO;
using ImageMagick;
namespace AnnotationTest
{
internal class AnnotationTest
{
static private string parentPath = Path.GetDirectoryName(Path.GetDirectoryName(Path.GetDirectoryName(System.IO.Directory.GetCurrentDirectory())));
static private string outputPath = Path.Combine(parentPath, "Output", "CS");
static void Main(string[] args)
{
#region Preparation work
Console.WriteLine("Running Annotation test sample…" + Environment.NewLine);
SDKLicenseHelper.LicenseVerify();
CPDFDocument document = CPDFDocument.InitWithFilePath("CommonFivePage.pdf");
if (!Directory.Exists(outputPath))
{
Directory.CreateDirectory(outputPath);
}
#endregion
#region Sample 1: Create annotations
if (CreateAnnots(document))
{
Console.WriteLine("Create annots done.");
}
Console.WriteLine("--------------------");
#endregion
#region Sample 2: Delete annotations
CPDFDocument annotsDocument = CPDFDocument.InitWithFilePath("Annotations.pdf");
if (DeleteAnnotations(annotsDocument))
{
Console.WriteLine("Create annots done.");
}
Console.WriteLine("--------------------");
#endregion
Console.WriteLine("Done");
Console.WriteLine("--------------------");
Console.ReadLine();
}
/// <summary>
/// Create freetext annotation
/// </summary>
static private void CreateFreetextAnnotation(CPDFDocument document)
{
CPDFPage page = document.PageAtIndex(0);
CPDFFreeTextAnnotation freeText = page.CreateAnnot(C_ANNOTATION_TYPE.C_ANNOTATION_FREETEXT) as CPDFFreeTextAnnotation;
string str = "ComPDFKit Samples";
freeText.SetContent(str);
freeText.SetRect(new CRect(0, 100, 160, 0));
CTextAttribute textAttribute = new CTextAttribute();
textAttribute.FontName = "Helvetica";
textAttribute.FontSize = 12;
byte[] fontColor = { 255, 0, 0 };
textAttribute.FontColor = fontColor;
freeText.SetFreetextDa(textAttribute);
freeText.SetFreetextAlignment(C_TEXT_ALIGNMENT.ALIGNMENT_CENTER);
freeText.UpdateAp();
}
/// <summary>
/// Create freehand annotations
/// </summary>
/// <param name="document"></param>
static private void CreateFreehandAnnotation(CPDFDocument document)
{
CPDFPage page = document.PageAtIndex(0);
CPDFInkAnnotation ink = page.CreateAnnot(C_ANNOTATION_TYPE.C_ANNOTATION_INK) as CPDFInkAnnotation;
ink.SetInkColor(new byte[] { 255, 0, 0 });
ink.SetBorderWidth(2);
ink.SetTransparency(128);
List<List<CPoint>> points = new List<List<CPoint>>();
ink.SetInkPath(points);
ink.SetThickness(8);
points.Clear();
points.Add(new List<CPoint>()
{
new CPoint(10,100),
new CPoint(100,10),
});
ink.SetInkPath(points);
ink.UpdateAp();
}
/// <summary>
/// Create Shape annotations
/// Include:
/// Square, Circle, Line
/// </summary>
/// <param name="document"></param>
static private void CreateShapeAnnotation(CPDFDocument document)
{
CPDFPage page = document.PageAtIndex(0);
float[] dashArray = { 2, 1 };
byte[] lineColor = { 255, 0, 0 };
byte[] bgColor = { 0, 255, 0 };
// Square
CPDFSquareAnnotation square = page.CreateAnnot(C_ANNOTATION_TYPE.C_ANNOTATION_SQUARE) as CPDFSquareAnnotation;
square.SetRect(new CRect(10, 250, 200, 200));
square.SetLineColor(lineColor);
square.SetBgColor(bgColor);
square.SetTransparency(120);
square.SetLineWidth(1);
square.SetBorderStyle(C_BORDER_STYLE.BS_DASHDED, dashArray);
square.UpdateAp();
// Circle
CPDFCircleAnnotation circle = page.CreateAnnot(C_ANNOTATION_TYPE.C_ANNOTATION_CIRCLE) as CPDFCircleAnnotation;
circle.SetRect(new CRect(10, 410, 110, 300));
circle.SetLineColor(lineColor);
circle.SetBgColor(bgColor);
circle.SetTransparency(120);
circle.SetLineWidth(1);
circle.SetBorderStyle(C_BORDER_STYLE.BS_DASHDED, dashArray);
circle.UpdateAp();
// Line
CPDFLineAnnotation line = page.CreateAnnot(C_ANNOTATION_TYPE.C_ANNOTATION_LINE) as CPDFLineAnnotation;
line.SetLinePoints(new CPoint(300, 300), new CPoint(350, 350));
line.SetLineType(C_LINE_TYPE.LINETYPE_NONE, C_LINE_TYPE.LINETYPE_CLOSEDARROW);
line.SetLineColor(lineColor);
line.SetTransparency(120);
line.SetLineWidth(1);
line.SetBorderStyle(C_BORDER_STYLE.BS_DASHDED, dashArray);
line.UpdateAp();
}
/// <summary>
/// Create note annotations
/// </summary>
/// <param name="document"></param>
static private void CreateNoteAnnotation(CPDFDocument document)
{
CPDFPage page = document.PageAtIndex(0);
CPDFTextAnnotation textAnnotation = page.CreateAnnot(C_ANNOTATION_TYPE.C_ANNOTATION_TEXT) as CPDFTextAnnotation;
textAnnotation.SetColor(new byte[] { 255, 0, 0 });
textAnnotation.SetTransparency(255);
textAnnotation.SetContent("ComPDFKit");
textAnnotation.SetRect(new CRect(300, 650, 350, 600));
textAnnotation.UpdateAp();
}
/// <summary>
/// Create sound annotations
/// </summary>
/// <param name="document"></param>
static private void CreateSoundAnnotation(CPDFDocument document)
{
CPDFPage page = document.PageAtIndex(1);
CPDFSoundAnnotation sound = page.CreateAnnot(C_ANNOTATION_TYPE.C_ANNOTATION_SOUND) as CPDFSoundAnnotation;
sound.SetRect(new CRect(400, 750, 450, 700));
using (var image = new MagickImage("SoundAnnot.png"))
{
byte[] byteArray = image.ToByteArray(MagickFormat.Bgra);
sound.SetSoundPath(byteArray, image.Width, image.Height, "Bird.wav");
}
sound.UpdateAp();
}
/// <summary>
/// Create Markup annotations
/// </summary>
/// <param name="document"></param>
static private void CreateMarkupAnnotation(CPDFDocument document)
{
List<CRect> cRectList = new List<CRect>();
CRect rect = new CRect(300, 300, 400, 240);
cRectList.Add(rect);
byte[] color = { 255, 0, 0 };
//highlight
CPDFPage page1 = document.PageAtIndex(0);
CPDFHighlightAnnotation highlight = page1.CreateAnnot(C_ANNOTATION_TYPE.C_ANNOTATION_HIGHLIGHT) as CPDFHighlightAnnotation;
highlight.SetColor(color);
highlight.SetTransparency(120);
highlight.SetQuardRects(cRectList);
highlight.UpdateAp();
//underline
CPDFPage page2 = document.PageAtIndex(1);
CPDFUnderlineAnnotation underline = page2.CreateAnnot(C_ANNOTATION_TYPE.C_ANNOTATION_UNDERLINE) as CPDFUnderlineAnnotation;
underline.SetColor(color);
underline.SetTransparency(120);
underline.SetQuardRects(cRectList);
underline.UpdateAp();
//strikeout
CPDFPage page3 = document.PageAtIndex(2);
CPDFStrikeoutAnnotation strikeout = page3.CreateAnnot(C_ANNOTATION_TYPE.C_ANNOTATION_STRIKEOUT) as CPDFStrikeoutAnnotation;
strikeout.SetColor(color);
strikeout.SetTransparency(120);
strikeout.SetQuardRects(cRectList);
strikeout.UpdateAp();
//squiggly
CPDFPage page4 = document.PageAtIndex(3);
CPDFSquigglyAnnotation squiggy = page4.CreateAnnot(C_ANNOTATION_TYPE.C_ANNOTATION_SQUIGGLY) as CPDFSquigglyAnnotation;
squiggy.SetColor(color);
squiggy.SetTransparency(120);
squiggy.SetQuardRects(cRectList);
squiggy.UpdateAp();
}
/// <summary>
/// Create stamp annotation
/// </summary>
/// <param name="document"></param>
static private void CreateStampAnnotation(CPDFDocument document)
{
CPDFPage page = document.PageAtIndex(0);
// Standard
CPDFStampAnnotation standard = page.CreateAnnot(C_ANNOTATION_TYPE.C_ANNOTATION_STAMP) as CPDFStampAnnotation;
standard.SetStandardStamp("Approved");
standard.SetRect(new CRect(300, 160, 450, 100));
standard.UpdateAp();
// Text
CPDFStampAnnotation text = page.CreateAnnot(C_ANNOTATION_TYPE.C_ANNOTATION_STAMP) as CPDFStampAnnotation;
text.SetTextStamp("test", "detail text", C_TEXTSTAMP_SHAPE.TEXTSTAMP_LEFT_TRIANGLE, C_TEXTSTAMP_COLOR.TEXTSTAMP_RED);
text.SetRect(new CRect(300, 300, 450, 220));
text.UpdateAp();
// Image
CPDFStampAnnotation stampAnnotation = page.CreateAnnot(C_ANNOTATION_TYPE.C_ANNOTATION_STAMP) as CPDFStampAnnotation;
using (var image = new MagickImage("ComPDFKit_Logo.ico"))
{
byte[] byteArray = image.ToByteArray(MagickFormat.Bgra);
stampAnnotation.SetImageStamp(byteArray, image.Width, image.Height);
}
stampAnnotation.SetRect(new CRect(300, 400, 380, 320));
stampAnnotation.SetTransparency(255);
stampAnnotation.UpdateAp();
}
private static void CreateLinkAnnotation(CPDFDocument document)
{
CPDFPage page = document.PageAtIndex(0);
CPDFDestination dest = new CPDFDestination();
dest.PageIndex = 1;
CPDFLinkAnnotation link = page.CreateAnnot(C_ANNOTATION_TYPE.C_ANNOTATION_LINK) as CPDFLinkAnnotation;
link.SetRect(new CRect(0, 50, 50, 0));
link.SetDestination(document, dest);
}
/// <summary>
/// Create annotations
/// </summary>
/// <param name="document"></param>
/// <returns></returns>
static private bool CreateAnnots(CPDFDocument document)
{
CreateFreetextAnnotation(document);
CreateFreehandAnnotation(document);
CreateShapeAnnotation(document);
CreateNoteAnnotation(document);
CreateShapeAnnotation(document);
CreateSoundAnnotation(document);
CreateMarkupAnnotation(document);
CreateStampAnnotation(document);
CreateLinkAnnotation(document);
string path = Path.Combine(outputPath, "CreateAnnotsTest.pdf");
if (!document.WriteToFilePath(path))
{
return false;
}
Console.WriteLine("Browse the changed file in " + path);
return true;
}
/// <summary>
/// Delete the first annotation
/// </summary>
/// <param name="document"></param>
/// <returns></returns>
static private bool DeleteAnnotations(CPDFDocument document)
{
CPDFPage page = document.PageAtIndex(0);
List<CPDFAnnotation> annotList = page.GetAnnotations();
if (!annotList[0].RemoveAnnot())
{
return false;
}
string path = Path.Combine(outputPath , "DeleteAnnotsTest.pdf");
if (!document.WriteToFilePath(path))
{
return false;
}
Console.WriteLine("Browse the changed file in " + path);
return true;
}
}
}