GroupDocs.Metadata for Python via .NET 26.9 Release Notes

This release upgrades the GroupDocs.Metadata engine from 26.6 to 26.8. The package now installs a groupdocs-metadata command line, reads five more archive formats — Apple Archive (AAR), GZIP, BZ2, XZ and Zstandard — and opens PowerPoint presentations again on every platform. The Linux and macOS packages no longer need libgdiplus, the package works on Python 3.5 – 3.7 again, and the embedded .NET runtime moves from 10.0.0 to 10.0.12, the latest of the twelve servicing updates Microsoft has shipped for .NET 10, nine of them security releases.

Breaking change: the 26.8 engine moved 105 format classes out of 13 sub-namespaces into their parents, and the Python package follows it. Code that imports from one of those modules — for example from groupdocs.metadata.formats.audio.ogg import OggPackage — must import from the parent instead (from groupdocs.metadata.formats.audio import OggPackage). No class or member was removed or renamed; API Changes lists every moved module. On Linux and macOS the wheels now state the oldest system they run on, so installing needs pip 20.3 or newer — see Requirements.

Full List of Changes in This Release

KeyCategorySummary
METADATAPYTHON‑39FeatureShip command line interface within package
METADATAPYTHON‑62FeatureAdd support for reading Apple Archive (AAR), GZIP, BZ2, XZ and Zstandard archives
METADATAPYTHON‑63EnhancementUpdate GroupDocs.Metadata engine from 26.6 to 26.8
METADATAPYTHON‑64EnhancementUpdate the embedded .NET runtime from 10.0.0 to 10.0.12
METADATAPYTHON‑65EnhancementMove the Ogg, FB2, Mobi, MSG, DNG, SVG, raw tag, CR2 and 3D format classes into their parent modules, as in the 26.8 engine
METADATAPYTHON‑66EnhancementRemove the libgdiplus / mono-libgdiplus requirement on Linux and macOS
METADATAPYTHON‑67EnhancementAdd FileTypeFeatureSupport and the ProductFeature, SupportLevel and FormatFamily enums to the Python API
METADATAPYTHON‑68EnhancementAdd get() to indexed packages and collections, append() to IptcRecordSet, and a no-argument Rectangle() constructor
METADATAPYTHON‑69EnhancementPublish the API reference for every module, including formats.* and standards.*
METADATAPYTHON‑50FixCannot open PowerPoint presentations: DllNotFoundException for aspose.slides.drawing.capi
METADATAPYTHON‑51FixReading an EXIF tag by TiffTagID fails on Python 3.5 – 3.10
METADATAPYTHON‑70FixCannot use the package on Python 3.5 – 3.7
METADATAPYTHON‑71Fixpip installs the package on Linux and macOS versions that cannot run it

Major Features

Command line: groupdocs-metadata

Installing the package puts a groupdocs-metadata command on PATH (also python -m groupdocs.metadata), for shells, Make rules and CI steps:

groupdocs-metadata info photo.jpg                        # format, MIME type, size, pages, encryption
groupdocs-metadata show report.docx --tag person         # author, editor, ... with their tags
groupdocs-metadata clean report.docx                     # writes report.clean.docx
groupdocs-metadata remove photo.jpg --tag person.creator -o photo-anon.jpg
groupdocs-metadata export report.pdf -o metadata.json    # json, csv, xlsx, xls or xml
groupdocs-metadata list-formats

--tag takes a category (person, time, content, …) or one tag in it (person.creator), in the same form show prints. Files are read through a stream, so read-only inputs work, and clean / remove never overwrite the input unless -o names it. Every command takes --password, and --license applies a license first.

Apple Archive, GZIP, BZ2, XZ and Zstandard archives

The 26.8 engine reads the metadata of five more archive formats. Each has its own root package in groupdocs.metadata.formats.archive:

from groupdocs.metadata import Metadata

with Metadata("archive.gz") as metadata:
    print(metadata.get_document_info().file_type.file_format.name)  # GZIP
    print(metadata.get_root_package().gzip_package.total_entries)

with Metadata("archive.aar") as metadata:
    aar = metadata.get_root_package().aar_package
    print(aar.total_entries)
    for entry in aar.files:
        print(entry.name, entry.length, entry.is_directory)

