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

مقدمه

یک تم ارائه مجموعه‌ای هماهنگ از رنگ‌ها، قلم‌ها، سبک‌های پس‌زمینه، پرکننده‌ها، خطوط و افکت‌ها را تعریف می‌کند. اشیای آگاه از تم به جای ذخیرهٔ هر ویژگی بصری به صورت مقدار ثابت، به این تعاریف مشترک ارجاع می‌دهند، به‌طوری‌که تغییر تم می‌تواند بسیاری از اشیا را به‌صورت همزمان به‌روز کند.

در Aspose.Slides، تم سطح ارائه از طریق Presentation.getMasterTheme در دسترس است. یک ارائه می‌تواند همچنین بازنویسی‌های تم در سطوح پایین‌تر داشته باشد. یک مستربندی می‌تواند تم ارائه را از طریق MasterThemeManager.getOverrideTheme بازنویسی کند، در حالی که یک طرح‌بندی یا یک اسلاید تک‌تک می‌تواند تم ارث‌برده خود را از طریق BaseOverrideThemeManager.getOverrideTheme بازنویسی کند. در عمل، تم مؤثر برای یک اسلاید از طریق این زنجیرهٔ ارث‌برداری حل می‌شود: تم ارائه، بازنویسی مستربندی، بازنویسی طرح‌بندی، و بازنویسی اسلاید.

Theme components: colors, fonts, background styles, and effects

بخش‌های زیر رایج‌ترین کارهای مرتبط با تم را نشان می‌دهند: بررسی یک تم، تغییر رنگ‌ها و قلم‌ها، کپی یا اعمال یک تم، به‌روز رسانی سبک‌های پس‌زمینه و افکت‌ها، و خواندن مقادیر مؤثر پس از حل ارث‌برداری و بازنویسی‌ها.

بررسی یک تم

شیء MasterTheme طرح رنگ، طرح قلم و طرح فرمت تم را از طریق MasterTheme.getColorScheme، MasterTheme.getFontScheme و MasterTheme.getFormatScheme در معرض نمایش می‌گذارد. بررسی این مجموعه‌ها قبل از تغییر آن‌ها به‌ویژه وقتی مفید است که ارائه‌ای از منبع خارجی باشد، زیرا تعداد و محتوای ورودی‌های سبک می‌تواند متفاوت باشد.

مثال زیر خصوصیات اصلی تم را می‌خواند و گزارش می‌دهد که چند سبک پس‌زمینه، پرکننده، خط و افکت در تم ذخیره شده‌اند:

import jpype
import asposeslides

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

from asposeslides.api import Presentation

presentation = Presentation("input.pptx")
try:
    theme = presentation.getMasterTheme()
    print("Theme name:", theme.getName())
    print("Accent 1:", theme.getColorScheme().getAccent1().getColor())
    print("Major Latin font:", theme.getFontScheme().getMajor().getLatinFont().getFontName())
    print("Minor Latin font:", theme.getFontScheme().getMinor().getLatinFont().getFontName())
    print("Background fill styles:", theme.getFormatScheme().getBackgroundFillStyles().size())
    print("Fill styles:", theme.getFormatScheme().getFillStyles().size())
    print("Line styles:", theme.getFormatScheme().getLineStyles().size())
    print("Effect styles:", theme.getFormatScheme().getEffectStyles().size())
finally:
    presentation.dispose()

اگر فایلی از چند مستربندی استفاده کند، فرض نکنید که هر اسلاید همان تم مؤثر را دارد. مستربندی مرتبط با اسلاید را بررسی کنید و در زمانی که ممکن است بازنویسی‌های طرح‌بندی یا اسلاید وجود داشته باشد، از جریان کاری تم مؤثر که در ادامه مقاله نشان داده شده استفاده کنید.

تغییر رنگ‌های تم

پرکننده‌ها، خطوط و متن‌های آگاه از تم می‌توانند به یک رنگ منطقی از شمارش SchemeColor ارجاع دهند. هنگامی که ورودی متناظر در ColorScheme را تغییر می‌دهید، تمام اشیایی که هنوز به آن رنگ تم ارجاع می‌دهند، بر اساس مقدار جدید حل می‌شوند. اشیایی که از یک رنگ RGB مستقیم استفاده می‌کنند، توسط به‌روزرسانی رنگ تم تغییر نمی‌کنند.

مثال انتها‑به‑انتها زیر یک شکل ایجاد می‌کند که از Accent4 استفاده می‌کند، رنگ Accent4 تم را به قرمز تغییر می‌دهد، ارائه را ذخیره می‌کند، دوباره باز می‌کند و رنگ پرکننده مؤثر را چاپ می‌کند:

import jpype
import asposeslides

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

