البحث واستبدال النص في عروض PowerPoint التقديمية باستخدام بايثون

نظرة عامة

Aspose.Slides for Python via .NET يمكنه البحث، وتمييز، واستبدال النص في إطار نص فردي أو عبر كامل العرض التقديمي. تُعد هذه الإمكانيات مفيدة للمراجعة، والإزالة، وفحص المصطلحات، وتنظيف القوالب، وغيرها من سير عمل معالجة المستندات المؤتمتة.

في الأمثلة الأولى أدناه، نستخدم ملفًا باسم “sample.pptx”، يحتوي على مربع نص واحد في الشريحة الأولى مع النص التالي:

نص العينة

اختر نطاق البحث

استخدم الطرق المتوفرة على TextFrame لتقييد العملية بإطار نص واحد. واستخدم الطرق المتوفرة على Presentation لمعالجة جميع النصوص القابلة للمعالجة في العرض التقديمي.

العملية إطار نص واحد العرض التقديمي بالكامل
تمييز النص الحرفي TextFrame.highlight_text Presentation.highlight_text
تمييز التطابقات باستخدام تعبير نمطي TextFrame.highlight_regex Presentation.highlight_regex
استبدال النص الحرفي TextFrame.replace_text Presentation.replace_text
استبدال التطابقات باستخدام تعبير نمطي TextFrame.replace_regex Presentation.replace_regex

تكوين مطابقة النص

للعمليات الحرفية، استخدم TextSearchOptions للتحكم في المطابقة:

العمليات التي تعتمد على التعبيرات النمطية تستخدم سلسلة نمط، وبالتالي يتم تعريف قواعد المطابقة مثل حساسية الحالة وحدود الكلمات داخل التعبير نفسه.

تحديد مالك إطار النص

غالبًا ما تتلقى سير عمل معالجة النص العامة كائنًا من TextFrame أثناء البحث أو الاستبدال أو التحقق أو التصدير. استخدم TextFrame.parent_shape وTextFrame.parent_cell لتحديد أي كائن عرض تقديمي يملك إطار النص.

القيم المتوقعة تعتمد على المالك:

مالك إطار النص parent_shape parent_cell
AutoShape أو شكل آخر يحتوي على نص الشكل المالك Shape None
خلية جدول None الخلية المالكة Cell

كلا الخاصيتين عبارة عن خصائص تنقل للقراءة فقط. لا تُحرك قراءة هذه الخصائص إطار النص ولا تُغيّر مالكه. يجب على الشيفرة العامة فحص القيمتين ضد None ومعالجة احتمال عدم توفر أي من المالكين.

المثال التالي يستخدم SlideUtil.get_all_text_frames للمرور عبر جميع إطارات النص في عرض تقديمي. بالنسبة للأشكال، يُظهر اسم الشكل، ونوعه في وقت تشغيل بايثون، والشرائح التي يحتويها. بالنسبة لخلايا الجداول، يُظهر إحداثيات العمود والصف بدءًا من الصفر والشرائح المضمنة.

import aspose.slides as slides


def get_slide_label(base_slide):
    if isinstance(base_slide, slides.Slide):
        return f"slide {base_slide.slide_number}"

    if isinstance(base_slide, slides.NotesSlide):
        return f"notes for slide {base_slide.parent_slide.slide_number}"

    return type(base_slide).__name__


with slides.Presentation("presentation.pptx") as presentation:
    text_frames = slides.util.SlideUtil.get_all_text_frames(presentation, False)

    for text_frame in text_frames:
        owner_shape = text_frame.parent_shape
        if owner_shape is not None:
            shape_name = owner_shape.name or "(unnamed)"
            shape_type = type(owner_shape).__name__
            slide_label = get_slide_label(owner_shape.slide)
            print(f"Shape: {shape_name}; type: {shape_type}; {slide_label}")
            continue

        owner_cell = text_frame.parent_cell
        if owner_cell is not None:
            slide_label = get_slide_label(owner_cell.slide)
            print(f"Table cell: column {owner_cell.first_column_index}, row {owner_cell.first_row_index}; {slide_label}")
            continue

        print("The text frame owner is not available as a shape or table cell.")

للمحتوى في SmartArt، مر عبر الأشكال في SmartArtNode.shapes وادخل إلى كل ISmartArtShape.text_frame. يمكن تتبع إطار النص إلى الشكل المرتبط من خلال TextFrame.parent_shape، بينما TextFrame.parent_cell تكون None. لذلك يتعامل فرع الشكل في المثال أيضًا مع النص من عقد SmartArt.

تمييز النص

استخدم الطريقة TextFrame.highlight_text لتمييز التطابقات الحرفية في إطار نص. مرر كائنًا من TextSearchOptions للتحكم في البحث.

تُظهر عينة الشيفرة أدناه كيفية تمييز جميعOccurrences من الأحرف “try” ثم تمييز الكلمة الكاملة “to” فقط.

import aspose.pydrawing as draw
import aspose.slides as slides

with slides.Presentation("sample.pptx") as presentation:
    slide = presentation.slides[0]
    shape = slide.shapes[0]

    substring_search_options = slides.TextSearchOptions()
    substring_search_options.case_sensitive = False

    # تمييز كل حدوث لكلمة "try" في إطار النص.
    shape.text_frame.highlight_text(
        "try", draw.Color.light_blue, substring_search_options, None
    )

    whole_word_search_options = slides.TextSearchOptions()
    whole_word_search_options.whole_words_only = True
    whole_word_search_options.case_sensitive = False

    # تمييز الكلمة الكاملة فقط "to".
    shape.text_frame.highlight_text(
        "to", draw.Color.violet, whole_word_search_options, None
    )

    presentation.save("highlighted_text.pptx", slides.export.SaveFormat.PPTX)

