Hantera taggar och anpassad data i presentationer med Python
Översikt
Den här artikeln förklarar hur Aspose.Slides arbetar med taggar och anpassad data i PowerPoint‑presentationer. Presentationsspecifik data kan lagras som taggar eller anpassade XML‑delar. Taggar är enkla nyckel‑värde‑strängpar, medan anpassade XML‑delar kan lagra strukturerad metadata och applikationsspecifika XML‑payloads.
Aspose.Slides tillhandahåller API:er för att lägga till, läsa, uppdatera, granska och ta bort anpassade XML‑delar på presentations-, bild‑ och formnivå. Anpassade XML‑delar är användbara för integrationer som lagrar information såsom dokumenthanterings‑identifikatorer, arbetsflödes‑tillstånd, efterlevnads‑metadata, mallbindnings‑data eller annan strukturerad applikationsdata i en presentation.
Datainlagring i presentationsfiler
PPTX‑filer – filer med filtillägget .pptx – lagras i PresentationML‑formatet, som är en del av Office Open XML‑specifikationen. Office Open XML definierar paketstrukturen och relationerna som används för att lagra presentationsinnehåll och relaterad data.
En presentation innehåller flera delar som är kopplade genom relationer. Till exempel innehåller en bilddel innehållet i en enskild bild och kan ha explicita relationer till andra delar enligt ISO/IEC 29500.
Anpassad data kan lagras som taggar (TagCollection) eller anpassade XML‑delar (CustomXmlPartCollection). Båda är tillgängliga via klassen CustomData.
Obs
Taggar lagrar enkla sträng‑nyckel‑värde‑par. Anpassade XML‑delar lagrar strukturerad XML‑data och kan associeras med en presentation, bild eller form.Arbeta med anpassade XML‑delar
Metoden CustomData.getCustomXmlParts returnerar samlingen av anpassade XML‑delar som är knutna till ett specifikt presentationsobjekt. Till exempel:
- Presentationens CustomData.getCustomXmlParts-samling innehåller anpassade XML‑delar som är kopplade till själva presentationen.
- Bildens CustomData.getCustomXmlParts-samling innehåller anpassade XML‑delar som är knutna till en specifik bild.
- Formens CustomData.getCustomXmlParts-samling innehåller anpassade XML‑delar som är knutna till en specifik form.
Använd Presentation.getAllCustomXmlParts när du behöver inspektera alla anpassade XML‑delar i presentationen oavsett var de är associerade.
Lägg till en anpassad XML‑del i en presentation
Använd CustomXmlPartCollection.add för att lägga till XML‑data i en samling av anpassade XML‑delar. XML‑innehållet måste vara giltigt och icke‑tomt.
Följande exempel lägger till strukturerad metadata i presentationsnivåns anpassade datainsamling:
import jpype
import asposeslides
if not jpype.isJVMStarted():
jpype.startJVM()
from asposeslides.api import Presentation, SaveFormat
from java.util import UUID
presentation = Presentation()
try:
custom_xml_content = '<?xml version="1.0" encoding="UTF-8"?><metadata xmlns="urn:example:metadata"><documentId>DOC-1001</documentId><workflowState>Draft</workflowState></metadata>'
custom_xml_part = presentation.getCustomData().getCustomXmlParts().add(custom_xml_content)
# add tilldelar en identifierare automatiskt. Ange ett specifikt UUID endast när det behövs.
item_id = UUID.randomUUID()
custom_xml_part.setItemId(item_id)
presentation.save("presentation_with_custom_xml.pptx", SaveFormat.Pptx)
finally:
presentation.dispose()
Metoden add kan också ta emot XML som en byte‑array eller inmatningsström, vilket är praktiskt när XML‑innehållet redan finns i binär form.
Lägg till en anpassad XML‑del i en bild eller form
Anpassad XML‑data kan kopplas till en specifik bild eller form istället för hela presentationen. Detta är användbart när metadata bara beskriver ett enda objekt, exempelvis en mallnyckel, extern post‑identifierare eller bindningsinformation.
Följande exempel lägger till en anpassad XML‑del i en bild och en annan i en form:
import jpype
import asposeslides
if not jpype.isJVMStarted():
jpype.startJVM()
from asposeslides.api import Presentation, SaveFormat, ShapeType
presentation = Presentation()
try:
slide = presentation.getSlides().get_Item(0)
slide_xml_content = '<slideMetadata xmlns="urn:example:slides"><templateKey>TitleSlide</templateKey></slideMetadata>'
slide.getCustomData().getCustomXmlParts().add(slide_xml_content)
shape = slide.getShapes().addAutoShape(ShapeType.Rectangle, 50, 50, 250, 80)
shape.getTextFrame().setText("Customer data")
shape_xml_content = '<shapeMetadata xmlns="urn:example:shapes"><recordId>CRM-4281</recordId></shapeMetadata>'
shape.getCustomData().getCustomXmlParts().add(shape_xml_content)
presentation.save("object_custom_xml.pptx", SaveFormat.Pptx)
finally:
presentation.dispose()
Nivån där en del läggs till bestämmer vilken objekts CustomData.getCustomXmlParts-samling som innehåller relationen till den delen. Presentationsnivådata är lämplig för metadata som gäller hela dokumentet, bildnivådata för information som tillhör en viss bild och formnivådata för metadata knuten till en enskild form.
Lista och granska alla anpassade XML‑delar
Använd Presentation.getAllCustomXmlParts för att hämta alla anpassade XML‑delar från en presentation. Varje CustomXmlPart visar sin identifierare, XML‑innehåll och associerade namnrymdsscheman.
Följande exempel listar alla anpassade XML‑delar och deras namnrymdsscheman:
import jpype
import asposeslides
if not jpype.isJVMStarted():
jpype.startJVM()
from asposeslides.api import Presentation
presentation = Presentation("presentation.pptx")
try:
for custom_xml_part in presentation.getAllCustomXmlParts():
print("ItemId:", custom_xml_part.getItemId())
print("XML:")
print(custom_xml_part.getXmlAsString())
for namespace_schema in custom_xml_part.getNamespaceSchemas():
print("Namespace schema:", namespace_schema)
print()
finally:
presentation.dispose()
CustomXmlPart.getNamespaceSchemas returnerar XML‑scheman som är kopplade till den anpassade XML‑delen. Informationen kan vara användbar vid granskning av presentationer som innehåller XML producerad av externa system.
Läs och uppdatera XML‑innehåll och ItemId
Använd CustomXmlPart.getXmlAsString och setXmlAsString för att arbeta med XML som en UTF‑8‑sträng, eller getXmlData och setXmlData för att arbeta med de råa XML‑bytena.
Metoden CustomXmlPart.getItemId returnerar UUID‑värdet som identifierar den anpassade XML‑delen i Office Open XML‑dokumentet. Använd setItemId när en integration kräver en ny identifierare.
Följande exempel uppdaterar XML‑innehållet och identifieraren:
import jpype
import asposeslides
if not jpype.isJVMStarted():
jpype.startJVM()
from asposeslides.api import Presentation, SaveFormat
from java.util import UUID
presentation = Presentation("presentation.pptx")
try:
custom_xml_parts = presentation.getAllCustomXmlParts()
if len(custom_xml_parts) > 0:
custom_xml_part = custom_xml_parts[0]
# Läs den aktuella XML som text.
current_xml_content = custom_xml_part.getXmlAsString()
print(current_xml_content)
# Uppdatera XML som en UTF-8-sträng.
custom_xml_content = '<metadata xmlns="urn:example:metadata"><documentId>DOC-1001</documentId><workflowState>Approved</workflowState></metadata>'
custom_xml_part.setXmlAsString(custom_xml_content)
# getXmlData tillhandahåller samma XML-innehåll som råa byte.
custom_xml_data = custom_xml_part.getXmlData()
print(bytes(custom_xml_data).decode("utf-8"))
# Ersätt identifieraren när integrationen kräver det.
item_id = UUID.randomUUID()
custom_xml_part.setItemId(item_id)
presentation.save("updated_custom_xml.pptx", SaveFormat.Pptx)
else:
print("No custom XML parts found.")
finally:
presentation.dispose()
När du anropar setXmlAsString eller setXmlData ska du tillhandahålla giltig, icke‑tom XML. Använd antingen den ena eller den andra representationen beroende på om applikationen primärt arbetar med strängar eller byte‑data.
Ta bort en anpassad XML‑del
Aspose.Slides erbjuder flera sätt att ta bort anpassad XML‑data:
- CustomXmlPart.remove tar bort den anpassade XML‑delen från presentationen.
- CustomXmlPartCollection.remove tar bort en specifik del från en samling av anpassade XML‑delar.
- CustomXmlPartCollection.removeAt tar bort delen på ett angivet index i samlingen.
- CustomXmlPartCollection.clear tar bort alla delar från en specifik samling.
Följande exempel tar bort en presentationsnivå‑XML‑del med referens:
import jpype
import asposeslides
if not jpype.isJVMStarted():
jpype.startJVM()
from asposeslides.api import Presentation, SaveFormat
presentation = Presentation("presentation.pptx")
try:
custom_xml_parts = presentation.getCustomData().getCustomXmlParts()
if custom_xml_parts.size() > 0:
custom_xml_part = custom_xml_parts.get_Item(0)
custom_xml_parts.remove(custom_xml_part)
presentation.save("custom_xml_removed.pptx", SaveFormat.Pptx)
finally:
presentation.dispose()
Om du redan har en CustomXmlPart och vill ta bort den delen från presentationen snarare än att adressera en viss samling, anropa CustomXmlPart.remove.
Du kan också ta bort ett objekt efter index:
import jpype
import asposeslides
if not jpype.isJVMStarted():
jpype.startJVM()
from asposeslides.api import Presentation
presentation = Presentation("presentation.pptx")
try:
custom_xml_parts = presentation.getCustomData().getCustomXmlParts()
if custom_xml_parts.size() > 0:
custom_xml_parts.removeAt(0)
finally:
presentation.dispose()
Rensa alla anpassade XML‑delar från en samling
Använd clear när alla anpassade XML‑delar som är knutna till ett specifikt presentationsobjekt ska tas bort.
import jpype
import asposeslides
if not jpype.isJVMStarted():
jpype.startJVM()
from asposeslides.api import Presentation, SaveFormat
presentation = Presentation("presentation.pptx")
try:
presentation.getSlides().get_Item(0).getCustomData().getCustomXmlParts().clear()
presentation.save("slide_custom_xml_cleared.pptx", SaveFormat.Pptx)
finally:
presentation.dispose()
clear påverkar endast den valda samlingen. Till exempel rensar inte en bilds samling den presentations‑ eller form‑nivå‑samlingen.
För att ta bort varje anpassad XML‑del i presentationen, iterera genom getAllCustomXmlParts och ta bort varje del:
import jpype
import asposeslides
if not jpype.isJVMStarted():
jpype.startJVM()
from asposeslides.api import Presentation, SaveFormat
presentation = Presentation("presentation.pptx")
try:
for custom_xml_part in presentation.getAllCustomXmlParts():
custom_xml_part.remove()
presentation.save("all_custom_xml_removed.pptx", SaveFormat.Pptx)
finally:
presentation.dispose()
Hantera länkade eller delade anpassade XML‑delar
I en Office Open XML‑presentation kan samma anpassade XML‑del refereras från mer än ett presentationsobjekt. Till exempel kan en befintlig fil innehålla relationer från flera bilder eller former till samma underliggande XML‑del.
En delad del bör behandlas som ett enda dataobjekt med flera referenser:
- Att uppdatera den med setXmlAsString, setXmlData eller setItemId förändrar den underliggande XML‑delen, så ändringen gäller där delen refereras.
- getItemId kan användas för att identifiera samma anpassade XML‑del vid granskning av objekt‑nivå‑samlingar.
- Att ta bort en del från en specifik getCustomXmlParts-samling tar bort den från den samlingen. Använd CustomXmlPart.remove när själva delen ska tas bort från presentationen.
- Innan en delad del tas bort eller ersätts, inspektera objekt‑nivå‑samlingarna för att avgöra om andra bilder eller former fortfarande refererar till den.
add-överkörningarna skapar en ny anpassad XML‑del från XML‑innehåll; de accepterar inte en befintlig CustomXmlPart. Därför möts delade relationer oftast när presentationer som redan innehåller dem laddas.
Följande exempel granskar presentation‑, bild‑ och form‑samlingar efter ItemId och rapporterar delar som refereras från mer än ett ställe:
import jpype
import asposeslides
if not jpype.isJVMStarted():
jpype.startJVM()
from asposeslides.api import Presentation
presentation = Presentation("presentation.pptx")
try:
references_by_item_id = {}
def register_custom_xml_parts(owner_name, custom_xml_parts):
for i in range(custom_xml_parts.size()):
custom_xml_part = custom_xml_parts.get_Item(i)
item_id = str(custom_xml_part.getItemId())
references_by_item_id.setdefault(item_id, []).append(owner_name)
register_custom_xml_parts("Presentation", presentation.getCustomData().getCustomXmlParts())
for slide_index in range(presentation.getSlides().size()):
slide = presentation.getSlides().get_Item(slide_index)
register_custom_xml_parts(f"Slide {slide_index + 1}", slide.getCustomData().getCustomXmlParts())
for shape_index in range(slide.getShapes().size()):
shape = slide.getShapes().get_Item(shape_index)
register_custom_xml_parts(f"Slide {slide_index + 1}, shape {shape_index}", shape.getCustomData().getCustomXmlParts())
for item_id, owner_names in references_by_item_id.items():
if len(owner_names) > 1:
print("Shared custom XML part:", item_id)
for owner_name in owner_names:
print(" Referenced by:", owner_name)
finally:
presentation.dispose()
Denna typ av granskning är användbar innan du modifierar eller tar bort anpassad XML‑data i presentationer som skapats av externa system, eftersom samma metadatadel kan delta i flera relationer.
Hämta taggvärden
I Slides motsvarar en tagg metoden DocumentProperties.getKeywords. Detta exempel visar hur du hämtar ett taggvärde med Aspose.Slides för Python via Java för Presentation:
import jpype
import asposeslides
if not jpype.isJVMStarted():
jpype.startJVM()
from asposeslides.api import Presentation
presentation = Presentation("presentation.pptx")
try:
keywords = presentation.getDocumentProperties().getKeywords()
finally:
presentation.dispose()
Lägg till taggar i presentationer
Aspose.Slides låter dig lägga till taggar i presentationer. En tagg består vanligtvis av två element:
- namnet på en anpassad egenskap, till exempel
MyTag; - värdet på den anpassade egenskapen, till exempel
My Tag Value.
Om du behöver klassificera presentationer baserat på en specifik regel eller egenskap kan du lägga till taggar för det ändamålet. Till exempel, om du vill gruppera presentationer från nordamerikanska länder kan du skapa en nordamerikansk tagg och tilldela det relevanta landet som värde.
Detta exempel visar hur du lägger till en tagg i en Presentation med Aspose.Slides för Python via Java:
import jpype
import asposeslides
if not jpype.isJVMStarted():
jpype.startJVM()
from asposeslides.api import Presentation
presentation = Presentation("presentation.pptx")
try:
tags = presentation.getCustomData().getTags()
tags.set_Item("MyTag", "My Tag Value")
finally:
presentation.dispose()
Taggar kan också sättas för en Slide:
import jpype
import asposeslides
if not jpype.isJVMStarted():
jpype.startJVM()
from asposeslides.api import Presentation
presentation = Presentation()
try:
slide = presentation.getSlides().get_Item(0)
slide.getCustomData().getTags().set_Item("tag", "value")
finally:
presentation.dispose()
Eller för en enskild Shape:
import jpype
import asposeslides
if not jpype.isJVMStarted():
jpype.startJVM()
from asposeslides.api import Presentation, ShapeType
presentation = Presentation()
try:
slide = presentation.getSlides().get_Item(0)
shape = slide.getShapes().addAutoShape(ShapeType.Rectangle, 10, 10, 100, 50)
shape.getTextFrame().setText("My text")
shape.getCustomData().getTags().set_Item("tag", "value")
finally:
presentation.dispose()
Begränsningar
Taggar som läggs till via samlingen CustomData.getTags lagras endast i PowerPoint‑filen. De överförs inte till PDF‑taggstrukturen när presentationen exporteras till PDF. Följaktligen kan en anpassad identifierare som lagrats som tagg inte hämtas från den taggade PDF‑filen.
Alternativ lösning: Du kan lagra en anpassad identifierare i objektets Alt Text (t.ex. Shape.setAlternativeText med värdet "MyId"). Efter export till PDF kan Alt Text dyka upp i PDF‑taggstrukturen.
FAQ
Kan jag ta bort alla taggar från en presentation, bild eller form i ett enda steg?
Ja. tag collection stödjer en clear-operation som raderar alla nyckel‑värde‑par på en gång.
Hur tar jag bort en enskild tagg efter namn utan att iterera över hela samlingen?
Använd remove på tag collection för att ta bort taggen via dess nyckel.
Hur kan jag hämta den fullständiga listan med taggnamn för analys eller filtrering?
Använd getNamesOfTags på tag collection; den returnerar en array med alla taggnamn.
Hur hittar jag alla anpassade XML‑delar oavsett var de lagras?
Använd Presentation.getAllCustomXmlParts för att hämta alla anpassade XML‑delar i presentationen.
Ska jag använda getXmlAsString/setXmlAsString eller getXmlData/setXmlData för att uppdatera en anpassad XML‑del?
Använd getXmlAsString och setXmlAsString när applikationen arbetar med UTF‑8‑XML‑text. Använd getXmlData och setXmlData när XML redan finns som en byte‑array eller när binär hantering är mer bekväm. Båda representationerna refererar till samma anpassade XML‑parts innehåll.