from asposeslides.api import FillType, Presentation, SaveFormat, SchemeColor, ShapeType
from java.awt import Color

presentation = Presentation()
try:
    slide = presentation.getSlides().get_Item(0)
    shape = slide.getShapes().addAutoShape(ShapeType.Rectangle, 10, 10, 100, 100)
    shape.getFillFormat().setFillType(FillType.Solid)
    shape.getFillFormat().getSolidFillColor().setSchemeColor(SchemeColor.Accent4)
    presentation.getMasterTheme().getColorScheme().getAccent4().setColor(Color.RED)
    presentation.save("theme-color.pptx", SaveFormat.Pptx)
finally:
    presentation.dispose()

saved_presentation = Presentation("theme-color.pptx")
try:
    saved_slide = saved_presentation.getSlides().get_Item(0)
    saved_shape = saved_slide.getShapes().get_Item(0)
    effective_fill = saved_shape.getFillFormat().getEffective()
    print("Effective fill color:", effective_fill.getSolidFillColor())
finally:
    saved_presentation.dispose()

چون مستطیل همچنان به Accent4 مرتبط است، رنگ قابل مشاهده آن پس از تغییر تم به قرمز در می‌آید. اگر رنگ طرح را به‌صورت مستقیم روی شکل جایگزین کنید، تغییرات آیندهٔ Accent4 دیگر بر آن پرکننده تأثیر نخواهد گذاشت.

استفاده از رنگ‌ها از پالت اضافی

PowerPoint با اعمال تبدیلات رنگ، نسخه‌های روشن‌تر و تیره‌تر را از یک رنگ تم استخراج می‌کند. Aspose.Slides این تبدیلات را از طریق شمارش ColorTransformOperation در دسترس می‌گذارد.

Main theme colors and lighter and darker colors generated from the additional palette

1 - رنگ‌های اصلی تم.

2 - نسخه‌های روشن‌تر و تیره‌تر تولید شده از رنگ‌های اصلی تم.

مثال زیر شش مستطیل مبتنی بر Accent4 ایجاد می‌کند، برای پنج مورد از آن‌ها تبدیلات روشنایی اعمال می‌کند و نتیجه را ذخیره می‌سازد:

import jpype
import asposeslides

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

from asposeslides.api import ColorTransformOperation, FillType, Presentation, SaveFormat, SchemeColor, ShapeType

presentation = Presentation()
try:
    slide = presentation.getSlides().get_Item(0)

    base_shape = slide.getShapes().addAutoShape(ShapeType.Rectangle, 10, 10, 50, 50)
    base_shape.getFillFormat().setFillType(FillType.Solid)
    base_shape.getFillFormat().getSolidFillColor().setSchemeColor(SchemeColor.Accent4)

    lightest_shape = slide.getShapes().addAutoShape(ShapeType.Rectangle, 10, 70, 50, 50)
    lightest_shape.getFillFormat().setFillType(FillType.Solid)
    lightest_shape.getFillFormat().getSolidFillColor().setSchemeColor(SchemeColor.Accent4)
    lightest_shape.getFillFormat().getSolidFillColor().getColorTransform().add(ColorTransformOperation.MultiplyLuminance, 0.2)
    lightest_shape.getFillFormat().getSolidFillColor().getColorTransform().add(ColorTransformOperation.AddLuminance, 0.8)

    lighter_shape = slide.getShapes().addAutoShape(ShapeType.Rectangle, 10, 130, 50, 50)
    lighter_shape.getFillFormat().setFillType(FillType.Solid)
    lighter_shape.getFillFormat().getSolidFillColor().setSchemeColor(SchemeColor.Accent4)
    lighter_shape.getFillFormat().getSolidFillColor().getColorTransform().add(ColorTransformOperation.MultiplyLuminance, 0.4)
    lighter_shape.getFillFormat().getSolidFillColor().getColorTransform().add(ColorTransformOperation.AddLuminance, 0.6)

    light_shape = slide.getShapes().addAutoShape(ShapeType.Rectangle, 10, 190, 50, 50)
    light_shape.getFillFormat().setFillType(FillType.Solid)
    light_shape.getFillFormat().getSolidFillColor().setSchemeColor(SchemeColor.Accent4)
    light_shape.getFillFormat().getSolidFillColor().getColorTransform().add(ColorTransformOperation.MultiplyLuminance, 0.6)
    light_shape.getFillFormat().getSolidFillColor().getColorTransform().add(ColorTransformOperation.AddLuminance, 0.4)

    dark_shape = slide.getShapes().addAutoShape(ShapeType.Rectangle, 10, 250, 50, 50)
    dark_shape.getFillFormat().setFillType(FillType.Solid)
    dark_shape.getFillFormat().getSolidFillColor().setSchemeColor(SchemeColor.Accent4)
    dark_shape.getFillFormat().getSolidFillColor().getColorTransform().add(ColorTransformOperation.MultiplyLuminance, 0.75)

    darker_shape = slide.getShapes().addAutoShape(ShapeType.Rectangle, 10, 310, 50, 50)
    darker_shape.getFillFormat().setFillType(FillType.Solid)
    darker_shape.getFillFormat().getSolidFillColor().setSchemeColor(SchemeColor.Accent4)
    darker_shape.getFillFormat().getSolidFillColor().getColorTransform().add(ColorTransformOperation.MultiplyLuminance, 0.5)

    presentation.save("theme-color-palette.pptx", SaveFormat.Pptx)
