مدیریت اسلاید مسترهای ارائه در پایتون از طریق جاوا

نمای کلی

یک slide master تنظیمات طراحی مشترک را برای گروهی از اسلایدها تعریف می‌کند. می‌تواند شامل اشکال عمومی، لوگوها، پس‌زمینه‌ها، سبک‌های متن، تنظیمات تم و تنظیمات پاورقی باشد. در PowerPoint، ویرایش یک slide master معمول‌ترین روش برای حفظ سازگاری ارائه بدون تکرار قالب‌بندی یکسان در هر اسلاید است.

Aspose.Slides برای Python از طریق Java از همین مدل پشتیبانی می‌کند. یک ارائه می‌تواند یک یا چند اسلاید مستر داشته باشد و هر اسلاید مستر می‌تواند چندین اسلاید لِی‌آوت داشته باشد. اسلایدهای معمولی معمولاً مستقیماً به اسلاید مستر ارجاع نمی‌دهند. در عوض، یک اسلاید معمولی از یک اسلاید لِی‌آوت استفاده می‌کند که آن لِی‌آوت به یک اسلاید مستر تعلق دارد.

ساختار به صورت زیر است:

  1. Slide master - طراحی و تم مشترک را تعریف می‌کند.
  2. Layout slide - چینش خاصی از جای‌دارهای محتوا و قالب‌بندی سطح لِی‌آوت را تعریف می‌کند.
  3. Normal slide - محتوای واقعی ارائه را در بر دارد و از یک اسلاید لِی‌آوت استفاده می‌کند.

The hierarchy of master slides, layout slides, and normal slides

در Aspose.Slides، یک slide master توسط کلاس MasterSlide نمایش داده می‌شود. همه اسلایدهای مستر در یک ارائه از طریق مجموعه Presentation.getMasters در دسترس هستند که توسط MasterSlideCollection نمایان می‌شود.

دسترسی به Slide Masters

در PowerPoint می‌توانید نمای Slide Master را از View > Slide Master باز کنید.

The Slide Master command on the PowerPoint View tab

در Aspose.Slides، برای دسترسی به اسلایدهای مستر از مجموعه Presentation.getMasters استفاده کنید:

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()

همچنین می‌توانید اسلاید مستری که یک اسلاید معمولی از طریق لِی‌آوت خود استفاده می‌کند را به دست آورید:

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

یک اسلاید مستر یک شیء شبیه اسلاید است. این شیء از BaseSlide به ارث می‌برد، بنابراین بسیاری از ویژگی‌های اسلاید که توسط اسلایدهای معمولی و لِی‌آوت استفاده می‌شود را نشان می‌دهد. اعضای خاص مستر در صفحه API MasterSlide فهرست شده‌اند.

عضوهای معمولاً استفاده‌شدهٔ اسلاید مستر شامل:

Member Purpose
getBackground تنظیم پس‌زمینهٔ سطح مستر اسلاید.
getShapes نگهداری اشکالی که روی مستر قرار گرفته‌اند، مانند لوگوها، قاب‌های تصویر و متن‌های مشترک.
getLayoutSlides نگهداری اسلایدهای لِی‌آوتی که به مستر تعلق دارند.
getThemeManager دسترسی به APIهای تم مستر.
getHeaderFooterManager کنترل سرصفحه، پاورقی، تاریخ و شماره اسلاید برای مستر و لِی‌آوت‌های فرزند آن.
getDependingSlides بازگرداندن اسلایدهای معمولی که از طریق لِی‌آوت‌های خود به مستر وابسته‌اند.

افزودن تصویر به یک Slide Master

هنگامی که یک تصویر را به یک اسلاید مستر اضافه می‌کنید، در اسلایدهایی که از لِی‌آوت‌های آن مستر استفاده می‌کنند ظاهر می‌شود. این کار برای لوگوها، واترمارک‌ها، باندهای تزئینی و سایر عناصر بصری تکراری مفید است.

مثال زیر یک لوگو را به اولین اسلاید مستر اضافه می‌کند:

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()

برای اطلاعات بیشتر دربارهٔ قاب‌های تصویر، به Picture Frame مراجعه کنید.

کنترل نمایش گرافیک‌های مستر

