The Extensible Metadata Platform (XMP) is an XML-based ISO metadata standard, originally created by Adobe Systems. It defines a data structure, a serialization model, and basic metadata properties that form a unified metadata package which can be embedded into different media formats. The XMP data model can store any set of metadata properties — simple name/value pairs, structured values, or lists of values, nested arbitrarily.
To access XMP metadata in a file of any supported format, GroupDocs.Metadata provides the xmp_package property on the root package. Standard schemes are reachable through xmp_package.schemes.
fromgroupdocs.metadataimportMetadatadefread_xmp_properties():withMetadata("xmp.png")asmetadata:root=metadata.get_root_package()xmp=getattr(root,"xmp_package",None)ifxmpisnotNone:# Standard schemes are reachable through xmp.schemes;# each may be absent, so guard before reading.ifxmp.schemes.xmp_basicisnotNone:print(xmp.schemes.xmp_basic.creator_tool)print(xmp.schemes.xmp_basic.create_date)print(xmp.schemes.xmp_basic.modify_date)ifxmp.schemes.dublin_coreisnotNone:print(xmp.schemes.dublin_core.format)print(xmp.schemes.dublin_core.coverage)print(xmp.schemes.dublin_core.identifier)ifxmp.schemes.photoshopisnotNone:print(xmp.schemes.photoshop.color_mode)print(xmp.schemes.photoshop.city)print(xmp.schemes.photoshop.date_created)if__name__=="__main__":read_xmp_properties()
xmp.png is the sample file used in this example. Click here to download it.
Here is a non-exhaustive list of supported XMP schemes (in groupdocs.metadata.standards.xmp.schemes): XmpBasicJobTicketPackage, XmpBasicPackage, XmpCameraRawPackage, XmpDublinCorePackage, XmpDynamicMediaPackage, XmpIptcCorePackage, XmpIptcExtensionPackage, XmpIptcIimPackage, XmpMediaManagementPackage, XmpPagedTextPackage, XmpPdfPackage, XmpPhotoshopPackage, XmpRightsManagementPackage.
Updating XMP properties
Update XMP metadata through the scheme packages. Create a scheme if it is missing.
fromdatetimeimportdatefromgroupdocs.metadataimportMetadatafromgroupdocs.metadata.standards.xmp.schemesimportXmpBasicPackage,XmpCameraRawPackage,XmpDublinCorePackagedefupdate_xmp_properties():withMetadata("xmp.gif")asmetadata:root=metadata.get_root_package()xmp=getattr(root,"xmp_package",None)ifxmpisnotNone:ifxmp.schemes.dublin_coreisNone:xmp.schemes.dublin_core=XmpDublinCorePackage()xmp.schemes.dublin_core.format="image/gif"ifxmp.schemes.camera_rawisNone:xmp.schemes.camera_raw=XmpCameraRawPackage()xmp.schemes.camera_raw.shadows=50xmp.schemes.camera_raw.camera_profile="test"# Replace the whole scheme to drop old valuesxmp.schemes.xmp_basic=XmpBasicPackage()xmp.schemes.xmp_basic.create_date=date.today()xmp.schemes.xmp_basic.rating=5metadata.save("output.gif")if__name__=="__main__":update_xmp_properties()
xmp.gif is the sample file used in this example. Click here to download it.
Besides the predefined schemes, you can create fully custom XMP packages with user-defined properties.
fromdatetimeimportdatefromgroupdocs.metadataimportMetadatafromgroupdocs.metadata.standards.xmpimportXmpArray,XmpArrayType,XmpPackage,XmpPacketWrapperdefadd_custom_xmp_package():withMetadata("input.jpg")asmetadata:root=metadata.get_root_package()packet=XmpPacketWrapper()custom=XmpPackage("gd","https://groupdocs.com")custom.set("gd:Copyright","Copyright (C) 2026 GroupDocs. All Rights Reserved.")custom.set("gd:CreationDate",date.today())custom.set("gd:Company",XmpArray.from_(["Aspose","GroupDocs"],XmpArrayType.ORDERED))packet.add_package(custom)root.xmp_package=packetmetadata.save("output.jpg")if__name__=="__main__":add_custom_xmp_package()
input.jpg is the sample file used in this example. Click here to download it.