finally:
    presentation.dispose()

این نسخه‌ها بر پایهٔ رنگ تم باقی می‌مانند. اگر بعداً Accent4 تغییر کند، رنگ‌های تبدیل‌شده از مقدار جدید Accent4 دوباره محاسبه می‌شوند.

نقشه‌برداری مقادیر SchemeColor به اسلات‌های ColorScheme

شمارش SchemeColor از Text1، Background1، Text2 و Background2 استفاده می‌کند، در حالی که ColorScheme همان اسلات‌های تم را به صورت Dark1، Light1، Dark2 و Light2 نمایش می‌دهد. این نگاشت ثابت است:

  • Text1 = Dark1
  • Background1 = Light1
  • Text2 = Dark2
  • Background2 = Light2

این‌ها اسامی جایگزین برای همان اسلات‌های تم هستند؛ مقادیری نیستند که به‌صورت پویا از یک شکل به شکل دیگر تبدیل شوند.

تغییر قلم‌های تم

یک طرح قلم تم شامل یک مجموعهٔ قلم اصلی برای سرعنوان‌ها و یک مجموعهٔ قلم فرعی برای متن بدنه است. روش‌های FontScheme.getMajor و FontScheme.getMinor این مجموعه‌ها را در معرض نمایش می‌گذارند.

شناسه‌های قلم تم سازگار با PowerPoint می‌توانند در قالب‌بندی متن مورد استفاده قرار گیرند:

  • +mn-lt - Body Font Latin (Minor Latin Font)
  • +mj-lt - Heading Font Latin (Major Latin Font)
  • +mn-ea - Body Font East Asian (Minor East Asian Font)
  • +mj-ea - Heading Font East Asian (Major East Asian Font)

مثال زیر یک سرعنوان که از قلم لاتین اصلی تم استفاده می‌کند و یک خط بدنه که از قلم لاتین فرعی تم استفاده می‌کند، ایجاد می‌کند. سپس قلم‌های تم را تغییر داده و نتیجه را ذخیره می‌کند:

import jpype
import asposeslides

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

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

presentation = Presentation()
try:
    slide = presentation.getSlides().get_Item(0)

    heading = slide.getShapes().addAutoShape(ShapeType.Rectangle, 40, 40, 500, 60)
    heading.getTextFrame().setText("Theme heading")
    font_data = FontData("+mj-lt")
    heading.getTextFrame().getParagraphs().get_Item(0).getPortions().get_Item(0).getPortionFormat().setLatinFont(font_data)

    body = slide.getShapes().addAutoShape(ShapeType.Rectangle, 40, 120, 500, 60)
    body.getTextFrame().setText("Theme body text")
    font_data = FontData("+mn-lt")
    body.getTextFrame().getParagraphs().get_Item(0).getPortions().get_Item(0).getPortionFormat().setLatinFont(font_data)

    font_data = FontData("Aptos Display")
    presentation.getMasterTheme().getFontScheme().getMajor().setLatinFont(font_data)
    font_data = FontData("Arial")
    presentation.getMasterTheme().getFontScheme().getMinor().setLatinFont(font_data)
    presentation.save("theme-fonts.pptx", SaveFormat.Pptx)
finally:
    presentation.dispose()

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

مجموعه‌های قلم اصلی و فرعی می‌توانند شامل نگاشت‌های قلم برای سیستم‌های نوشتاری خاص باشند، مانند سیریلیک، عربی، ژاپنی، گرجی و ثانا. برای بررسی، افزودن، جایگزینی یا حذف این نگاشت‌ها، به Script‑Specific Theme Fonts مراجعه کنید.

کپی یا اعمال یک تم

جریان‌های کاری زیر مشکلات مختلف مربوط به تم را حل می‌کنند.

اعمال تم خارجی به اسلایدهای وابسته به مستربندی

از MasterSlide.applyExternalThemeToDependingSlides زمانی استفاده کنید که یک فایل تم PowerPoint (.thmx) داشته باشید و بخواهید تمام اسلایدهایی که به یک مستربندی خاص وابسته‌اند، بازطراحی شوند. مستربندی را از مجموعهٔ Presentation.getMasters که توسط MasterSlideCollection نمایان می‌شود، انتخاب کنید و مسیر فایل تم را به روش پاس دهید.

