Quản lý Slide Master của Bài thuyết trình trong Python qua Java

Tổng quan

Một slide master xác định các cài đặt thiết kế chung cho một nhóm slide. Nó có thể chứa các hình dạng chung, logo, nền, kiểu chữ, cài đặt chủ đề và cài đặt chân trang. Trong PowerPoint, việc chỉnh sửa slide master là cách thường dùng để giữ cho bài thuyết trình nhất quán mà không phải lặp lại cùng một định dạng trên mỗi slide.

Aspose.Slides for Python via Java hỗ trợ cùng mô hình này. Một bài thuyết trình có thể chứa một hoặc nhiều slide master, và mỗi slide master có thể chứa một số slide layout. Các slide thường không tham chiếu trực tiếp tới slide master. Thay vào đó, một slide thường sử dụng một slide layout, và slide layout đó thuộc về một slide master.

Cấu trúc phân cấp như sau:

  1. Slide master – xác định thiết kế và chủ đề chung.
  2. Layout slide – xác định bố cục cụ thể của các placeholder và định dạng cấp layout.
  3. Normal slide – chứa nội dung thực tế của bài thuyết trình và sử dụng một layout slide.

Cấu trúc phân cấp của slide master, layout slide và normal slide

Trong Aspose.Slides, một slide master được đại diện bằng lớp MasterSlide. Tất cả các slide master trong một bài thuyết trình có thể truy cập thông qua tập hợp Presentation.getMasters, được biểu diễn bằng MasterSlideCollection.

Truy cập Slide Masters

Trong PowerPoint, bạn có thể mở chế độ xem Slide Master từ View > Slide Master.

Lệnh Slide Master trên thẻ View của PowerPoint

Trong Aspose.Slides, sử dụng tập hợp Presentation.getMasters để truy cập các slide master:

import jpype
import asposeslides

if not jpype.isJVMStarted():
    jpype.startJVM()

from asposeslides.api import Presentation

presentation = Presentation("presentation.pptx")
try:
    first_master_slide = presentation.getMasters().get_Item(0)
    master_slide_count = presentation.getMasters().size()
    first_master_layout_slide_count = first_master_slide.getLayoutSlides().size()

    print(f"Master slides: {master_slide_count}")
    print(f"Layouts in the first master: {first_master_layout_slide_count}")
finally:
    presentation.dispose()

Bạn cũng có thể lấy slide master được sử dụng bởi một slide thường thông qua layout của nó:

import jpype
import asposeslides

if not jpype.isJVMStarted():
    jpype.startJVM()

from asposeslides.api import Presentation

presentation = Presentation("presentation.pptx")
try:
    slide = presentation.getSlides().get_Item(0)
    layout_slide = slide.getLayoutSlide()
    master_slide = layout_slide.getMasterSlide()
    master_slide_name = master_slide.getName()

    print(master_slide_name)
finally:
    presentation.dispose()

Slide Master chứa những gì

Một slide master là một đối tượng giống slide. Nó kế thừa từ BaseSlide, vì vậy nó khai thác nhiều thuộc tính slide giống như các slide thường và layout. Các thành viên riêng của master được liệt kê trên trang API MasterSlide.

Các thành viên master thường dùng bao gồm:

Thành viên Mục đích
getBackground Đặt nền slide ở mức master.
getShapes Lưu trữ các hình dạng được đặt trên master, chẳng hạn logo, khung ảnh và văn bản chia sẻ.
getLayoutSlides Lưu trữ các layout slide thuộc về master.
getThemeManager Cung cấp truy cập vào các API chủ đề master.
getHeaderFooterManager Kiểm soát header, footer, ngày tháng và số slide cho master và các layout con của nó.
getDependingSlides Trả về các slide thường phụ thuộc vào master thông qua layout của chúng.

Thêm hình ảnh vào Slide Master

Khi bạn thêm một hình ảnh vào slide master, hình ảnh sẽ xuất hiện trên các slide sử dụng layout từ master đó. Điều này hữu ích cho logo, watermark, dải trang trí và các yếu tố hình ảnh lặp lại khác.