از BaseSlide.setShowMasterShapes استفاده کنید تا گرافیک‌های ارث‌برگرفتهٔ مستر مانند لوگوها یا اشکال تزئینی را بدون حذف آن‌ها از مستر مخفی کنید. مقدار False را به Slide.setShowMasterShapes در اسلایدی که باید این گرافیک‌ها حذف شوند بدهید و روی اسلایدهایی که باید نمایش داده شوند مقدار True بگذارید.

مثال زیر یک باند تزئینی آبی روی یک مستر و دو اسلاید که از همان لِی‌آوت خالی استفاده می‌کنند، ایجاد می‌کند. باند در اسلاید اول قابل مشاهده و در اسلاید دوم مخفی است. نیازی به ارائه یا تصویر ورودی نیست.

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()

این مثال از لِی‌آوت Blank موجود در یک ارائهٔ جدید استفاده می‌کند و جای‌دارهای اسلاید اولیه را حذف می‌کند.

انتخاب دامنهٔ تنظیم

یک اسلاید معمولی از طریق Slide.getLayoutSlide و LayoutSlide.getMasterSlide به مستر خود دسترسی پیدا می‌کند. تنظیم این ویژگی روی یک اسلاید منفرد تنها بر همان اسلاید تأثیر می‌گذارد. مقدار False را به LayoutSlide.setShowMasterShapes پاس دادن گرافیک‌های مستر را برای اسلایدهایی که از همان لِی‌آوت مشترک استفاده می‌کنند مخفی می‌کند، حتی اگر تنظیم خودشان True باشد. برای مخفی کردن گرافیک فقط در یک اسلاید، ویژگی اسلاید را تغییر دهید و لِی‌آوت مشترک را دست‌نخورده بگذارید.

این تنظیم به‌عنوان کنترل قابلیت نمایش بر روی خود اسلاید مستر پشتیبانی نمی‌شود. در یک مستر، getShowMasterShapes همیشه False برمی‌گرداند و پاس دادن True به setShowMasterShapes استثنائی ایجاد می‌کند. آن را بر روی یک اسلاید معمولی یا یک لِی‌آوت اعمال کنید.

تمایز گرافیک‌ها از پس‌زمینه

Operation Effect
Hide master graphics کنترل نمایش اشکال ارث‌برگرفتهٔ مستر بدون حذف یا تغییر اشکال خود اسلاید.
Change the slide background fill تغییر رنگ، گرادیانت یا تصویر پس‌زمینه. گرافیک‌های مستر اشکال جداگانه‌ای هستند و می‌توانند بر روی آن پس‌زمینه دیده شوند. به Presentation Background مراجعه کنید.
Delete a shape from the master حذف شکل منبع مشترک، به‌طوری که دیگر برای هیچ اسلایدی که از آن مستر استفاده می‌کند در دسترس نباشد.

کار با Placeholders

Placeholders معمولاً در اسلایدهای لِی‌آوت تعریف می‌شوند. اسلاید مستر سبک و تم مشترکی را که این لِی‌آوت‌ها ارث می‌برند، فراهم می‌کند، در حالی که هر لِی‌آوت تصمیم می‌گیرد کدام Placeholders در دسترس هستند و کجا قرار می‌گیرند.

در PowerPoint، فرمان‌های Placeholder در نمای Slide Master موجود است.

The Insert Placeholder command in PowerPoint Slide Master view

برای افزودن Placeholders جدید با Aspose.Slides، با اسلاید لِی‌آوتی که به مستر تعلق دارد کار کنید:

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()

همچنین می‌توانید اشکال Placeholder که قبلاً روی یک اسلاید مستر وجود دارند را قالب‌بندی کنید. مثال زیر Placeholder عنوان را پیدا کرده و یک پر کردن گرادیان خطی اعمال می‌کند:

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()

Formatted title placeholder inherited by normal slides

برای گزینه‌های بیشتر مربوط به Placeholder و قالب‌بندی متن، به Set Prompt Text in Placeholder و Text Formatting مراجعه کنید.

تغییر پس‌زمینهٔ یک Slide Master

پس‌زمینهٔ مستر توسط لِی‌آوت‌ها و اسلایدهایی که آن را بازنویسی نمی‌کنند، به ارث می‌رسد. مثال زیر یک رنگ پس‌زمینهٔ ثابت برای اولین اسلاید مستر تنظیم می‌کند:

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()

برای موضوعات مرتبط، به Presentation Background و Presentation Theme مراجعه کنید.

کلون کردن یک Slide Master به ارائه‌ای دیگر