این روش عملیات زیر را انجام می‌دهد:

  1. یک مستربندی جدید بر پایهٔ مستربندی انتخاب شده ایجاد می‌کند.
  2. تم خارجی را بر روی مستربندی جدید اعمال می‌کند.
  3. مستربندی جدید را به تمام اسلایدهایی که قبلاً به مستربندی انتخاب شده وابسته بودند، اختصاص می‌دهد.
  4. MasterSlide تازهٔ ایجادشده را برمی‌گرداند.

مثال زیر تم خارجی را بر اسلایدهایی که به اولین مستربندی وابسته‌اند، اعمال می‌کند و ارائه را ذخیره می‌سازد:

import jpype
import asposeslides

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

from asposeslides.api import Presentation, SaveFormat

presentation = Presentation("presentation.pptx")
try:
    selected_master = presentation.getMasters().get_Item(0)
    themed_master = selected_master.applyExternalThemeToDependingSlides("corporate-theme.thmx")

    print("Created master:", themed_master.getName())
    presentation.save("presentation-with-external-theme.pptx", SaveFormat.Pptx)
finally:
    presentation.dispose()

یک تم نامعتبر، خراب یا پشتیبانی‑نشده می‌تواند منجر به PptxReadException شود. مسیرهای ارائه‌شده توسط کاربر را اعتبارسنجی کنید، شکست‌های دسترسی به سیستم‌فایل را مدیریت کنید و پس از اعمال موفقیت‌آمیز تم، ارائه را ذخیره کنید.

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

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

این یک جریان کاری مستقیم در سطح مستربندی است: این روش مسیر فایل .thmx را می‌گیرد و نیازی به ایجاد بازنویسی‌های تم در سطح اسلاید یا طرح‌بندی به‌صورت دستی ندارید.

اعمال تم‌های خارجی متفاوت در ارائهٔ چند‑مستربندی

زمانی که مستربندی موردنظر از پیش شناخته نشده باشد، آن را از طریق یک اسلاید نماینده با استفاده از Slide.getLayoutSlide و LayoutSlide.getMasterSlide به دست آورید. پیش از اعمال هر تمی، مراجع مستربندی اصلی را ذخیره کنید، زیرا هر فراخوانی یک مستربندی جدید در ارائه ایجاد می‌کند.

مثال زیر از اسلایدهای دو بخش برای یافتن مستربندی‌هایشان استفاده می‌کند و هر گروه تم خارجی متفاوتی اعمال می‌کند:

import jpype
import asposeslides

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

from asposeslides.api import Presentation, SaveFormat

presentation = Presentation("multi-master-presentation.pptx")
try:
    if presentation.getSlides().size() < 5:
        print("The presentation does not contain the expected representative slides.")
    else:
        first_group_master = presentation.getSlides().get_Item(0).getLayoutSlide().getMasterSlide()
        second_group_master = presentation.getSlides().get_Item(4).getLayoutSlide().getMasterSlide()

        if first_group_master.getSlideId() == second_group_master.getSlideId():
            print("The representative slides use the same master.")
        else:
            first_themed_master = first_group_master.applyExternalThemeToDependingSlides("blue-theme.thmx")
            second_themed_master = second_group_master.applyExternalThemeToDependingSlides("green-theme.thmx")

            print("First themed master:", first_themed_master.getName())
            print("Second themed master:", second_themed_master.getName())
            presentation.save("multi-master-with-external-themes.pptx", SaveFormat.Pptx)
finally:
    presentation.dispose()

فراخوانی اول فقط بر اسلایدهایی که به first_group_master وابسته‌اند تأثیر می‌گذارد و فراخوانی دوم فقط بر اسلایدهایی که به second_group_master وابسته‌اند. اسلایدهایی که به هر مستربندی دیگری تعلق دارند، بازطراحی نمی‌شوند.

حفظ تم منبع هنگام انتقال اسلایدها

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

import jpype
import asposeslides

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

from asposeslides.api import Presentation, SaveFormat

source = Presentation("source-theme.pptx")
try:
    target = Presentation("target.pptx")
    try:
        source_slide = source.getSlides().get_Item(0)
        source_master = source_slide.getLayoutSlide().getMasterSlide()
        cloned_master = target.getMasters().addClone(source_master)
        target.getSlides().addClone(source_slide, cloned_master, True)
        target.save("theme-preserved.pptx", SaveFormat.Pptx)
    finally:
        target.dispose()
finally:
    source.dispose()