Ví dụ sau thêm một logo vào slide master đầu tiên:

import jpype
import asposeslides

if not jpype.isJVMStarted():
    jpype.startJVM()

from asposeslides.api import Images, Presentation, SaveFormat, ShapeType

presentation = Presentation("presentation.pptx")
try:
    master_slide = presentation.getMasters().get_Item(0)
    logo = Images.fromFile("logo.png")
    try:
        logo_image = presentation.getImages().addImage(logo)
        master_slide.getShapes().addPictureFrame(ShapeType.Rectangle, 20, 20, 80, 80, logo_image)
    finally:
        logo.dispose()

    presentation.save("presentation-with-logo.pptx", SaveFormat.Pptx)
finally:
    presentation.dispose()

Để biết thêm thông tin về khung ảnh, xem mục Picture Frame.

Kiểm soát hiển thị đồ họa master

Sử dụng BaseSlide.setShowMasterShapes để ẩn các đồ họa master được kế thừa, chẳng hạn logo hoặc hình dạng trang trí, mà không xóa chúng khỏi master. Truyền False cho Slide.setShowMasterShapes trên slide cần ẩn các đồ họa và giữ True trên các slide cần hiển thị chúng.

Ví dụ tự chứa sau tạo một dải trang trí màu xanh trên master và hai slide sử dụng cùng một layout trống. Dải này hiển thị trên slide đầu tiên và ẩn trên slide thứ hai. Không cần file bài thuyết trình hoặc hình ảnh đầu vào.

import jpype
import asposeslides

if not jpype.isJVMStarted():
    jpype.startJVM()

from asposeslides.api import FillType, Presentation, SaveFormat, ShapeType, SlideLayoutType

Color = jpype.JClass("java.awt.Color")

presentation = Presentation()
try:
    master_slide = presentation.getMasters().get_Item(0)
    layout_slide = master_slide.getLayoutSlides().getByType(SlideLayoutType.Blank)
    layout_slide.setShowMasterShapes(True)

    slide_height = jpype.JFloat(presentation.getSlideSize().getSize().getHeight())
    band = master_slide.getShapes().addAutoShape(ShapeType.Rectangle, 0, 0, 60, slide_height)
    band_color = Color(70, 130, 180)
    band.getFillFormat().setFillType(FillType.Solid)
    band.getFillFormat().getSolidFillColor().setColor(band_color)
    band.getLineFormat().getFillFormat().setFillType(FillType.NoFill)

    visible_slide = presentation.getSlides().get_Item(0)
    visible_slide.setLayoutSlide(layout_slide)
    visible_slide.getShapes().clear()

    hidden_slide = presentation.getSlides().addEmptySlide(layout_slide)

    visible_slide.setShowMasterShapes(True)
    hidden_slide.setShowMasterShapes(False)

    presentation.save("master-graphics.pptx", SaveFormat.Pptx)
finally:
    presentation.dispose()

Ví dụ sử dụng layout Blank được cung cấp trong một bài thuyết trình mới và loại bỏ các placeholder mặc định của slide đầu tiên.

Chọn phạm vi cài đặt

Một slide thường sử dụng master của nó thông qua Slide.getLayoutSlide và LayoutSlide.getMasterSlide. Đặt thuộc tính trên một slide riêng chỉ ảnh hưởng đến slide đó. Truyền False cho LayoutSlide.setShowMasterShapes sẽ ẩn đồ họa master cho tất cả các slide dùng layout chung, ngay cả khi cài đặt riêng của chúng là True. Để ẩn đồ họa chỉ trên một slide, thay đổi thuộc tính slide và để layout chung không thay đổi.

Cài đặt này không được hỗ trợ làm công cụ kiểm soát hiển thị trên chính slide master. Trên master, getShowMasterShapes luôn trả về False, và truyền True cho setShowMasterShapes sẽ sinh ra ngoại lệ. Áp dụng nó cho slide thường hoặc layout thay vì master.

Phân biệt đồ họa và nền