bz2_package, xz_package and zstd_package work the same way (see Known Issues for the fields that are not filled in yet). In 26.7, GZIP, BZ2 and AAR files raised NotImplementedError, and XZ and Zstandard files were misread as MP3 audio.

PowerPoint presentations open again

Opening a PowerPoint file — .pptx, .ppt, .pot and the other presentation formats — failed in 26.7 on Windows, Linux and macOS with DllNotFoundException: Unable to load … aspose.slides.drawing.capi…, because the native library the engine needs for presentations was missing from the wheel. It ships in every 26.9 wheel, and on Windows the package now loads it itself, so presentations also open under the Microsoft Store Python, which does not search PATH for native libraries.

API Changes

New classes and members

  • groupdocs.metadata.formats.archive: AarRootPackage, AarPackage, AarFile, GzipRootPackage, GzipPackage, Bz2RootPackage, Bz2Package, XzRootPackage, XzPackage, ZstdRootPackage, ZstdPackage.
  • FileType.AAR, FileType.GZIP, FileType.BZ2, FileType.XZ, FileType.ZSTD, the same five members of FileFormat and MetadataType, and FileType.AVIF.
  • groupdocs.metadata.common: FileTypeFeatureSupport, FeatureSupport, and the ProductFeature, SupportLevel and FormatFamily enums.
  • get() on indexed packages and collections — MetadataPackage, ExifDictionaryBasePackage, IptcRecordSet, IptcRecord, XmpLangAlt and others — as an alternative to package[key]. The item property these classes exposed could not be called and is gone.
  • IptcRecordSet.append(), and a no-argument Rectangle() constructor.

Moved to the parent module

Old module (26.7)New module (26.9)Classes
groupdocs.metadata.formats.audio.ogggroupdocs.metadata.formats.audioOggPackage, OggRootPackage, OggUserComment
groupdocs.metadata.formats.ebook.fb2groupdocs.metadata.formats.ebookFb2Author, Fb2DocumentInfo, Fb2Genre, Fb2PublishInfo, Fb2Sequence, Fb2TitleInfo
groupdocs.metadata.formats.ebook.mobigroupdocs.metadata.formats.ebookMobiHeader, MobiPackage, MobiRootPackage, PDBHeader
groupdocs.metadata.formats.fb2groupdocs.metadata.formats.ebookFb2Package
groupdocs.metadata.formats.email.msggroupdocs.metadata.formats.emailMsgKnownProperties
groupdocs.metadata.formats.image.dnggroupdocs.metadata.formats.imageDngPackage, DngRootPackage
groupdocs.metadata.formats.image.svggroupdocs.metadata.formats.imageSvgPackage, SvgRootPackage
groupdocs.metadata.formats.imagegroupdocs.metadata.formats.rawRawDoubleTag, RawFloatTag, RawRationalTag, RawSByteTag, RawSLongTag, RawSRationalTag, RawSShortTag, RawUndefinedTag
groupdocs.metadata.formats.raw.taggroupdocs.metadata.formats.rawRawTag, RawArrayTag, RawAsciiTag, RawByteTag, RawLongTag, RawShortTag
groupdocs.metadata.formats.raw.cr2groupdocs.metadata.formats.raw56 of its 58 classes (Cr2MakerNotePackage, Cr2CameraSettingsPackage, the Cr2…Index enums, …)
groupdocs.metadata.formats.three_d.dae / .fbx / .gltf / .stl / .three_dsgroupdocs.metadata.formats.three_dDaeNode, DaePackage, DaeRootPackage, the Fbx…, Gltf…, Stl… and ThreeDS… classes

The 13 old modules are removed. Objects returned by the API are unaffected: root.ogg_package and the like return the same classes, now imported from the new modules.

