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

نمای کلی

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

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

سلسله‌مراتب به این صورت است:

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

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

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

دسترسی به Slide Masters

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

The Slide Master command on the PowerPoint View tab

در Aspose.Slides، برای دسترسی به master slideها از مجموعه 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()

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

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

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

اعضای معمولاً استفاده‌شده master slide عبارتند از:

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

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

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

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

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 مراجعه کنید.

کار با Placeholders

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

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

The Insert Placeholder command in PowerPoint Slide Master view

برای افزودن placeholders جدید با Aspose.Slides، به layout slideی که به 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()

همچنین می‌توانید شکل‌های placeholderی که از پیش بر روی master slide وجود دارند را قالب‌بندی کنید. مثال زیر 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

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

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

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

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 برای کپی یک master slide به یک ارائه دیگر استفاده کنید. master کپی‌شده سپس می‌تواند توسط layoutها و اسلایدهای موجود در ارائه مقصد استفاده شود.

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

اگر نیاز دارید اسلایدهای معمولی را به همراه master آن‌ها کلون کنید، به صفحه Clone Slides مراجعه کنید.

افزودن چندین Slide Master

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

PowerPoint commands for inserting and managing master slides

مثال زیر master پیش‌فرض را کلون می‌کند، به کلون پس‌زمینه‌ای متفاوت می‌دهد، یک layout تحت آن master کلون‌شده ایجاد می‌کند و سپس اسلایدی جدید بر پایه آن 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()

مقایسه Slide Masters

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

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های استفاده‌نشده

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

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

پرسش‌های متداول

تفاوت بین slide master و layout slide چیست؟

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

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

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

آیا باید placeholders را به master slide یا layout slide اضافه کنم؟

در اکثر موارد، placeholders را به layout slideها اضافه کنید. عناصر بصری مشترک و قالب‌بندی‌های مشترک را بر روی master slide قرار دهید و سپس placeholders محتوا را بر روی layoutهایی که اسلایدهای معمولی استفاده می‌کنند، اضافه کنید.

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

نه. یک master slide که اسلایدهای وابسته دارد، نمی‌تواند به‌صورت مستقیم حذف شود. ابتدا آن اسلایدها را به layoutهای تحت master دیگری منتقل کنید یا از روش پاک‌سازی masterهای استفاده‌نشده که تنها masterهای بدون استفاده را حذف می‌کند، استفاده کنید.