این جریان کاری ترجیحی است هنگامی که اسلاید منبع باید در مقصد همان ظاهر را داشته باشد. ساده‌وار کلون کردن محتوا بر روی یک مستربند مقصد نامربط می‌تواند رنگ‌ها، قلم‌ها، پس‌زمینه‌ها و افکت‌های مبتنی بر تم را تغییر دهد.

اعمال مقادیر تم به یک اسلاید موجود

اگر اسلاید هدف باید بر روی مستربند و طرح‌بندی فعلی خود بماند، یک بازنویسی سطح اسلایدی از تم منبع مقداردهی اولیه کنید. روش‌های OverrideTheme.initColorSchemeFrom، OverrideTheme.initFontSchemeFrom و OverrideTheme.initFormatSchemeFrom سه مؤلفهٔ اصلی تم را به بازنویسی کپی می‌کنند.

import jpype
import asposeslides

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

from asposeslides.api import Presentation, SaveFormat

source = Presentation("source-theme.pptx")
try:
    target = Presentation("target.pptx")
    try:
        target_slide = target.getSlides().get_Item(0)
        override_theme = target_slide.getThemeManager().getOverrideTheme()
        override_theme.initColorSchemeFrom(source.getMasterTheme().getColorScheme())
        override_theme.initFontSchemeFrom(source.getMasterTheme().getFontScheme())
        override_theme.initFormatSchemeFrom(source.getMasterTheme().getFormatScheme())
        target.save("theme-applied-to-slide.pptx", SaveFormat.Pptx)
    finally:
        target.dispose()
finally:
    source.dispose()

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

اعمال بازنویسی تم به یک طرح‌بندی

بازنویسی سطح طرح‌بندی بر اسلایدهایی که از آن طرح‌بندی استفاده می‌کنند اعمال می‌شود، مگر اینکه اسلاید خاصی بازنویسی خود را داشته باشد. همان روش‌های مقداردهی اولیه می‌توانند از طریق LayoutSlideThemeManager استفاده شوند:

import jpype
import asposeslides

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

from asposeslides.api import Presentation, SaveFormat

source = Presentation("source-theme.pptx")
try:
    target = Presentation("target.pptx")
    try:
        target_slide = target.getSlides().get_Item(0)
        target_layout = target_slide.getLayoutSlide()
        override_theme = target_layout.getThemeManager().getOverrideTheme()
        override_theme.initColorSchemeFrom(source.getMasterTheme().getColorScheme())
        override_theme.initFontSchemeFrom(source.getMasterTheme().getFontScheme())
        override_theme.initFormatSchemeFrom(source.getMasterTheme().getFormatScheme())
        target.save("theme-applied-to-layout.pptx", SaveFormat.Pptx)
    finally:
        target.dispose()
finally:
    source.dispose()

هنگامی که بسیاری از طرح‌بندی‌ها و اسلایدها باید همان طراحی پایه را به‌اشتراک بگذارند، از تم سطح مستربند یا ارائه استفاده کنید؛ برای یک خانوادهٔ طرح‌بندی که نیاز به سبک متفاوت دارد، از بازنویسی طرح‌بندی استفاده کنید و برای استثناهای واقعی فقط از بازنویسی اسلاید بهره ببرید. بازنویسی‌های بیش از حد سطح اسلاید باعث می‌شود تغییرات تم سراسری بعدی پیش‌بینی‌پذیر نباشند.

به‌روز رسانی سبک‌های پس‌زمینهٔ تم

پرکننده‌های پس‌زمینهٔ تم در FormatScheme.getBackgroundFillStyles ذخیره می‌شوند. PowerPoint می‌تواند گزینه‌های پس‌زمینهٔ بیشتری را در رابط کاربری خود ارائه دهد نسبت به تعداد تعریف‌های پرکننده‌ای که به‌صورت فیزیکی در این مجموعه ذخیره شده‌اند، زیرا رابط می‌تواند پرکننده‌های تم را با رنگ‌های تم و سایر مراجع سبک ترکیب کند.

PowerPoint background style gallery for a presentation theme

قبل از استفاده از یک سبک پس‌زمینه، مجموعه ذخیره‌شده و Background.getStyleIndex فعلی را بررسی کنید. یک شاخص سبک برابر با 0 به معنی عدم وجود پرکنندهٔ تم است؛ مقادیر مثبت ارجاع‌های سبک پس‌زمینهٔ تم هستند. این با ایندکس‌گذاری مستقیم مجموعه متفاوت است؛ در این حالت get_Item(0) به اولین مورد ذخیره‌شده اشاره دارد. فرض نکنید که هر ارائهٔ تعداد یکسانی از سبک‌های پرکنندهٔ پس‌زمینه دارد.