Fixed

  • Cannot open PowerPoint presentations (METADATAPYTHON‑50). See Major Features.
  • Reading an EXIF tag by TiffTagID fails on Python 3.5 – 3.10 (METADATAPYTHON‑51). exif[TiffTagID.SOFTWARE] sent the enum to the engine as its name rather than its number, so the lookup failed — and the collection’s fallback then reported it as IndexError: list index out of range. Both are fixed: the enum goes through as a number, and an indexer that fails now reports the engine’s own error.
  • Cannot use the package on Python 3.5 – 3.7. In 26.7 import groupdocs.metadata failed on Python 3.5 and 3.6 with SyntaxError: future feature annotations is not defined, and on Python 3.7 the first call failed with AttributeError: module 'typing' has no attribute 'get_origin'. Both work in 26.9.
  • pip installs the package on Linux and macOS versions that cannot run it. The 26.7 wheels were tagged manylinux1_x86_64 (glibc 2.5), macosx_10_14_x86_64 and macosx_11_0_arm64. The .NET runtime inside them needs glibc 2.27 and macOS 12, so on an older system the install succeeded and the first call failed. The 26.9 wheels are tagged manylinux_2_27_x86_64, macosx_12_0_x86_64 and macosx_12_0_arm64, and pip refuses an older system up front. An unpinned pip install on such a system still falls back to 26.7 or older, which keep the old tags.

Known Issues

  • Page previews cannot be generated from Python yet: PreviewOptions takes page-stream callbacks, and passing a Python function raises TypeError: … cannot wrap function as GroupDocs.Metadata.Options.CreatePageStream.
  • The GZIP, BZ2 and Zstandard packages report name as File.bin and size as 0, whatever the archive holds: the file name and size stored in a GZIP header are not read yet. The XZ package reports the uncompressed size.
  • On Windows, opening a presentation can fail with The filename or extension is too long when the package is installed so deep that its native library’s path exceeds 260 characters — roughly, a virtual environment path longer than 170 characters. Install it closer to the drive root.
  • Metadata(path) opens the file for writing, so a read-only file fails with PermissionRuntimeError: Access to the path … is denied. Open it as a stream instead: with open(path, "rb") as f: Metadata(f).
  • Opening an .emz, .wmz or .svgz file — compressed image formats the library does not support — leaves decompressed temporary files in the current working directory.
  • Files of some unsupported formats — PST, OST, ISO, DLL, CHM and others — open as MP3 audio instead of raising an unsupported-format error (METADATAPYTHON‑72). 26.7 behaves the same way.

Documentation

  • Command Line Interface — new: every command, the --tag syntax and the exit codes.
  • System Requirements — libgdiplus removed; ICU and fontconfig on Linux; glibc 2.27+ and macOS 12+, and pip 20.3+ to install; Windows x64 only.
  • Installation — wheel file names for each platform with the oldest system each runs on, and the macOS Intel command.
  • Troubleshooting — fontconfig, ICU, old systems and pip, read-only files, and deep install paths on Windows.
  • Do I need libgdiplus? — replaces the libgdiplus installation guide.
  • The AGENTS.md inside the package carries the command line, the platform notes and the new troubleshooting entries.

Requirements

  • Python 3.5 – 3.14 (python_requires = ">=3.5,<3.15") and pip 20.3 or newer
  • Linux x64 with glibc 2.27 or newer; macOS 12 or newer, Intel or Apple Silicon. On an Intel Mac, a Python built against a pre-11 macOS SDK reports the system as macOS 10.16 — use pip 24.1 or newer there, or SYSTEM_VERSION_COMPAT=0 pip install groupdocs-metadata-net
  • Windows: no additional packages
  • Linux: ICU and fontconfig — apt-get install libicu-dev libfontconfig1. Without fontconfig, opening presentations and exporting to XLSX fail. libgdiplus and the Microsoft core fonts are not needed.
  • macOS (Intel and Apple Silicon): no additional packages
  • The .NET 10.0.12 runtime is embedded in the wheel; no separate install is needed

Wheel Distribution

PlatformWheel
Windows x64groupdocs_metadata_net-26.9.0-py3-none-win_amd64.whl
Linux x64groupdocs_metadata_net-26.9.0-py3-none-manylinux_2_27_x86_64.whl
macOS Intelgroupdocs_metadata_net-26.9.0-py3-none-macosx_12_0_x86_64.whl
macOS Apple Silicongroupdocs_metadata_net-26.9.0-py3-none-macosx_12_0_arm64.whl
pip install groupdocs-metadata-net==26.9.0

Additional Resources

Feedback

Questions and issues are welcome on the GroupDocs.Metadata forum.