Quản lý Thẻ và Dữ liệu Tùy chỉnh trong Bài thuyết trình bằng Python
Tổng quan
Bài viết này giải thích cách Aspose.Slides làm việc với thẻ và dữ liệu tùy chỉnh trong các bài thuyết trình PowerPoint. Dữ liệu đặc thù cho bài thuyết trình có thể được lưu dưới dạng thẻ hoặc phần XML tùy chỉnh. Thẻ là các cặp chuỗi khóa-giá trị đơn giản, trong khi phần XML tùy chỉnh có thể lưu trữ siêu dữ liệu có cấu trúc và các tải XML riêng của ứng dụng.
Aspose.Slides cung cấp API để thêm, đọc, cập nhật, kiểm toán và xóa phần XML tùy chỉnh ở cấp độ bài thuyết trình, slide và shape. Phần XML tùy chỉnh hữu ích cho các tích hợp lưu trữ thông tin như định danh quản lý tài liệu, trạng thái quy trình công việc, siêu dữ liệu tuân thủ, dữ liệu ràng buộc mẫu, hoặc các dữ liệu ứng dụng có cấu trúc khác bên trong một bài thuyết trình.
Lưu trữ dữ liệu trong tệp bài thuyết trình
Các tệp PPTX—các tệp có phần mở rộng .pptx—được lưu ở định dạng PresentationML, là một phần của thông số kỹ thuật Office Open XML. Office Open XML định nghĩa cấu trúc gói và các quan hệ được sử dụng để lưu trữ nội dung bài thuyết trình và dữ liệu liên quan.
Một bài thuyết trình chứa nhiều phần được kết nối bằng các quan hệ. Ví dụ, một phần slide chứa nội dung của một slide duy nhất và có thể có các quan hệ rõ ràng tới các phần khác được định nghĩa bởi ISO/IEC 29500.
Dữ liệu tùy chỉnh có thể được lưu dưới dạng thẻ (TagCollection) hoặc phần XML tùy chỉnh (CustomXmlPartCollection). Cả hai đều có sẵn thông qua lớp CustomData.
Note
Thẻ lưu trữ các cặp khóa-giá trị chuỗi đơn giản. Phần XML tùy chỉnh lưu trữ dữ liệu XML có cấu trúc và có thể được liên kết với một bài thuyết trình, slide hoặc shape.Làm việc với phần XML tùy chỉnh
Phương thức CustomData.getCustomXmlParts trả về bộ sưu tập các phần XML tùy chỉnh liên kết với một đối tượng bài thuyết trình cụ thể. Ví dụ:
- Bộ sưu tập CustomData.getCustomXmlParts của bài thuyết trình chứa các phần XML tùy chỉnh liên kết với chính bài thuyết trình.
- Bộ sưu tập CustomData.getCustomXmlParts của slide chứa các phần XML tùy chỉnh liên kết với slide cụ thể.
- Bộ sưu tập CustomData.getCustomXmlParts của shape chứa các phần XML tùy chỉnh liên kết với shape cụ thể.
Sử dụng Presentation.getAllCustomXmlParts khi bạn cần kiểm tra tất cả các phần XML tùy chỉnh trong bài thuyết trình bất kể chúng được liên kết ở đâu.
Thêm một phần XML tùy chỉnh vào bài thuyết trình
Sử dụng CustomXmlPartCollection.add để thêm dữ liệu XML vào bộ sưu tập phần XML tùy chỉnh. XML phải hợp lệ và không rỗng.
Ví dụ sau thêm siêu dữ liệu có cấu trúc vào bộ sưu tập dữ liệu tùy chỉnh cấp độ bài thuyết trình:
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 tự động gán một định danh. Chỉ đặt UUID cụ thể khi cần thiết.
item_id = UUID.randomUUID()
custom_xml_part.setItemId(item_id)
presentation.save("presentation_with_custom_xml.pptx", SaveFormat.Pptx)
finally:
presentation.dispose()
Phương thức add cũng có thể nhận XML dưới dạng mảng byte hoặc luồng đầu vào, hữu ích khi nội dung XML đã có dạng nhị phân.
Thêm một phần XML tùy chỉnh vào slide hoặc shape
Dữ liệu XML tùy chỉnh có thể được liên kết với một slide hoặc shape cụ thể thay vì toàn bộ bài thuyết trình. Điều này hữu ích khi siêu dữ liệu mô tả chỉ một đối tượng, chẳng hạn như khóa mẫu, định danh bản ghi bên ngoài, hoặc thông tin ràng buộc.
Ví dụ sau thêm một phần XML tùy chỉnh vào một slide và một phần khác vào một shape:
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()
Cấp độ mà phần được thêm vào quyết định bộ sưu tập CustomData.getCustomXmlParts của đối tượng nào sẽ chứa quan hệ tới phần đó. Dữ liệu cấp độ bài thuyết trình phù hợp cho siêu dữ liệu toàn tài liệu, dữ liệu cấp độ slide cho thông tin thuộc về một slide cụ thể, và dữ liệu cấp độ shape cho siêu dữ liệu gắn với một shape cá nhân.
Liệt kê và kiểm toán tất cả các phần XML tùy chỉnh
Sử dụng Presentation.getAllCustomXmlParts để lấy tất cả các phần XML tùy chỉnh từ một bài thuyết trình. Mỗi CustomXmlPart cung cấp định danh, nội dung XML và các schema không gian tên liên quan.
Ví dụ sau liệt kê tất cả các phần XML tùy chỉnh và schema không gian tên của chúng:
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 trả về các schema XML liên quan tới phần XML tùy chỉnh. Thông tin này hữu ích khi kiểm toán các bài thuyết trình có chứa XML được tạo bởi hệ thống bên ngoài.
Đọc và cập nhật nội dung XML và ItemId
Sử dụng CustomXmlPart.getXmlAsString và setXmlAsString để làm việc với XML dưới dạng chuỗi UTF-8, hoặc getXmlData và setXmlData để làm việc với các byte XML thô.
Phương thức CustomXmlPart.getItemId trả về UUID xác định phần XML tùy chỉnh trong tài liệu Office Open XML. Sử dụng setItemId khi một tích hợp yêu cầu một định danh mới.
Ví dụ sau cập nhật nội dung XML và định danh:
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]
# Đọc XML hiện tại dưới dạng văn bản.
current_xml_content = custom_xml_part.getXmlAsString()
print(current_xml_content)
# Cập nhật XML dưới dạng chuỗi 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 cung cấp cùng nội dung XML dưới dạng byte thô.
custom_xml_data = custom_xml_part.getXmlData()
print(bytes(custom_xml_data).decode("utf-8"))
# Thay thế định danh khi tích hợp yêu cầu.
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()
Khi gọi setXmlAsString hoặc setXmlData, cung cấp XML hợp lệ, không rỗng. Sử dụng một trong hai biểu diễn tùy thuộc vào việc ứng dụng của bạn làm việc chủ yếu với chuỗi hay dữ liệu byte.
Xóa một phần XML tùy chỉnh
Aspose.Slides cung cấp một số cách để xóa dữ liệu XML tùy chỉnh:
- CustomXmlPart.remove xóa phần XML tùy chỉnh khỏi bài thuyết trình.
- CustomXmlPartCollection.remove xóa một phần cụ thể khỏi bộ sưu tập phần XML tùy chỉnh.
- CustomXmlPartCollection.removeAt xóa phần tại một chỉ mục bộ sưu tập xác định.
- CustomXmlPartCollection.clear xóa tất cả các phần khỏi một bộ sưu tập cụ thể.
Ví dụ sau xóa một phần XML tùy chỉnh cấp độ bài thuyết trình bằng tham chiếu:
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()
Nếu bạn đã có một CustomXmlPart và muốn xóa phần đó khỏi bài thuyết trình thay vì xử lý một bộ sưu tập cụ thể, hãy gọi CustomXmlPart.remove.
Bạn cũng có thể xóa một mục theo chỉ mục:
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()
Xóa toàn bộ các phần XML tùy chỉnh khỏi một bộ sưu tập
Sử dụng clear khi tất cả các phần XML tùy chỉnh liên kết với một đối tượng bài thuyết trình cụ thể cần được xóa.
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 chỉ ảnh hưởng đến bộ sưu tập được chọn. Ví dụ, xóa bộ sưu tập của một slide không xóa các bộ sưu tập cấp độ bài thuyết trình hoặc shape.
Để xóa mọi phần XML tùy chỉnh trong bài thuyết trình, duyệt qua getAllCustomXmlParts và xóa từng phần:
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()
Xử lý các phần XML tùy chỉnh được liên kết hoặc chia sẻ
Trong một bài thuyết trình Office Open XML, cùng một phần XML tùy chỉnh có thể được tham chiếu từ nhiều đối tượng bài thuyết trình. Ví dụ, một tệp hiện có có thể chứa quan hệ từ nhiều slide hoặc shape tới cùng một phần XML tùy chỉnh cơ bản.
Một phần chia sẻ nên được coi là một đối tượng dữ liệu duy nhất với nhiều tham chiếu:
- Cập nhật nó bằng setXmlAsString, setXmlData hoặc setItemId sẽ thay đổi phần XML tùy chỉnh nền, do đó thay đổi sẽ áp dụng ở mọi nơi mà phần đó được tham chiếu.
- getItemId có thể được dùng để xác định cùng một phần XML tùy chỉnh khi kiểm toán các bộ sưu tập cấp độ đối tượng.
- Xóa một phần khỏi một bộ sưu tập getCustomXmlParts cụ thể sẽ xóa nó chỉ khỏi bộ sưu tập đó. Sử dụng CustomXmlPart.remove khi phần đó cần được xóa hoàn toàn khỏi bài thuyết trình.
- Trước khi xóa hoặc thay thế một phần được chia sẻ, kiểm tra các bộ sưu tập cấp độ đối tượng để xác định liệu các slide hoặc shape khác còn tham chiếu tới nó hay không.
Các overload của add tạo một phần XML tùy chỉnh mới từ nội dung XML; chúng không chấp nhận một CustomXmlPart đã tồn tại. Do đó, các quan hệ chia sẻ thường gặp nhất khi tải các bài thuyết trình đã chứa chúng.
Ví dụ sau kiểm toán các bộ sưu tập cấp độ bài thuyết trình, slide và shape theo ItemId và báo cáo các phần được tham chiếu từ hơn một nơi:
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()
Kiểm toán kiểu này hữu ích trước khi sửa đổi hoặc xóa dữ liệu XML tùy chỉnh trong các bài thuyết trình được tạo bởi hệ thống bên ngoài, vì cùng một phần siêu dữ liệu có thể tham gia vào hơn một quan hệ.
Lấy giá trị của các thẻ
Trong Slides, một thẻ tương ứng với phương thức DocumentProperties.getKeywords. Đoạn mã mẫu này cho thấy cách lấy giá trị thẻ bằng Aspose.Slides for Python via Java cho 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()
Thêm thẻ vào bài thuyết trình
Aspose.Slides cho phép bạn thêm thẻ vào các bài thuyết trình. Một thẻ thường bao gồm hai mục:
- tên của thuộc tính tùy chỉnh, ví dụ,
MyTag; - giá trị của thuộc tính tùy chỉnh, ví dụ,
My Tag Value.
Nếu bạn cần phân loại các bài thuyết trình dựa trên một quy tắc hoặc thuộc tính cụ thể, bạn có thể thêm thẻ cho mục đích đó. Ví dụ, nếu muốn phân loại các bài thuyết trình từ các quốc gia Bắc Mỹ, bạn có thể tạo một thẻ North American và gán quốc gia liên quan làm giá trị.
Đoạn mã mẫu này cho thấy cách thêm một thẻ vào Presentation bằng 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()
Thẻ cũng có thể được đặt cho một 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()
Hoặc cho một Shape riêng lẻ:
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()
Giới hạn
Các thẻ được thêm thông qua bộ sưu tập CustomData.getTags chỉ được lưu trong tệp PowerPoint. Chúng không được chuyển sang cấu trúc thẻ PDF khi bài thuyết trình được xuất sang PDF. Do đó, một định danh tùy chỉnh được gán dưới dạng thẻ không thể được truy xuất từ PDF có thẻ.
Cách khắc phục: Bạn có thể lưu một định danh tùy chỉnh trong Alt Text của đối tượng (ví dụ, Shape.setAlternativeText với giá trị "MyId"). Sau khi xuất sang PDF, Alt Text có thể xuất hiện trong cấu trúc thẻ PDF.
FAQ
Tôi có thể xóa tất cả thẻ khỏi một bài thuyết trình, slide hoặc shape trong một thao tác không?
Có. Bộ sưu tập tag collection hỗ trợ thao tác clear để xóa toàn bộ các cặp khóa-giá trị cùng một lúc.
Làm thế nào để xóa một thẻ đơn lẻ theo tên mà không cần duyệt qua toàn bộ bộ sưu tập?
Sử dụng remove trên tag collection để xóa thẻ theo khóa của nó.
Làm sao tôi có thể lấy danh sách đầy đủ các tên thẻ để phân tích hoặc lọc?
Sử dụng getNamesOfTags trên tag collection; nó trả về một mảng chứa tất cả các tên thẻ.
Làm sao tôi có thể tìm tất cả các phần XML tùy chỉnh bất kể chúng được lưu ở đâu?
Sử dụng Presentation.getAllCustomXmlParts để lấy tất cả các phần XML tùy chỉnh trong bài thuyết trình.
Nên sử dụng getXmlAsString/setXmlAsString hay getXmlData/setXmlData để cập nhật một phần XML tùy chỉnh?
Sử dụng getXmlAsString và setXmlAsString khi ứng dụng làm việc với văn bản XML UTF-8. Sử dụng getXmlData và setXmlData khi XML đã có sẵn dưới dạng mảng byte hoặc khi xử lý dạng nhị phân thuận lợi hơn. Cả hai biểu diễn đều đề cập tới nội dung XML của cùng một phần XML tùy chỉnh.