إدارة أنماط العرض في Python عبر Java
المقدمة
يحدد نمط العرض مجموعة منسقة من الألوان والخطوط وأنماط الخلفية والتعبئات والخطوط والتأثيرات. تشير الكائنات المستندة إلى النمط إلى هذه التعريفات المشتركة بدلاً من تخزين كل خاصية بصرية كقيمة ثابتة، لذلك يمكن لتغيير النمط تحديث العديد من الكائنات مرة واحدة.
في Aspose.Slides، يمكن الوصول إلى نمط العرض على مستوى العرض عبر Presentation.getMasterTheme. يمكن للعرض أيضاً أن يحتوي على تجاوزات للنمط على مستويات أدنى. يمكن للماستر أن يتجاوز نمط العرض عبر MasterThemeManager.getOverrideTheme، بينما يمكن للتخطيط أو الشريحة الفردية أن يتجاوزان نمطهما الموروث عبر BaseOverrideThemeManager.getOverrideTheme. عمليًا، يتم حل النمط الفعلي لشرائح عبر سلسلة الوراثة هذه: نمط العرض، تجاوز الماستر، تجاوز التخطيط، وتجاوز الشريحة.

توضح الأقسام أدناه أكثر سير عمل شائع للنمط: فحص النمط، تغيير الألوان والخطوط، نسخ أو تطبيق نمط، تحديث أنماط الخلفية والتأثيرات، وقراءة القيم الفعالة بعد حل الوراثة والتجاوزات.
فحص النمط
كائن 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 ي expose هذه التحويلات عبر تعداد ColorTransformOperation.

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، بينما ي expose ColorScheme نفس الفتحات كـ Dark1، Light1، Dark2، وLight2. الترابط ثابت:
Text1=Dark1Background1=Light1Text2=Dark2Background2=Light2
هذه أسماء بديلة لنفس فتحات النمط؛ ليست قيمًا تُحوَّل ديناميكيًا من شكل إلى آخر.
تغيير خطوط النمط
مخطط خطوط النمط يحتوي على مجموعة خطوط رئيسية للعناوين ومجموعة خطوط فرعية للنص الأساسي. طُرق FontScheme.getMajor وFontScheme.getMinor تكشف عن تلك المجموعات.
معرفات خطوط النمط المتوافقة مع PowerPoint يمكن استخدامها في تنسيق النص:
+mn-lt- خط النص الأساسي اللاتيني (Minor Latin Font)+mj-lt- خط العنوان اللاتيني (Major Latin Font)+mn-ea- خط النص الأساسي شرق آسيوي (Minor East Asian Font)+mj-ea- خط العنوان شرق آسيوي (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()
العنوان يتبع الخط الرئيسي والنص الأساسي يتبع الخط الفرعي. النص الذي يحتوي على اسم خط صريح بدلاً من معرف نمط لن يتحول تلقائيًا عند تغيير مخطط خطوط النمط.
المجموعتان الرئيسيتان والفرعيتان يمكن أن تحتويان أيضًا على تعيينات خطوط للأنظمة الكتابية الفردية، مثل السيريالية، العربية، اليابانية، الجورجية، والثانا. لفحص، إضافة، استبدال أو إزالة هذه التعيينات، راجع خطوط النمط الخاصة بالسكريبت.
Tip
لمزيد من المعلومات حول خطوط العرض، راجع خطوط PowerPoint.نسخ أو تطبيق نمط
تُحل المشكلات المختلفة المتعلقة بالنمط عبر سير عمل أدناه.
تطبيق نمط خارجي على الشرائح التابعة للماستر
استخدم MasterSlide.applyExternalThemeToDependingSlides عندما يكون لديك ملف نمط PowerPoint (.thmx) وتريد إعادة تصميم كل شريحة تعتمد على ماستر معين. اختر الماستر من تجميع Presentation.getMasters المُمَثَّل بـ MasterSlideCollection، ومرّر مسار ملف النمط إلى الطريقة.
تقوم الطريقة بالعمليات التالية:
- تنشئ شريحة ماستر جديدة بناءً على الماستر المختار.
- تطبق النمط الخارجي على الماستر الجديد.
- تُعيّن الماستر الجديد لجميع الشرائح التي كانت تعتمد سابقًا على الماستر المختار.
- تُعيد كائن 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 تقديم خيارات خلفية أكثر في واجهته مقارنة بعدد تعريفات التعبئة الفعلية المخزنة في هذا التجميع لأن الواجهة يمكنها دمج تعبئات النمط مع ألوان النمط ومراجع الأنماط الأخرى.

قبل استخدام نمط خلفية، افحص التجميع المخزن و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 عندما تحتاج إلى معرفة الخلفية النهائية بعد تطبيق الوراثة.
Warning
لا تتعامل مع فهرس النمط كفهرس تجميع يبدأ من الصفر. كما تجنب ترميز رقم نمط من ملف واحد والافتراض بأنه سيظهر بالمظهر نفسه في ملف آخر؛ تعريفات نمط العرض خاصة بالعرض نفسه.Tip
للتنسيق المباشر للخلفية والوراثة الخلفية، راجع خلفية العرض.تحديث تأثيرات النمط
مخطط تنسيق النمط يحتوي على تجميعات منفصلة للتعبئة، الخط، وتأثيرات النمط تُعرض عبر FormatScheme.getFillStyles، FormatScheme.getLineStyles، وFormatScheme.getEffectStyles. عادةً ما تحتوي الأنماط المكتبية على ثلاث مدخلات رئيسية تمثل بصريًا تنسيقات خفيفة، متوسطة، وشديدة، لكن يجب على الشيفرة فحص كل تجميع بدلاً من الافتراض بوجود عدد ثابت.

عند الوصول إلى هذه التجميعات في 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 نقاط. النتيجة البصرية الدقيقة لا تزال تعتمد على الفتحات التي تشير إليها كل شكل وما إذا كان التنسيق المباشر يتجاوز النمط.

تحديد ما إذا كانت تعبئة صلبة فعّالة تستخدم لون نمط
يمكن تخزين التعبئة مباشرة على كائن أو وراثتها من فقرة، تخطيط، ماستر، نمط، أو مستوى تنسيق آخر. استدعِ 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. تُعيد هذه الواجهات القيم المُحلَّة بعد تطبيق الوراثة والتجاوزات.