Thao tác Hiệu ứng
Ẩn đồ họa master Kiểm soát hiển thị các hình dạng master kế thừa mà không xóa chúng hoặc thay đổi các hình dạng của slide.
Thay đổi màu nền slide Thay đổi màu, gradient hoặc hình ảnh nền. Đồ họa master là các hình dạng riêng và có thể vẫn hiển thị trên nền đó. Xem mục Presentation Background.
Xóa một hình dạng khỏi master Loại bỏ nguồn hình dạng chung, vì vậy nó không còn khả dụng cho bất kỳ slide nào sử dụng master đó.

Làm việc với Placeholder

Placeholder thường được định nghĩa trên layout slide. Slide master cung cấp kiểu và chủ đề chung mà các layout kế thừa, trong khi mỗi layout quyết định placeholder nào khả dụng và chúng được đặt ở đâu.

Trong PowerPoint, các lệnh placeholder có sẵn trong chế độ xem Slide Master.

Lệnh Insert Placeholder trong chế độ xem Slide Master của PowerPoint

Để thêm placeholder mới với Aspose.Slides, làm việc với layout slide thuộc về master:

import jpype
import asposeslides

if not jpype.isJVMStarted():
    jpype.startJVM()

from asposeslides.api import Presentation, SaveFormat, SlideLayoutType

presentation = Presentation("presentation.pptx")
try:
    master_slide = presentation.getMasters().get_Item(0)
    blank_layout_slide = master_slide.getLayoutSlides().getByType(SlideLayoutType.Blank)

    if blank_layout_slide is None:
        blank_layout_slide = master_slide.getLayoutSlides().add(SlideLayoutType.Blank, "Blank")

    blank_layout_slide.getPlaceholderManager().addTextPlaceholder(60, 120, 600, 80)

    presentation.getSlides().addEmptySlide(blank_layout_slide)
    presentation.save("presentation-with-placeholder.pptx", SaveFormat.Pptx)
finally:
    presentation.dispose()

Bạn cũng có thể định dạng các shape placeholder đã tồn tại trên slide master. Ví dụ sau tìm placeholder tiêu đề và áp dụng màu gradient tuyến tính:

import jpype
import asposeslides

if not jpype.isJVMStarted():
    jpype.startJVM()

from asposeslides.api import AutoShape, FillType, GradientShape, PlaceholderType, Presentation, SaveFormat

Color = jpype.JClass("java.awt.Color")

presentation = Presentation("presentation.pptx")
try:
    master_slide = presentation.getMasters().get_Item(0)
    title_placeholder = None

    for shape in master_slide.getShapes():
        if isinstance(shape, AutoShape):
            if shape.getPlaceholder() is not None and shape.getPlaceholder().getType() == PlaceholderType.Title:
                title_placeholder = shape
                break

    if title_placeholder is not None:
        red_gradient_color = Color(255, 0, 0)
        purple_gradient_color = Color(128, 0, 128)

        title_placeholder.getFillFormat().setFillType(FillType.Gradient)
        title_placeholder.getFillFormat().getGradientFormat().setGradientShape(GradientShape.Linear)
        title_placeholder.getFillFormat().getGradientFormat().getGradientStops().add(jpype.JFloat(0.0), red_gradient_color)
        title_placeholder.getFillFormat().getGradientFormat().getGradientStops().add(jpype.JFloat(1.0), purple_gradient_color)

    presentation.save("presentation-title-style.pptx", SaveFormat.Pptx)
finally:
    presentation.dispose()

Placeholder tiêu đề được định dạng và kế thừa bởi các slide thường

Để biết thêm các tùy chọn định dạng placeholder và văn bản, xem Set Prompt Text in Placeholder và Text Formatting.

Thay đổi nền Slide Master

Nền master được kế thừa bởi các layout và slide không ghi đè nó. Ví dụ sau đặt màu nền rắn cho slide master đầu tiên:

import jpype
import asposeslides

if not jpype.isJVMStarted():
    jpype.startJVM()

