จัดการแท็กและข้อมูลกำหนดเองในงานนำเสนอด้วย Python
ภาพรวม
บทความนี้อธิบายว่า Aspose.Slides ทำงานกับแท็กและข้อมูลกำหนดเองในงานนำเสนอ PowerPoint อย่างไร ข้อมูลเฉพาะของงานนำเสนอสามารถจัดเก็บเป็นแท็กหรือส่วน XML กำหนดเองได้ แท็กเป็นคู่คีย์‑ค่าแบบสตริงง่าย ๆ ส่วนส่วน XML กำหนดเองสามารถเก็บเมทาดาต้าแบบมีโครงสร้างและข้อมูล XML ที่เฉพาะต่อแอปพลิเคชัน
Aspose.Slides มี API สำหรับการเพิ่ม, อ่าน, ปรับปรุง, ตรวจสอบ, และลบส่วน XML กำหนดเองในระดับงานนำเสนอ, สไลด์, และรูปร่าง ส่วน XML กำหนดเองมีประโยชน์สำหรับการรวมระบบที่จัดเก็บข้อมูล เช่น ตัวระบุการจัดการเอกสาร, สถานะของกระบวนการทำงาน, เมทาดาต้าการปฏิบัติตาม, ข้อมูลการผูกเทมเพลต, หรือข้อมูลแอปพลิเคชันแบบมีโครงสร้างอื่น ๆ ภายในงานนำเสนอ
การจัดเก็บข้อมูลในไฟล์งานนำเสนอ
ไฟล์ PPTX — ไฟล์ที่มีส่วนขยาย .pptx — ถูกจัดเก็บในรูปแบบ PresentationML ซึ่งเป็นส่วนหนึ่งของสเปค Office Open XML. Office Open XML กำหนดโครงสร้างแพ็กเกจและความสัมพันธ์ที่ใช้เก็บเนื้อหาของงานนำเสนอและข้อมูลที่เกี่ยวข้อง
งานนำเสนอประกอบด้วยหลายส่วนที่เชื่อมต่อกันด้วยความสัมพันธ์ ตัวอย่างเช่น ส่วนสไลด์ถือเนื้อหาของสไลด์เดียวและอาจมีความสัมพันธ์ที่ชัดเจนกับส่วนอื่น ๆ ตามที่กำหนดโดย ISO/IEC 29500
ข้อมูลกำหนดเองสามารถจัดเก็บเป็นแท็ก (TagCollection) หรือส่วน XML กำหนดเอง (CustomXmlPartCollection) ทั้งสองแบบสามารถเข้าถึงได้ผ่านคลาส CustomData
Note
แท็กจัดเก็บคู่คีย์‑ค่าแบบสตริงง่าย ๆ ส่วน XML กำหนดเองจัดเก็บข้อมูล XML แบบมีโครงสร้างและสามารถเชื่อมโยงกับงานนำเสนอ, สไลด์, หรือรูปร่างทำงานกับส่วน XML กำหนดเอง
เมธอด CustomData.getCustomXmlParts จะคืนค่าคอลเลกชันของส่วน XML กำหนดเองที่เชื่อมโยงกับอ็อบเจ็กต์งานนำเสนอเฉพาะ ตัวอย่างเช่น:
- คอลเลกชัน CustomData.getCustomXmlParts ของงานนำเสนอจะมีส่วน XML กำหนดเองที่เชื่อมโยงกับงานนำเสนอเอง
- คอลเลกชัน CustomData.getCustomXmlParts ของสไลด์จะมีส่วน XML กำหนดเองที่เชื่อมโยงกับสไลด์นั้น
- คอลเลกชัน CustomData.getCustomXmlParts ของรูปร่างจะมีส่วน XML กำหนดเองที่เชื่อมโยงกับรูปร่างนั้น
ใช้ Presentation.getAllCustomXmlParts เมื่อคุณต้องการตรวจสอบส่วน XML กำหนดเองทั้งหมดในงานนำเสนอโดยไม่คำนึงว่าถูกเชื่อมโยงที่ไหน
เพิ่มส่วน XML กำหนดเองไปยังงานนำเสนอ
ใช้ CustomXmlPartCollection.add เพื่อเพิ่มข้อมูล XML ไปยังคอลเลกชันส่วน XML กำหนดเอง XML ต้องเป็น XML ที่สมบูรณ์และไม่ว่างเปล่า
ตัวอย่างต่อไปนี้เพิ่มเมทาดาต้าแบบมีโครงสร้างไปยังคอลเลกชันข้อมูลกำหนดเองระดับงานนำเสนอ:
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)
# การเพิ่มจะกำหนดตัวระบุโดยอัตโนมัติ ตั้งค่า UUID เฉพาะเมื่อจำเป็นเท่านั้น.
item_id = UUID.randomUUID()
custom_xml_part.setItemId(item_id)
presentation.save("presentation_with_custom_xml.pptx", SaveFormat.Pptx)
finally:
presentation.dispose()
เมธอด add สามารถรับ XML เป็นอาร์เรย์ของไบต์หรือสตรีมอินพุตได้ ซึ่งมีประโยชน์เมื่อเนื้อหา XML มีอยู่แล้วในรูปแบบไบนารี
เพิ่มส่วน XML กำหนดเองไปยังสไลด์หรือรูปร่าง
ข้อมูล XML กำหนดเองสามารถเชื่อมโยงกับสไลด์หรือรูปร่างเฉพาะแทนที่จะเป็นงานนำเสนอทั้งหมด ซึ่งมีประโยชน์เมื่อเมทาดาต้าอธิบายเพียงอ็อบเจ็กต์เดียว เช่น คีย์เทมเพลต, ตัวระบุบันทึกภายนอก, หรือข้อมูลการผูก
ตัวอย่างต่อไปนี้เพิ่มส่วน XML กำหนดเองหนึ่งส่วนไปยังสไลด์และอีกส่วนหนึ่งไปยังรูปร่าง:
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()
ระดับที่ส่วนถูกเพิ่มจะกำหนดว่าคอลเลกชัน CustomData.getCustomXmlParts ของอ็อบเจ็กต์ใดจะมีความสัมพันธ์กับส่วนนั้น ข้อมูลระดับงานนำเสนอเหมาะกับเมทาดาต้าทั่วเอกสาร, ข้อมูลระดับสไลด์สำหรับข้อมูลที่เป็นของสไลด์นั้น, และข้อมูลระดับรูปร่างสำหรับเมทาดาต้าที่เชื่อมโยงกับรูปร่างแต่ละรูป
รายการและตรวจสอบส่วน XML กำหนดเองทั้งหมด
ใช้ Presentation.getAllCustomXmlParts เพื่อดึงส่วน XML กำหนดเองทั้งหมดจากงานนำเสนอ แต่ละ CustomXmlPart จะเปิดเผยตัวระบุ, เนื้อหา XML, และสคีมาเนมสเปซที่สัมพันธ์
ตัวอย่างต่อไปนี้แสดงรายการส่วน XML กำหนดเองทั้งหมดและสคีมาเนมสเปซของพวกมัน:
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 คืนค่าสกีม่า XML ที่สัมพันธ์กับส่วน XML กำหนดเอง ข้อมูลนี้มีประโยชน์เมื่อทำการตรวจสอบงานนำเสนอที่มี XML ที่สร้างโดยระบบภายนอก
อ่านและอัปเดตเนื้อหา XML และ ItemId
ใช้ CustomXmlPart.getXmlAsString และ setXmlAsString เพื่อทำงานกับ XML เป็นสตริง UTF‑8 หรือใช้ getXmlData และ setXmlData เพื่อทำงานกับไบต์ XML ดิบ
เมธอด CustomXmlPart.getItemId คืนค่า UUID ที่ระบุส่วน XML กำหนดเองในเอกสาร Office Open XML ใช้ setItemId เมื่อการรวมระบบต้องการตัวระบุใหม่
ตัวอย่างต่อไปนี้อัปเดตเนื้อหา XML และตัวระบุ:
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]
# อ่าน XML ปัจจุบันเป็นข้อความ.
current_xml_content = custom_xml_part.getXmlAsString()
print(current_xml_content)
# อัปเดต XML เป็นสตริง UTF-8.
custom_xml_content = '<metadata xmlns="urn:example:metadata"><documentId>DOC-1001</documentId><workflowState>Approved</workflowState></metadata>'
custom_xml_part.setXmlAsString(custom_xml_content)
# getXmlData ให้เนื้อหา XML เดียวกันเป็นไบต์ดิบ.
custom_xml_data = custom_xml_part.getXmlData()
print(bytes(custom_xml_data).decode("utf-8"))
# แทนที่ตัวระบุเมื่อการรวมระบบต้องการ.
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()
เมื่อเรียกใช้ setXmlAsString หรือ setXmlData, ให้ส่ง XML ที่ถูกต้องและไม่ว่างเปล่า ใช้รูปแบบใดรูปแบบหนึ่งตามที่แอปพลิเคชันทำงานหลักกับสตริงหรือข้อมูลไบต์
ลบส่วน XML กำหนดเอง
Aspose.Slides มีวิธีหลายอย่างในการลบข้อมูล XML กำหนดเอง:
- CustomXmlPart.remove ลบส่วน XML กำหนดเองออกจากงานนำเสนอ
- CustomXmlPartCollection.remove ลบส่วนที่ระบุออกจากคอลเลกชันส่วน XML กำหนดเอง
- CustomXmlPartCollection.removeAt ลบส่วนที่ตำแหน่งดัชนีที่ระบุในคอลเลกชัน
- CustomXmlPartCollection.clear ลบส่วนทั้งหมดออกจากคอลเลกชันที่ระบุ
ตัวอย่างต่อไปนี้ลบส่วน XML กำหนดเองระดับงานนำเสนอหนึ่งส่วนโดยอ้างอิง:
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()
หากคุณมี CustomXmlPart อยู่แล้วและต้องการลบส่วนนั้นจากงานนำเสนอแทนการอ้างอิงคอลเลกชันเฉพาะ ให้เรียก CustomXmlPart.remove
คุณยังสามารถลบรายการโดยใช้ดัชนีได้:
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()
ล้างส่วน XML กำหนดเองทั้งหมดจากคอลเลกชัน
ใช้ clear เมื่อส่วน XML กำหนดเองทั้งหมดที่เชื่อมโยงกับอ็อบเจ็กต์งานนำเสนอที่ระบุควรถูกลบ
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 มีผลเฉพาะต่อคอลเลกชันที่เลือก ตัวอย่างเช่น การล้างคอลเลกชันของสไลด์จะไม่ล้างคอลเลกชันระดับงานนำเสนอหรือระดับรูปร่าง
เพื่อที่จะลบส่วน XML กำหนดเองทั้งหมดในงานนำเสนอ ให้วนลูปผ่าน getAllCustomXmlParts และลบแต่ละส่วน:
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()
จัดการส่วน XML กำหนดเองที่เชื่อมโยงหรือแชร์
ในงานนำเสนอ Office Open XML ส่วน XML กำหนดเองเดียวกันอาจถูกอ้างอิงจากอ็อบเจ็กต์งานนำเสนอมากกว่าหนึ่งอัน ตัวอย่างเช่น ไฟล์ที่มีอยู่แล้วอาจมีความสัมพันธ์จากหลายสไลด์หรือรูปร่างไปยังส่วน XML กำหนดเองพื้นฐานเดียวกัน
ส่วนที่แชร์ควรถือเป็นอ็อบเจ็กต์ข้อมูลหนึ่งเดียวที่มีการอ้างอิงหลายครั้ง:
- การอัปเดตด้วย setXmlAsString, setXmlData หรือ setItemId จะเปลี่ยนส่วน XML กำหนดเองพื้นฐาน ดังนั้นการเปลี่ยนแปลงจะปรากฏทุกที่ที่ส่วนนั้นถูกอ้างอิง
- สามารถใช้ getItemId เพื่อระบุส่วน XML กำหนดเองเดียวกันขณะตรวจสอบคอลเลกชันระดับอ็อบเจ็กต์
- การลบส่วนจากคอลเลกชัน getCustomXmlParts เฉพาะจะลบออกจากคอลเลกชันนั้น ใช้ CustomXmlPart.remove เมื่อส่วนควรถูกลบออกจากงานนำเสนอทั้งหมด
- ก่อนที่จะลบหรือแทนที่ส่วนที่แชร์ ควรตรวจสอบคอลเลกชันระดับอ็อบเจ็กต์เพื่อดูว่าสไลด์หรือรูปร่างอื่นยังอ้างอิงมันอยู่หรือไม่
เมธอด add overload จะสร้างส่วน XML กำหนดใหม่จากเนื้อหา XML; ไม่รับ [CustomXmlPart] ที่มีอยู่ ดังนั้นความสัมพันธ์ที่แชร์มักพบเมื่อโหลดงานนำเสนอที่มีอยู่แล้ว
ตัวอย่างต่อไปนี้ตรวจสอบคอลเลกชันระดับงานนำเสนอ, สไลด์, และรูปร่างโดยใช้ ItemId และรายงานส่วนที่ถูกอ้างอิงจากหลายตำแหน่ง:
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()
การตรวจสอบแบบนี้มีประโยชน์ก่อนการแก้ไขหรือการลบข้อมูล XML กำหนดเองในงานนำเสนอที่สร้างโดยระบบภายนอก เนื่องจากส่วนเมทาดาต้าเดียวกันอาจมีส่วนร่วมในความสัมพันธ์หลายรายการ
รับค่าของแท็ก
ในสไลด์ แท็กสอดคล้องกับเมธอด DocumentProperties.getKeywords. ตัวอย่างโค้ดนี้แสดงวิธีดึงค่าของแท็กด้วย Aspose.Slides for Python via Java สำหรับ 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()
เพิ่มแท็กไปยังงานนำเสนอ
Aspose.Slides ให้คุณเพิ่มแท็กไปยังงานนำเสนอ แท็กทั่วไปประกอบด้วยสองส่วน:
- ชื่อของคุณสมบัติที่กำหนดเอง เช่น
MyTag; - ค่าของคุณสมบัตินั้น เช่น
My Tag Value.
หากคุณต้องการจัดประเภทงานนำเสนอโดยอิงกฎหรือคุณสมบัติเฉพาะ คุณสามารถเพิ่มแท็กเพื่อจุดประสงค์นั้น ตัวอย่างเช่น หากต้องการจัดประเภทงานนำเสนอจากประเทศในอเมริกาเหนือ คุณสามารถสร้างแท็กอเมริกาเหนือและกำหนดค่าประเทศที่เกี่ยวข้องเป็นค่าแท็ก
ตัวอย่างโค้ดนี้แสดงวิธีเพิ่มแท็กไปยัง Presentation โดยใช้ Aspose.Slides for 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()
แท็กสามารถตั้งค่าให้กับ 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()
หรือสำหรับ 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()
ข้อจำกัด
แท็กที่เพิ่มผ่านคอลเลกชัน CustomData.getTags จะถูกจัดเก็บไว้ในไฟล์ PowerPoint เท่านั้น ไม่ได้ ถูก ย้ายไปยังโครงสร้างแท็กของ PDF เมื่อส่งออกงานนำเสนอเป็น PDF ดังนั้น ตัวระบุกำหนดเองที่กำหนดเป็นแท็กจะไม่สามารถดึงคืนจาก PDF ที่มีแท็กได้
วิธีแก้: คุณสามารถเก็บตัวระบุกำหนดเองใน Alt Text ของอ็อบเจ็กต์ (เช่น Shape.setAlternativeText ด้วยค่า "MyId"). หลังจากส่งออกเป็น PDF, Alt Text อาจปรากฏในโครงสร้างแท็กของ PDF
คำถามที่พบบ่อย
ฉันสามารถลบแท็กทั้งหมดจากงานนำเสนอ, สไลด์ หรือรูปร่างในหนึ่งการดำเนินการได้หรือไม่?
ได้. คอลเลกชัน tag collection รองรับการดำเนินการ clear ซึ่งจะลบคู่คีย์‑ค่าทั้งหมดพร้อมกัน
ฉันจะลบแท็กเดี่ยวโดยใช้ชื่อของมันโดยไม่ต้องวนลูปผ่านคอลเลกชันทั้งหมดได้อย่างไร?
ใช้ remove บน tag collection เพื่อ删除แท็กโดยใช้คีย์ของมัน
ฉันจะดึงรายการชื่อแท็กทั้งหมดสำหรับการวิเคราะห์หรือการกรองได้อย่างไร?
ใช้ getNamesOfTags บน tag collection; จะคืนค่าอาเรย์ของชื่อแท็กทั้งหมด
ฉันจะค้นหาส่วน XML กำหนดเองทั้งหมดโดยไม่คำนึงว่าถูกเก็บที่ไหนได้อย่างไร?
ใช้ Presentation.getAllCustomXmlParts เพื่อดึงส่วน XML กำหนดเองทั้งหมดในงานนำเสนอ
ฉันควรใช้ [getXmlAsString]/[setXmlAsString] หรือ [getXmlData]/[setXmlData] เพื่ออัปเดตส่วน XML กำหนดเองหรือไม่?
ใช้ [getXmlAsString] และ [setXmlAsString] เมื่อแอปพลิเคชันทำงานกับข้อความ XML แบบ UTF‑8 ใช้ [getXmlData] และ [setXmlData] เมื่อ XML มีอยู่แล้วในรูปแบบอาร์เรย์ของไบต์ หรือเมื่อการประมวลผลแบบไบนารีสะดวกกว่าผลลัพธ์ ทั้งสองรูปแบบอ้างถึงเนื้อหา XML ของส่วน XML กำหนดเดียวกัน