از MasterSlideCollection.addClone برای کپی یک اسلاید مستر به یک ارائهٔ دیگر استفاده کنید. مستر کپی‌شده سپس می‌تواند توسط لِی‌آوت‌ها و اسلایدهای مقصد استفاده شود.

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()

اگر نیاز دارید اسلایدهای معمولی را همراه با مسترشان کلون کنید، به Clone Slides مراجعه کنید.

اضافه‌کردن چند Slide Master

یک ارائه می‌تواند چندین اسلاید مستر داشته باشد. این برای بخش‌های مختلف که نیاز به برندینگ، ساختار صفحه یا تنظیمات تم متفاوتی دارند مفید است.

PowerPoint commands for inserting and managing master slides

مثال زیر مستر پیش‌فرض را کلون می‌کند، به کلون پس‌زمینهٔ متفاوتی می‌دهد، یک لِی‌آوت تحت آن مستر کلون‌شده ایجاد می‌کند و یک اسلاید جدید بر پایهٔ آن لِی‌آوت اضافه می‌کند:

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()

مقایسه Slide Masters

اسلایدهای مستر می‌توانند با استفاده از متد equals که از BaseSlide به ارث می‌رسد، مقایسه شوند. این مقایسه ساختار و محتوای ثابت مانند اشکال، متن، قالب‌بندی، انیمیشن‌ها و سایر تنظیمات اسلاید را بررسی می‌کند. شناسه‌های منحصر به فرد مانند شناسه‌های اسلاید یا مقادیر پویا مانند تاریخ جاری در مقایسه در نظر گرفته نمی‌شوند.

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()

برای اطلاعات بیشتر، به Compare Presentation Slides مراجعه کنید.

تنظیم Slide Master View به عنوان نمای پیش‌فرض

از متد setLastView بر روی ViewProperties استفاده کنید تا نمایی که PowerPoint ابتدا باز می‌کند کنترل شود. مثال زیر ارائه را در نمای 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()

برای تنظیمات نمای بیشتر، به Save Presentation مراجعه کنید.

حذف Slide Masterهای استفاده‌نشده

گاهی اوقات ارائه‌ها شامل اسلایدهای مستری می‌شوند که دیگر توسط هیچ اسلاید معمولی استفاده نمی‌شوند. حذف مسترهای استفاده‌نشده می‌تواند اندازهٔ فایل را کاهش دهد و نگهداری قالب را ساده‌تر کند.

از removeUnused برای حذف مسترهای استفاده‌نشده از مجموعه 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()

همچنین می‌توانید از متد کم‌کد 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()

سوالات متداول

تفاوت اسلاید مستر و اسلاید لِی‌آوت چیست؟

یک اسلاید مستر تنظیمات طراحی مشترکی مانند تم، پس‌زمینه، اشکال عمومی و سبک‌های متن را تعریف می‌کند. یک اسلاید لِی‌آوت به یک اسلاید مستر تعلق دارد و چینش خاصی از جای‌دارها را تعیین می‌کند. یک اسلاید معمولی از یک اسلاید لِی‌آوت استفاده می‌کند، بنابراین از هر دو لِی‌آوت و مستر ارث می‌برد.

آیا یک ارائه می‌تواند چندین اسلاید مستر داشته باشد؟

بله. یک ارائه می‌تواند چندین اسلاید مستر داشته باشد. از مسترهای متعدد زمانی استفاده کنید که بخش‌های مختلف به سیستم‌های بصری یا برندینگ متفاوتی نیاز دارند.

آیا باید Placeholders را به اسلاید مستر یا اسلاید لِی‌آوت اضافه کنم؟

در اکثر موارد Placeholders را به اسلایدهای لِی‌آوت اضافه کنید. عناصر بصری مشترک و قالب‌بندی‌های مشترک را در اسلاید مستر قرار دهید و سپس Placeholders محتوا را در لِی‌آوت‌هایی که اسلایدهای معمولی استفاده می‌کنند، بگذارید.

آیا می‌توانم یک اسلاید مستر که هنوز استفاده می‌شود را حذف کنم؟

خیر. یک اسلاید مستر که اسلایدهای وابسته دارد، به‌صورت مستقیم نمی‌تواند به‌صورت ایمن حذف شود. ابتدا آن اسلایدها را به لِی‌آوت‌های تحت مستر دیگری منتقل کنید یا از روش پاک‌سازی مسترهای استفاده‌نشده که فقط مسترهای غیرقابل استفاده را حذف می‌کند، استفاده کنید.