مثال زیر تعداد پرکننده‌های پس‌زمینهٔ موجود را گزارش می‌کند، یک ارجاع پس‌زمینهٔ تم به اولین مستربندی اختصاص می‌دهد و ارائه را ذخیره می‌کند:

import jpype
import asposeslides

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

from asposeslides.api import BackgroundType, Presentation, SaveFormat

presentation = Presentation("input.pptx")
try:
    background_styles = presentation.getMasterTheme().getFormatScheme().getBackgroundFillStyles()
    print("Background fill styles:", background_styles.size())
    if background_styles.size() == 0:
        print("The presentation theme does not contain background fill styles.")
    else:
        master_slide = presentation.getMasters().get_Item(0)
        master_slide.getBackground().setType(BackgroundType.Themed)
        master_slide.getBackground().setStyleIndex(1)
        presentation.save("theme-background.pptx", SaveFormat.Pptx)
finally:
    presentation.dispose()

نتیجهٔ قابل مشاهده به ورودی تم ارجاع‌شده توسط مستربندی و به هر بازنویسی پس‌زمینه‌ای در سطح طرح‌بندی یا اسلاید وابسته است. اگر اسلاید پس‌زمینهٔ خود را داشته باشد، تغییر تنها پس‌زمینهٔ مستربندی ممکن است آن اسلاید را تغییر ندهد. هنگامی که نیاز به دانستن پس‌زمینهٔ نهایی پس از اعمال ارث‌برداری دارید، از Background.getEffective استفاده کنید.

به‌روز رسانی افکت‌های تم

یک طرح فرمت تم شامل مجموعه‌های جداگانهٔ پرکننده، خط و افکت است که از طریق FormatScheme.getFillStyles، FormatScheme.getLineStyles و FormatScheme.getEffectStyles در دسترس هستند. تم‌های معمولی Office اغلب سه ورودی اصلی سبک دارند که به‌صورت بصری به ترتیب به سبک‌های ظریف، متوسط و پرقدرت متناظرند، اما کد باید هر مجموعه را به‌جای فرض تعداد ثابت بررسی کند.

Subtle, moderate, and intense theme effects applied to the same shape

هنگامی که این مجموعه‌ها را در Python از طریق Java دسترسی می‌یابید، ایندکس مجموعه صفر‑مبنا است: get_Item(0) اولین سبک ذخیره‌شده و get_Item(2) سومین سبک است. ایندکس‌های مرجع‑سبک یک شکل مفهوم جداگانه‌ای است که از طریق ShapeStyle در دسترس است. تغییر یک سبک تم بر شکل‌هایی که به آن سبک ارجاع می‌دهند تأثیر می‌گذارد؛ شکل‌هایی که فرمت‌بندی مستقیم دارند ممکن است تغییری نکنند.

مثال زیر بررسی می‌کند که ورودی‌های سبک موردنیاز وجود داشته باشند، اولین سبک خط را تغییر می‌دهد، سومین سبک پرکننده را تغییر می‌دهد، یک سایهٔ بیرونی را در سومین سبک افکت فعال می‌کند و نتیجه را ذخیره می‌کند:

import jpype
import asposeslides

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

from asposeslides.api import FillType, Presentation, SaveFormat
from java.awt import Color

presentation = Presentation("Subtle_Moderate_Intense.pptx")
try:
    format_scheme = presentation.getMasterTheme().getFormatScheme()
    if format_scheme.getLineStyles().size() < 1 or format_scheme.getFillStyles().size() < 3 or format_scheme.getEffectStyles().size() < 3:
        print("The theme does not contain the style entries required by this example.")
    else:
        format_scheme.getLineStyles().get_Item(0).getFillFormat().setFillType(FillType.Solid)
        format_scheme.getLineStyles().get_Item(0).getFillFormat().getSolidFillColor().setColor(Color.RED)
        format_scheme.getFillStyles().get_Item(2).setFillType(FillType.Solid)
        forest_green = Color(34, 139, 34)
        format_scheme.getFillStyles().get_Item(2).getSolidFillColor().setColor(forest_green)
        effect_format = format_scheme.getEffectStyles().get_Item(2).getEffectFormat()
        effect_format.enableOuterShadowEffect()
        effect_format.getOuterShadowEffect().setDistance(10)
        presentation.save("theme-effects.pptx", SaveFormat.Pptx)
finally:
    presentation.dispose()

برای شکل‌هایی که به این اسلات‌ها ارجاع می‌دهند، اولین سبک خط تم به رنگ قرمز تبدیل می‌شود، سومین سبک پرکننده تم به رنگ سبز جنگلی جامد تغییر می‌یابد و سومین سبک افکت یک سایهٔ بیرونی با فاصلهٔ 10 پوینت به‌دست می‌آورد. نتیجهٔ بصری دقیق همچنان به این بستگی دارد که هر شکل به کدام اسلات‌ها ارجاع می‌دهد و آیا فرمت‌بندی مستقیم آن را بازنویسی می‌کند یا نه.