from asposeslides.api import BackgroundType, FillType, Presentation, SaveFormat

Color = jpype.JClass("java.awt.Color")

presentation = Presentation("presentation.pptx")
try:
    master_slide = presentation.getMasters().get_Item(0)
    master_background_color = Color.GREEN

    master_slide.getBackground().setType(BackgroundType.OwnBackground)
    master_slide.getBackground().getFillFormat().setFillType(FillType.Solid)
    master_slide.getBackground().getFillFormat().getSolidFillColor().setColor(master_background_color)

    presentation.save("presentation-master-background.pptx", SaveFormat.Pptx)
finally:
    presentation.dispose()

Đối với các chủ đề liên quan, xem Presentation Background và Presentation Theme.

Sao chép Slide Master sang bài thuyết trình khác

Sử dụng MasterSlideCollection.addClone để sao chép một slide master vào một bài thuyết trình khác. Master đã sao chép sau đó có thể được sử dụng bởi các layout và slide trong bài thuyết trình đích.

import jpype
import asposeslides

if not jpype.isJVMStarted():
    jpype.startJVM()

from asposeslides.api import Presentation, SaveFormat

source_presentation = Presentation("source.pptx")
destination_presentation = Presentation("destination.pptx")
try:
    source_master_slide = source_presentation.getMasters().get_Item(0)
    cloned_master_slide = destination_presentation.getMasters().addClone(source_master_slide)

    destination_presentation.save("destination-with-master.pptx", SaveFormat.Pptx)
finally:
    source_presentation.dispose()
    destination_presentation.dispose()

Nếu bạn cần sao chép các slide thường cùng với master của chúng, xem mục Clone Slides.

Thêm nhiều Slide Master

Một bài thuyết trình có thể chứa nhiều slide master. Điều này hữu ích khi các phần khác nhau yêu cầu thương hiệu, cấu trúc trang hoặc cài đặt chủ đề khác nhau.

Các lệnh PowerPoint để chèn và quản lý slide master

Ví dụ sau sao chép master mặc định, đặt nền khác cho bản sao, tạo một layout dưới master đã sao chép và thêm một slide mới dựa trên layout đó:

import jpype
import asposeslides

if not jpype.isJVMStarted():
    jpype.startJVM()

from asposeslides.api import BackgroundType, FillType, Presentation, SaveFormat, SlideLayoutType

Color = jpype.JClass("java.awt.Color")

presentation = Presentation("presentation.pptx")
try:
    default_master_slide = presentation.getMasters().get_Item(0)
    section_master_slide = presentation.getMasters().addClone(default_master_slide)
    section_master_background_color = Color.LIGHT_GRAY

    section_master_slide.getBackground().setType(BackgroundType.OwnBackground)
    section_master_slide.getBackground().getFillFormat().setFillType(FillType.Solid)
    section_master_slide.getBackground().getFillFormat().getSolidFillColor().setColor(section_master_background_color)

    source_blank_layout = default_master_slide.getLayoutSlides().getByType(SlideLayoutType.Blank)
    if source_blank_layout is None:
        source_blank_layout = default_master_slide.getLayoutSlides().get_Item(0)

    section_blank_layout = section_master_slide.getLayoutSlides().addClone(source_blank_layout)

    presentation.getSlides().addEmptySlide(section_blank_layout)
    presentation.save("presentation-with-multiple-masters.pptx", SaveFormat.Pptx)
finally:
    presentation.dispose()

So sánh Slide Masters

Slide master có thể được so sánh bằng phương thức equals kế thừa từ BaseSlide. So sánh kiểm tra cấu trúc và nội dung tĩnh, chẳng hạn shape, văn bản, định dạng, hoạt ảnh và các cài đặt slide khác. Nó không so sánh các định danh duy nhất như slide ID, hay các giá trị placeholder động như ngày hiện tại.

import jpype
import asposeslides

if not jpype.isJVMStarted():
    jpype.startJVM()

from asposeslides.api import Presentation

