Browse our Products
If so you can download any of the below versions for testing. The product will function as normal except for an evaluation limitation. At the time of purchase we provide a license file via email that will allow the product to work in its full capacity. If you would also like an evaluation license to test without any restrictions for 30 days, please follow the directions provided here.
If you experience errors, when you try to download a file, make sure your network policies (enforced by your company or ISP) allow downloading ZIP and/or MSI files.
Product Page | Docs | Demos | API Reference | Blog | Free Support | Temporary License
GroupDocs.Annotation for Python via .NET is a document-annotation API for adding, editing, and removing markup on documents and images. Draw area, point, arrow, ellipse, and distance shapes; highlight, underline, strikeout, squiggly, and replace text; add watermarks, images, links, and text fields; thread review comments (replies) on any annotation; then save the result back to the original format or export/import the annotations as XML — across PDF, Word, Excel, PowerPoint, Visio, images, and more through one unified API, with no MS Office or other external software required.
pip install groupdocs-annotation-net
from groupdocs.annotation import Annotator
from groupdocs.annotation.models.annotation_models import AreaAnnotation
from groupdocs.annotation.models import Rectangle
with Annotator("document.pdf") as annotator:
area = AreaAnnotation()
area.box = Rectangle(100, 100, 200, 80) # x, y, width, height
area.page_number = 0
area.message = "Review this section"
annotator.add(area)
annotator.save("annotated.pdf")
The package is a self-contained Python wheel that bundles the embedded .NET runtime and every native dependency (SkiaSharp, Aspose.Drawing) needed to load, annotate, render, and save documents. No external software installation is required — just pip install and start annotating. The wheel works across Python 3.5 – 3.14 on Windows, Linux, and macOS (Intel + Apple Silicon).
For a complete list, see supported formats.
| Category | Formats |
|---|---|
| Word Processing | DOC, DOCX, DOCM, DOT, DOTX, DOTM, RTF, ODT, OTT, TXT |
| Spreadsheets | XLS, XLSX, XLSM, XLSB, ODS, CSV |
| Presentations | PPT, PPTX, PPTM, PPS, PPSX, ODP |
| Fixed-Layout | PDF, TEX |
| Diagrams | VSD, VSDX, VSS, VSSX, VSDM |
| Images | BMP, JPG, JPEG, PNG, GIF, TIFF, WEBP, DCM, EMF, WMF |
| Web & Email | HTML, MHTML, EML, EMLX, MSG |
from groupdocs.annotation import Annotator
from groupdocs.annotation.models.annotation_models import AreaAnnotation
from groupdocs.annotation.models import Rectangle
with Annotator("document.pdf") as annotator:
area = AreaAnnotation()
area.box = Rectangle(100, 100, 200, 80) # x, y, width, height
area.background_color = 65535 # ARGB integer
area.page_number = 0
area.message = "Needs review"
annotator.add(area)
annotator.save("annotated.pdf")
from groupdocs.annotation import Annotator
from groupdocs.annotation.models.annotation_models import AreaAnnotation
from groupdocs.annotation.models import Rectangle, Reply
reply1 = Reply(); reply1.comment = "Please double-check the figures"
reply2 = Reply(); reply2.comment = "Confirmed — looks good"
with Annotator("document.pdf") as annotator:
area = AreaAnnotation()
area.box = Rectangle(80, 80, 160, 60)
area.page_number = 0
area.replies = [reply1, reply2]
annotator.add(area)
annotator.save("reviewed.pdf")
from groupdocs.annotation import Annotator
with Annotator("annotated.pdf") as annotator:
annotations = annotator.get() # all annotations on the document
for a in annotations:
print(a.id, a.page_number, a.message)
if annotations:
annotator.remove(annotations[0]) # by object (or annotator.remove(id))
annotator.save("cleaned.pdf")
from groupdocs.annotation import Annotator
with Annotator("annotated.pdf") as annotator:
versions = annotator.get_versions_list() # available annotation versions
for v in versions:
print("version:", v)
for a in annotator.get_version(v): # annotations in that version
print(" ", a.id, a.message)
from groupdocs.annotation import Annotator
from groupdocs.annotation.options import PreviewOptions, PreviewFormats
def create_page_stream(page_number):
return open(f"page-{page_number}.png", "wb")
with Annotator("document.pdf") as annotator:
opts = PreviewOptions(create_page_stream)
opts.preview_format = PreviewFormats.PNG
opts.page_numbers = [0, 1]
annotator.document.generate_preview(opts)
import io
from groupdocs.annotation import Annotator
from groupdocs.annotation.models.annotation_models import AreaAnnotation
from groupdocs.annotation.models import Rectangle
with open("document.pdf", "rb") as src:
with Annotator(src) as annotator:
area = AreaAnnotation(); area.box = Rectangle(50, 50, 120, 40); area.page_number = 0
annotator.add(area)
buffer = io.BytesIO()
annotator.save(buffer) # BytesIO is updated after save
data = buffer.getvalue()
This package is designed for seamless integration with AI agents, LLMs, and automated code generation tools.
AGENTS.md in the package — AI coding assistants (Claude Code, Cursor, GitHub Copilot) auto-discover the API surface, usage patterns, and troubleshooting tips from the installed package{ "mcpServers": { "groupdocs-docs": { "url": "https://docs.groupdocs.com/mcp" } } }
https://docs.groupdocs.com/annotation/python-net/llms-full.txt.md to any docs URLThe API works without a license in evaluation mode, with these limitations:
To remove these limitations, apply a license or request a temporary license:
from groupdocs.annotation import License
License().set_license("path/to/license.lic")
Or set the environment variable (auto-applied at import):
export GROUPDOCS_LIC_PATH="path/to/license.lic"
| Issue | Platform | Fix |
|---|---|---|
| Evaluation watermark on output | All | Apply a license — License().set_license(...) or set GROUPDOCS_LIC_PATH |
System.Drawing.Common is not supported | Linux/macOS | apt-get install libgdiplus (Linux) or brew install mono-libgdiplus (macOS) |
The type initializer for 'Gdip' threw an exception | macOS | brew install mono-libgdiplus |
| Garbled text / missing fonts in output | Linux | apt-get install ttf-mscorefonts-installer fontconfig && fc-cache -f |
DOTNET_SYSTEM_GLOBALIZATION_INVARIANT errors | Linux | Do NOT set this variable. ICU must be available. |
Also available for other platforms: .NET | Java | Node.js
Product Page | Docs | Demos | API Reference | Blog | Free Support | Temporary License
GroupDocs.Annotation GroupDocs.Total Python PyPi Document-Annotation Text-Extraction Markup PDF Word-Processing Spreadsheet Presentation Image-Processing
Self-contained Python wheel of GroupDocs.Annotation 26.6 for Windows (x64). Compatible with Python 3.5-3.14. No external dependencies required. Add annotations, markups and comments to documents and images.
Added: 18/6/2026
Downloads:
File Size: 144.03MB
Self-contained Python wheel of GroupDocs.Annotation 26.6 for Linux (x64). Compatible with Python 3.5-3.14. Requires libgdiplus, libfontconfig1, and fonts (e.g. ttf-mscorefonts-installer). Add annotations, markups and comments to documents and images.
Added: 18/6/2026
Downloads:
File Size: 143.38MB
Self-contained Python wheel of GroupDocs.Annotation 26.6 for macOS arm64 (Apple Silicon). Compatible with Python 3.5-3.14. Requires mono-libgdiplus (brew install mono-libgdiplus). Add annotations, markups and comments to documents and images.
Added: 18/6/2026
Downloads:
File Size: 143.2MB
Self-contained Python wheel of GroupDocs.Annotation 26.6 for macOS amd64 (Intel). Compatible with Python 3.5-3.14. Requires mono-libgdiplus (brew install mono-libgdiplus). Add annotations, markups and comments to documents and images.
Added: 18/6/2026
Downloads:
File Size: 145.32MB