Theme effect styles after changing line, fill, and shadow settings

تعیین اینکه آیا یک پرکنندهٔ ثابت مؤثر از رنگ تم استفاده می‌کند

یک پرکننده می‌تواند به‌صورت مستقیم روی شیء ذخیره شود یا از یک پاراگراف، طرح‌بندی، مستربند، سبک تم یا سطح فرمت دیگر ارث‌برداری شود. برای حل این سلسله مراتب به دادهٔ پرکنندهٔ مؤثر غیرقابل تغییر، FillFormat.getEffective را فراخوانی کنید. ابتدا getFillType را روی شیء دادهٔ مؤثر بررسی کنید. تنها زمانی که مقدار FillType.Solid باشد، باید ویژگی‌های پرکنندهٔ ثابت را بخوانید.

برای یک پرکنندهٔ ثابت، getSolidFillColor مقدار نهایی RGB پس از اعمال ارث‌برداری، جستجوی تم و تبدیلات رنگ را برمی‌گرداند. getSolidFillSchemeColor اسلات منطقی مربوط به SchemeColor را برمی‌گرداند، مانند Text1 یا Accent6. مقدار SchemeColor.NotDefined به این معناست که پرکنندهٔ ثابت مؤثر بر پایهٔ رنگ طرح نیست. در یک جریان کاری که پرکننده‌ها یا رنگ‌های تم هستند یا رنگ‌های RGB مستقیم، این مقدار یک پرکنندهٔ RGB مستقیم را شناسایی می‌کند.

از مقدار محلی ColorFormat.getSchemeColor به‌تنهایی برای طبقه‌بندی پرکننده استفاده نکنید. برای مثال، بخشی از متن ممکن است رنگ طرح محلی نداشته باشد، بنابراین مقدار محلی آن NotDefined است، در حالی که پرکنندهٔ مؤثر آن از یک رنگ تم ارث‌برداری می‌شود و به Text1 یا Accent6 حل می‌گردد. برعکس، getSolidFillSchemeColor مشخص می‌کند کدام اسلات منطقی تم رنگ نهایی را تولید کرده است، اما نمی‌گوید آن اسلات از شی، پاراگراف، طرح‌بندی، مستربند یا سطح دیگری از سلسله مراتب فرمت آمده است.

مثال زیر یک ارائه را بارگیری می‌کند، هر دو پرکنندهٔ شکل و پرکنندهٔ بخش متن را بررسی می‌کند، هر مقدار نهایی RGB و رنگ طرح مرتبط را چاپ می‌کند و پرکننده‌های ثابت را که با تغییرات رنگ تم هماهنگ نخواهند شد، علامت‌گذاری می‌کند:

import jpype
import asposeslides

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

from asposeslides.api import AutoShape, FillType, Presentation, SchemeColor

def audit_fill(object_name, local_fill):
    effective_fill = local_fill.getEffective()
    if effective_fill.getFillType() != FillType.Solid:
        print(f"{object_name}: fill type = {effective_fill.getFillType()}; not a solid fill.")
        return

    rgb = effective_fill.getSolidFillColor()
    effective_scheme_color = effective_fill.getSolidFillSchemeColor()
    local_scheme_color = local_fill.getSolidFillColor().getSchemeColor()
    print(f"{object_name}: RGB = #{rgb.getRed():02X}{rgb.getGreen():02X}{rgb.getBlue():02X}")
    print(f"{object_name}: local scheme = {local_scheme_color}, effective scheme = {effective_scheme_color}")
    if effective_scheme_color == SchemeColor.NotDefined:
        print(f"{object_name}: direct RGB or another non-scheme fill; audit as theme-independent.")
    else:
        print(f"{object_name}: theme-dependent through {effective_scheme_color}.")


presentation = Presentation("input.pptx")
try:
    for slide_index, slide in enumerate(presentation.getSlides()):
        for shape_index, shape in enumerate(slide.getShapes()):
            shape_name = f"Slide {slide_index + 1}, shape {shape_index + 1}"
            audit_fill(shape_name, shape.getFillFormat())
            if isinstance(shape, AutoShape):
                for paragraph_index, paragraph in enumerate(shape.getTextFrame().getParagraphs()):
                    for portion_index, portion in enumerate(paragraph.getPortions()):
                        portion_name = f"{shape_name}, paragraph {paragraph_index + 1}, portion {portion_index + 1}"
                        audit_fill(portion_name, portion.getPortionFormat().getFillFormat())
finally:
    presentation.dispose()