النتيجة:

النص المميز

تمييز النص باستخدام التعبيرات النمطية

الطريقة TextFrame.highlight_regex تُمّيز التطابقات التي يجدها تعبير نمطي داخل إطار نص.

الشيفرة التالية تقوم بتمييز جميع الكلمات التي تحتوي على سبعة أحرف أو أكثر:

import aspose.pydrawing as draw
import aspose.slides as slides

with slides.Presentation("sample.pptx") as presentation:
    slide = presentation.slides[0]
    shape = slide.shapes[0]
    word_pattern = r"\b[^\s]{7,}\b"

    shape.text_frame.highlight_regex(word_pattern, draw.Color.yellow, None)

    presentation.save(
        "highlighted_text_using_regex.pptx", slides.export.SaveFormat.PPTX
    )

النتيجة:

النص المميز باستخدام التعبير النمطي

تمييز النص عبر العرض التقديمي

استخدم Presentation.highlight_text وPresentation.highlight_regex للبحث في جميع إطارات النص القابلة للمعالجة في العرض التقديمي. المثال التالي يميز مصطلحًا حرفيًا وجميع عناوين البريد الإلكتروني:

import aspose.pydrawing as draw
import aspose.slides as slides

with slides.Presentation("presentation.pptx") as presentation:
    search_options = slides.TextSearchOptions()
    search_options.whole_words_only = True
    search_options.case_sensitive = False

    presentation.highlight_text(
        "confidential", draw.Color.orange, search_options, None
    )

    email_pattern = r"(?i)\b[A-Z0-9._%+-]+@[A-Z0-9.-]+\.[A-Z]{2,}\b"
    presentation.highlight_regex(email_pattern, draw.Color.yellow)

    presentation.save(
        "highlighted_presentation.pptx", slides.export.SaveFormat.PPTX
    )

استبدال النص في إطار النص

استخدم TextFrame.replace_text للنص الحرفي وTextFrame.replace_regex للاستبدال القائم على النمط. تُحدّث هذه الطرق النص المطابق داخل إطار النص الموجود، مع الحفاظ على تنسيق الجزء المحيط بدلاً من إعادة بناء إطار النص من سلسلة نصية عادية.

المثال التالي يُوحّد شكل كتابة كلمة معينة ثم يستبدل تسميات الإصدارات:

import aspose.slides as slides

with slides.Presentation("presentation.pptx") as presentation:
    slide = presentation.slides[0]
    shape = slide.shapes[0]

    search_options = slides.TextSearchOptions()
    search_options.whole_words_only = True
    search_options.case_sensitive = False

    shape.text_frame.replace_text(
        "colour", "color", search_options, None
    )

    version_pattern = r"(?i)\bv\d+(?:\.\d+)*\b"
    shape.text_frame.replace_regex(version_pattern, "current version")

    presentation.save(
        "updated_text_frame.pptx", slides.export.SaveFormat.PPTX
    )

إذا امتد تطابق إلى أجزاء ذات تنسيقات مختلفة، راجع الناتج لتأكيد أي تنسيق يجب أن يُطبق على النص المستبدل.

استبدال النص عبر العرض التقديمي

استخدم Presentation.replace_text وPresentation.replace_regex لتطبيق نفس العمليات على مستوى العرض التقديمي بأكمله. هذا مفيد لتنظيف القوالب، وتحديث المصطلحات، والإزالة.

import aspose.slides as slides

with slides.Presentation("presentation.pptx") as presentation:
    search_options = slides.TextSearchOptions()
    search_options.whole_words_only = True
    search_options.case_sensitive = True

    presentation.replace_text(
        "Contoso", "Example Corp", search_options, None
    )

    account_number_pattern = r"\bACCT-\d{6}\b"
    presentation.replace_regex(account_number_pattern, "ACCT-REDACTED")

    presentation.save(
        "updated_presentation.pptx", slides.export.SaveFormat.PPTX
    )

الأسئلة المتداولة

كيف يمكنني البحث في مربع نص واحد فقط بدلاً من كامل العرض التقديمي؟

احصل على إطار النص الخاص بالشكل واستدعِ TextFrame.highlight_text، TextFrame.highlight_regex، TextFrame.replace_text، أو TextFrame.replace_regex على ذلك الإطار. تُعالج طرق مستوى العرض التقديمي جميع إطارات النص القابلة للمعالجة بدلاً من ذلك.

كيف يمكنني مطابقة الكلمات الكاملة مع الحفاظ على حالة الأحرف الصحيحة؟

عيّن TextSearchOptions.whole_words_only وTextSearchOptions.case_sensitive إلى True، ومرّر الخيارات إلى طريقة تمييز أو استبدال النص الحرفي. بالنسبة للتعبيرات النمطية، عرف حدود الكلمات وحساسية الحالة داخل النمط نفسه.

هل يمكن أن تشمل عمليات البحث والاستبدال النص الموجود في ملاحظات الشرائح؟

نعم. عيّن TextSearchOptions.include_notes إلى True عند استخدام عملية حرفية على مستوى العرض التقديمي.

هل يحافظ استبدال النص على تنسيقه؟

TextFrame.replace_text وTextFrame.replace_regex يغيّران النص المطابق داخل إطار النص الموجود مع الحفاظ على تنسيق الجزء المحيط. إذا امتد التطابق إلى أجزاء ذات تنسيقات مختلفة، فافحص النتيجة للتأكد من أن الاستبدال يستخدم النمط المطلوب.