first_presentation = Presentation("first.pptx")
second_presentation = Presentation("second.pptx")
try:
    first_presentation_master_count = first_presentation.getMasters().size()
    second_presentation_master_count = second_presentation.getMasters().size()

    for first_master_index in range(first_presentation_master_count):
        for second_master_index in range(second_presentation_master_count):
            first_master_slide = first_presentation.getMasters().get_Item(first_master_index)
            second_master_slide = second_presentation.getMasters().get_Item(second_master_index)
            are_master_slides_equal = first_master_slide.equals(second_master_slide)

            if are_master_slides_equal:
                print(f"first.pptx master #{first_master_index} equals second.pptx master #{second_master_index}")
finally:
    first_presentation.dispose()
    second_presentation.dispose()

Để biết thêm chi tiết, xem mục Compare Presentation Slides.

Đặt Slide Master View làm chế độ xem mặc định

Sử dụng phương thức setLastView trên ViewProperties để điều khiển chế độ xem PowerPoint mở đầu tiên. Ví dụ sau mở bài thuyết trình ở chế độ Slide Master:

import jpype
import asposeslides

if not jpype.isJVMStarted():
    jpype.startJVM()

from asposeslides.api import Presentation, SaveFormat, ViewType

presentation = Presentation("presentation.pptx")
try:
    presentation.getViewProperties().setLastView(ViewType.SlideMasterView)
    presentation.save("presentation-master-view.pptx", SaveFormat.Pptx)
finally:
    presentation.dispose()

Đối với các cài đặt chế độ xem khác, xem mục Save Presentation.

Xóa các Slide Master không sử dụng

Đôi khi bài thuyết trình chứa các slide master không còn được bất kỳ slide thường nào sử dụng. Xóa các master không dùng có thể giảm kích thước file và đơn giản hoá việc bảo trì mẫu.

Sử dụng removeUnused để xóa các master không dùng khỏi tập hợp Presentation.getMasters:

import jpype
import asposeslides

if not jpype.isJVMStarted():
    jpype.startJVM()

from asposeslides.api import Presentation, SaveFormat

presentation = Presentation("presentation.pptx")
try:
    presentation.getMasters().removeUnused(True)
    presentation.save("presentation-clean.pptx", SaveFormat.Pptx)
finally:
    presentation.dispose()

Bạn cũng có thể dùng phương thức low-code Compress.removeUnusedMasterSlides:

import jpype
import asposeslides

if not jpype.isJVMStarted():
    jpype.startJVM()

from asposeslides.api import Compress, Presentation, SaveFormat

presentation = Presentation("presentation.pptx")
try:
    Compress.removeUnusedMasterSlides(presentation)
    presentation.save("presentation-clean.pptx", SaveFormat.Pptx)
finally:
    presentation.dispose()

Câu hỏi thường gặp

Sự khác nhau giữa slide master và layout slide là gì?

Slide master định nghĩa các cài đặt thiết kế chung như chủ đề, nền, hình dạng chung và kiểu chữ. Layout slide thuộc về một slide master và định nghĩa bố cục cụ thể của các placeholder. Một slide thường sử dụng một layout slide, vì vậy nó kế thừa cả từ layout và master.

Một bài thuyết trình có thể chứa nhiều slide master không?

Có. Một bài thuyết trình có thể chứa nhiều slide master. Sử dụng nhiều master khi các phần khác nhau cần hệ thống hình ảnh hoặc thương hiệu riêng.

Nên thêm placeholder vào slide master hay layout slide?

Trong hầu hết các trường hợp, thêm placeholder vào layout slide. Đặt các yếu tố hình ảnh và định dạng chung trên slide master, sau đó đặt các placeholder nội dung trên các layout mà các slide thường sẽ dùng.

Có thể xóa một slide master mà vẫn còn được sử dụng không?

Không. Slide master có các slide phụ thuộc không thể bị xóa trực tiếp một cách an toàn. Đầu tiên chuyển những slide đó sang layout thuộc master khác, hoặc dùng phương pháp dọn dẹp master không dùng để chỉ xóa các master không còn được sử dụng.