شاخهٔ NotDefined فهرستی از پرکننده‌های ثابت ارائه می‌دهد که به تغییرات اسلات‌های رنگ تم پاسخ نمی‌دهند. این اشیا را زمانی که ارائه باید با پالت برند جدید مطابقت داشته باشد، مرور کنید. مقدار RGB گزارش‌شده هنوز ظاهر فعلی را نشان می‌دهد، در حالی که مقدار طرح توضیح می‌دهد آیا آن ظاهر به تم وصل است یا خیر.

اشیای مؤثر‑فرمت یک تصویر لحظه‌ای هستند. پس از تغییر تم ارائه، یک بازنویسی تم یا هر فرمت ارث‌برداری‌شده‌ای، دوباره getEffective را فراخوانی کنید و یک شیء دادهٔ پرکنندهٔ مؤثر جدید بخوانید قبل از مقایسه یا گزارش رنگ‌ها.

خواندن مقادیر مؤثر تم

اشیای تم خام نشان می‌دهند که در یک سطح خاص چه چیزی تعریف شده است. مقادیر مؤثر نشان می‌دهند یک اسلاید یا شکل پس از حل ارث‌برداری و بازنویسی‌های محلی واقعاً چه چیزی استفاده می‌کند. برای یک اسلاید، BaseOverrideThemeManager.createThemeEffective را فراخوانی کنید. برای پس‌زمینه، از Background.getEffective و برای پرکننده، از FillFormat.getEffective استفاده کنید.

مثال زیر تم مؤثر، پس‌زمینه و اولین پرکنندهٔ شکل را از یک اسلاید می‌خواند:

import jpype
import asposeslides

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

from asposeslides.api import FillType, Presentation

presentation = Presentation("input.pptx")
try:
    slide = presentation.getSlides().get_Item(0)
    effective_theme = slide.getThemeManager().createThemeEffective()
    effective_background = slide.getBackground().getEffective()
    print("Effective major Latin font:", effective_theme.getFontScheme().getMajor().getLatinFont().getFontName())
    print("Effective minor Latin font:", effective_theme.getFontScheme().getMinor().getLatinFont().getFontName())
    print("Effective background fill type:", effective_background.getFillFormat().getFillType())
    if slide.getShapes().size() > 0:
        effective_fill = slide.getShapes().get_Item(0).getFillFormat().getEffective()
        print("First shape effective fill type:", effective_fill.getFillType())
        if effective_fill.getFillType() == FillType.Solid:
            print("First shape effective fill color:", effective_fill.getSolidFillColor())
finally:
    presentation.dispose()

از داده‌های مؤثر برای تشخیص رندر، اعتبارسنجی و مقایسه‌ها استفاده کنید. اگر فقط به Presentation.getMasterTheme نگاهی بیندازید، ممکن است یک بازنویسی مستربند، طرح‌بندی، اسلاید یا شکل را که ظاهر نهایی را تغییر می‌دهد، از دست بدهید.

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

آیا اعمال یک تم خارجی بر همهٔ اسلایدهای ارائه تأثیر می‌گذارد؟

نه. MasterSlide.applyExternalThemeToDependingSlides تنها اسلایدهایی را که به مستربند انتخابی وابسته‌اند، بازتخصیص می‌دهد. اسلایدهایی که از مستربندهای دیگر استفاده می‌کنند، تم‌های فعلی خود را حفظ می‌کنند.

آیا می‌توانم تم را فقط به یک اسلاید اعمال کنم بدون تغییر مستربند؟

بله. از SlideThemeManager اسلاید استفاده کنید و بازنویسی تم آن را مقداردهی کنید. تغییر به‌صورت محلی به آن اسلاید محدود می‌شود؛ اسلایدهای دیگر همچنان تم‌های موجود خود را ارث‌برداری می‌کنند.

ایمن‌ترین روش برای انتقال یک تم از یک ارائه به ارائهٔ دیگر چیست؟

هنگامی که اسلایدی را منتقل می‌کنید و می‌خواهید ظاهر منبع را حفظ کنید، مستربند منبع را به مقصد کلون کنید و سپس اسلاید را با همان مستربند با استفاده از MasterSlideCollection.addClone و SlideCollection.addClone کلون کنید. این کار مستربند، طرح‌بندی‌ها و تم را با هم نگه می‌دارد.

چگونه می‌توانم مقادیر مؤثر را پس از ارث‌برداری و بازنویسی‌ها ببینم؟

از BaseOverrideThemeManager.createThemeEffective برای یک اسلاید یا تم طرح‌بندی و روش‌های دادهٔ مؤثر مربوطه برای اشیای فرمت مانند Background.getEffective و FillFormat.getEffective استفاده کنید. این APIها مقادیر حل‌شده پس از اعمال ارث‌برداری و بازنویسی‌ها را برمی‌گردانند.