GroupDocs.Comparison for Python 26.5.0 متاح الآن. هذا هو الإصدار الأول على PyPI منذ 25.12 ويقدم غلافًا بحتًا بلغة Python، ملف AGENTS.md المدمج لاكتشاف مساعد الذكاء الاصطناعي، سكريبت وحدة تحكم جديد، وإعادة هيكلة شاملة للوثائق.

What’s new in this release

Key Category Summary
COMPARISONPYTHON-34 Feature Pure-Python wrapper rebuild — public API is now fully introspectable from Python
COMPARISONPYTHON-35 Feature Ship AGENTS.md inside the wheel for AI-agent discovery
COMPARISONPYTHON-36 Feature New documentation page: Agents and LLM Integration (MCP server, bundled AGENTS.md, LLM‑optimized docs)
COMPARISONPYTHON-39 Feature Console script groupdocs-comparison installed with the wheel — compare, info, list-formats subcommands
COMPARISONPYTHON-38 Enhancement Documentation restructure — developer-guide/comparing-documents/ consolidates comparison-basic/ and advanced-usage/comparison/; loading and saving flattened

Public API changes

The 26.x wrapper was rebuilt with a new generator that exposes a broader public API and cleans up a few member names. Most existing scripts written against 25.12 run unchanged on 26.5; the changes below are grouped by compatibility impact.

Newly-visible top-level classes

These classes existed in 25.12 internals but were hidden from Python introspection by the Nuitka‑compiled wrapper. They are now directly importable:

from groupdocs.comparison.license import License, Metered
from groupdocs.comparison.options import (
    Color, PdfCompareOptions, WordCompareOptions, CalculateCoordinatesModeEnumeration,
    ChangeType, ComparisonDisplayMode, DetalisationLevel, FolderComparisonExtension,
    ImagesInheritance, MetadataType, PagesSetup, PaperSize, PasswordSaveOption,
    PreviewFormats, PreviewResolution,
)
from groupdocs.comparison.result import ComparisonAction, FileType, Rectangle

New Color class

StyleSettings.font_color, .highlight_color, .shape_color, and .boarder_color now accept any of:

from groupdocs.comparison.options import Color

# Named‑color factory
style.font_color = Color.from_name("firebrick")

# RGB / RGBA tuple
style.font_color = (255, 0, 0)
style.font_color = (255, 0, 0, 128)

# Hex string
style.font_color = "#FF8800"
style.font_color = "#80FF8800"  # AARRGGBB

# Packed ARGB int
style.font_color = 0xFF0000

# Or a Color instance directly
style.font_color = Color(178, 34, 34, 255)

Color is importable from groupdocs.comparison, groupdocs.comparison.options, and groupdocs.pydrawing—all three paths resolve to the same class.

Callable‑based PreviewOptions

PreviewOptions constructor accepts a Python callable for the CreatePageStream delegate. The callback signature is (page_number) -> writable_stream:

from groupdocs.comparison.options import PreviewOptions, PreviewFormats

def create_page_stream(page_number):
    return open(f"page-{page_number}.png", "wb")

def release_page_stream(page_number):
    pass  # the bridge has already flushed/closed the stream

with Comparer("source.docx") as comparer:
    preview = PreviewOptions(create_page_stream, release_page_stream)
    preview.preview_format = PreviewFormats.PNG
    preview.page_numbers = [1, 2, 3]
    comparer.source.generate_preview(preview)

PreviewOptions(create_page_stream) (single‑arg, no release callback) is also valid.

Typed Rectangle from coordinate properties

options = CompareOptions(calculate_coordinates=True)
with Comparer("source.docx") as comparer:
    comparer.add("target.docx")
    comparer.compare(options)
    for change in comparer.get_changes():
        b = change.box
        print(f"({b.x:.1f}, {b.y:.1f}) {b.width:.1f}x{b.height:.1f}")
# (488.96, 223.86) 71.09x36.80 — '…'

The fix is product‑wide—applies to every value‑typed property across every product (Point, Size, etc., not just Rectangle).

Property‑name kwargs on options constructors

opts = ApplyChangeOptions(changes=changes, save_original_state=True)
save = SaveOptions(password="secret")
load = LoadOptions(password="open-sesame")
comp = CompareOptions(detect_style_changes=True, sensitivity_of_comparison=85)

The setter pattern still works (opts = ApplyChangeOptions(); opts.changes = changes). Unknown kwargs raise TypeError.

New overload‑suffixed methods

A set of overload‑suffixed methods has been added to the public surface so each .NET overload is callable from Python by an explicit, non‑ambiguous name. Examples:

  • Comparer.add_file(path), add_stream(stream), add_streams(streams), add_string(text)
  • Comparer.apply_changes_file(path, options), apply_changes_stream(stream, options), …
  • Comparer.compare_file(...), compare_stream(...), compare_streams(...), compare_string(...), compare_compare_options(...), compare_save_options(...)
  • Comparer.compare_directory_file(...), compare_directory_string(...)
  • Comparer.get_changes_change_type(...), get_changes_get_change_options(...)
  • License.set_license_file(...), set_license_stream(...), set_license_streams(...), set_license_string(...)
  • Metered.set_metered_key_file(...), set_metered_key_string(...)
  • Document.generate_preview_preview_options(...)
  • localization.SupportedLocales.is_locale_supported_culture_info(...), is_locale_supported_file(...), is_locale_supported_string(...)

Explicit Comparer.dispose()

Available for callers who prefer not to use the with context‑manager idiom. The recommended pattern remains:

with Comparer("source.docx") as comparer:
    comparer.add("target.docx")
    comparer.compare("result.docx")

Enum casing

All enums use UPPERCASE Python convention. Common enums:

from groupdocs.comparison.result import ComparisonAction, FileType
from groupdocs.comparison.options import (
    ChangeType, ComparisonDisplayMode, DetalisationLevel,
    FolderComparisonExtension, ImagesInheritance, MetadataType,
    PaperSize, PasswordSaveOption, PreviewFormats, PreviewResolution,
)
from groupdocs.comparison.words.revision import RevisionAction

ComparisonAction.ACCEPT, ComparisonAction.REJECT, ComparisonAction.NONE
RevisionAction.ACCEPT, RevisionAction.REJECT, RevisionAction.NONE
PreviewFormats.PNG, PreviewFormats.JPG
MetadataType.SOURCE, MetadataType.TARGET, MetadataType.FILE_AUTHOR
PasswordSaveOption.USER, PasswordSaveOption.SOURCE, PasswordSaveOption.TARGET

If you were on 25.12 documentation that showed .Accept/.Reject style values, update them to the uppercase form.

Code example

Below is a minimal example that demonstrates importing the newly visible top‑level classes and performing a simple comparison:

from groupdocs.comparison import Comparer
from groupdocs.comparison.options import CompareOptions

options = CompareOptions(detect_style_changes=True)

with Comparer("source.docx") as comparer:
    comparer.add("target.docx")
    comparer.compare(options)
    for change in comparer.get_changes():
        print(f"Change type: {change.change_type}, Box: {change.box}")

How to get the update

PyPI

pip install groupdocs-comparison-net==26.5.0

The wheel is published on public PyPI: https://pypi.org/project/groupdocs-comparison-net/

Direct download

No direct download links are provided; obtain the package via PyPI or the GroupDocs website.

Resources