مدیریت جعبه‌های متن در ارائه‌ها با استفاده از Python از طریق Java

مقدمه

در Aspose.Slides برای Python از طریق Java، متن اسلاید در فریم‌های متنی ذخیره می‌شود که به اشکال تعلق دارند. کلاس AutoShape نمایانگر رایج‌ترین شکل حاوی متن است و متن آن را از طریق متد AutoShape.getTextFrame در دسترس می‌گذارد.

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

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

import jpype
import asposeslides

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

from asposeslides.api import Presentation, SaveFormat, ShapeType

presentation = Presentation()
try:
    slide = presentation.getSlides().get_Item(0)
    text_box = slide.getShapes().addAutoShape(ShapeType.Rectangle, 150, 75, 300, 50)
    text_box.addTextFrame("Aspose TextBox")

    presentation.save("TextBox.pptx", SaveFormat.Pptx)
finally:
    presentation.dispose()

مختصات و ابعاد ارسال‌شده به ShapeCollection.addAutoShape بر حسب نقطه (points) اندازه‌گیری می‌شوند. AutoShape.addTextFrame فریم متن را با متن ارائه‌شده مقداردهی اولیه می‌کند.

بررسی وجود شکل جعبه متن

از متد AutoShape.isTextBox استفاده کنید تا تعیین کنید آیا یک شکل خودکار به عنوان جعبه متن در نظر گرفته می‌شود یا خیر. این در زمانی مفید است که ارائه حاوی هر دو شکل خودکار متن‌دار و صرفاً گرافیکی باشد.

یک جعبه متن و یک شکل

مثال زیر هر شکل خودکار در یک ارائه را بررسی می‌کند:

import jpype
import asposeslides

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

from asposeslides.api import AutoShape, Presentation, ShapeType

presentation = Presentation()
try:
    slide = presentation.getSlides().get_Item(0)
    text_box = slide.getShapes().addAutoShape(ShapeType.Rectangle, 10, 10, 120, 40)
    text_box.addTextFrame("Text box")
    slide.getShapes().addAutoShape(ShapeType.Ellipse, 150, 10, 40, 40)

    for current_slide in presentation.getSlides():
        for shape in current_slide.getShapes():
            if isinstance(shape, AutoShape):
                print("The shape is a text box." if shape.isTextBox() else "The shape is not a text box.")
finally:
    presentation.dispose()

یک شکل خودکار تازه اضافه‌شده تا زمانی که متن غیرخالی داشته باشد، به عنوان جعبه متن در نظر گرفته نمی‌شود. می‌توانید متن موردنظر را از طریق AutoShape.addTextFrame یا TextFrame.setText فراهم کنید. افزودن یا اختصاص یک رشته خالی باعث می‌شود که AutoShape.isTextBox مقدار False برگرداند:

import jpype
import asposeslides

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

from asposeslides.api import Presentation, ShapeType

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

    added_text_shape = slide.getShapes().addAutoShape(ShapeType.Rectangle, 10, 10, 100, 40)
    added_text_shape.addTextFrame("Shape 1")
    print(added_text_shape.isTextBox())

    assigned_text_shape = slide.getShapes().addAutoShape(ShapeType.Rectangle, 10, 70, 100, 40)
    assigned_text_shape.getTextFrame().setText("Shape 2")
    print(assigned_text_shape.isTextBox())

    added_empty_text_shape = slide.getShapes().addAutoShape(ShapeType.Rectangle, 10, 130, 100, 40)
    added_empty_text_shape.addTextFrame("")
    print(added_empty_text_shape.isTextBox())

    assigned_empty_text_shape = slide.getShapes().addAutoShape(ShapeType.Rectangle, 10, 190, 100, 40)
    assigned_empty_text_shape.getTextFrame().setText("")
    print(assigned_empty_text_shape.isTextBox())
finally:
    presentation.dispose()

دو فراخوانی اول True چاپ می‌کنند؛ دو فراخوانی آخر False چاپ می‌کنند.

یافتن شکلی که فریم متن را دارد

کد عمومی پردازش متن ممکن است یک TextFrame دریافت کند بدون اینکه بداند کدام شی ارائه آن را شامل می‌شود. از متد فقط‑خواندنی TextFrame.getParentShape برای بازگشت به Shape صاحب آن استفاده کنید.

برای فریم متنی که متعلق به یک شکل خودکار یا شکل دیگری متن‌دار است، TextFrame.getParentShape صاحب را برمی‌گرداند و TextFrame.getParentCell مقدار None می‌دهد. پیش از دسترسی به مقدار برگردانده‌شده آن را بررسی کنید. برای شناسایی هر دو مالک شکل و سلول جدول، از جمله اشکالی که با گره‌های SmartArt مرتبط هستند، به Search and Replace Text مراجعه کنید.

افزودن ستون‌ها به یک جعبه متن

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

مثال زیر یک جعبه متن سه‌ستونه با 10 نقطه فاصله بین ستون‌ها ایجاد می‌کند، ارائه را ذخیره می‌نماید و تنظیمات ذخیره‌شده را از فایل خروجی می‌خواند:

import jpype
import asposeslides

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

from asposeslides.api import Presentation, SaveFormat, ShapeType

presentation = Presentation()
try:
    slide = presentation.getSlides().get_Item(0)
    text_box = slide.getShapes().addAutoShape(ShapeType.Rectangle, 100, 100, 300, 200)
    text_box.addTextFrame("This text is distributed automatically across all columns in the text box.")

    text_frame_format = text_box.getTextFrame().getTextFrameFormat()
    text_frame_format.setColumnCount(3)
    text_frame_format.setColumnSpacing(10)

    presentation.save("TextBoxColumns.pptx", SaveFormat.Pptx)

    saved_presentation = Presentation("TextBoxColumns.pptx")
    try:
        saved_text_box = saved_presentation.getSlides().get_Item(0).getShapes().get_Item(0)
        saved_format = saved_text_box.getTextFrame().getTextFrameFormat()
        print(f"Columns: {saved_format.getColumnCount()}; spacing: {saved_format.getColumnSpacing()} points")
    finally:
        saved_presentation.dispose()
finally:
    presentation.dispose()

استخراج متن از ستون‌های منفرد

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

این کار زمانی مفید است که نیاز داشته باشید:

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

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

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

import jpype
import asposeslides

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

from pathlib import Path
from asposeslides.api import AutoShape, Presentation

presentation = Presentation("MultiColumnText.pptx")
try:
    text_box = None
    for shape in presentation.getSlides().get_Item(0).getShapes():
        if isinstance(shape, AutoShape):
            if shape.getTextFrame() is not None:
                column_count = shape.getTextFrame().getTextFrameFormat().getColumnCount()
                if column_count > 1:
                    text_box = shape
                    break

    if text_box is None:
        print("No multi-column text frame was found.")
    else:
        text_frame = text_box.getTextFrame()
        configured_column_count = text_frame.getTextFrameFormat().getColumnCount()
        column_texts = text_frame.splitTextByColumns()

        print(f"Configured columns: {configured_column_count}")

        for column_number, column_text in enumerate(column_texts, start=1):
            print(f"Column {column_number}: {column_text}")
            output_path = Path(f"Column-{column_number}.txt")
            try:
                output_path.write_text(str(column_text), encoding="utf-8")
            except OSError as exception:
                print(f"Could not write column {column_number}: {exception}")
finally:
    presentation.dispose()

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

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

مثال زیر هر رخداد years را با months در متن شکل‌های خودکار جایگزین می‌کند و هر بخش تحت‌تأثیر را بولد می‌نماید:

import jpype
import asposeslides

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

from asposeslides.api import AutoShape, NullableBool, Presentation, SaveFormat

presentation = Presentation("Text.pptx")
try:
    for slide in presentation.getSlides():
        for shape in slide.getShapes():
            if not isinstance(shape, AutoShape):
                continue

            text_frame = shape.getTextFrame()
            if text_frame is None:
                continue

            for paragraph in text_frame.getParagraphs():
                for portion in paragraph.getPortions():
                    text = portion.getText()
                    if text is not None and "years" in str(text):
                        portion.setText(str(text).replace("years", "months"))
                        portion.getPortionFormat().setFontBold(NullableBool.True_)

    presentation.save("TextChanged.pptx", SaveFormat.Pptx)
finally:
    presentation.dispose()

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

افزودن جعبه متن با پیوند

می‌توانید یک پیوند را به بخش متن خاصی اختصاص دهید، بنابراین تنها آن متن به عنوان لینک کلیک‌شدنی عمل می‌کند. از HyperlinkManager.setExternalHyperlinkClick برای مرتبط‌سازی بخش با یک URL خارجی استفاده کنید.

مثال زیر متن پیوندی ایجاد می‌کند و آن را در یک ارائه ذخیره می‌نماید:

import jpype
import asposeslides

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

from asposeslides.api import Presentation, SaveFormat, ShapeType

presentation = Presentation()
try:
    slide = presentation.getSlides().get_Item(0)
    text_box = slide.getShapes().addAutoShape(ShapeType.Rectangle, 150, 150, 200, 50)
    text_box.addTextFrame("Aspose.Slides")

    text_portion = text_box.getTextFrame().getParagraphs().get_Item(0).getPortions().get_Item(0)
    text_portion.getPortionFormat().getHyperlinkManager().setExternalHyperlinkClick("https://www.aspose.com/")

    presentation.save("Hyperlink.pptx", SaveFormat.Pptx)
finally:
    presentation.dispose()

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

تفاوت جعبه متن و جای‌دار متن (placeholder) در یک اسلاید مستر یا لایه‌بندی چیست؟

یک placeholder می‌تواند موقعیت و قالب‌بندی خود را از یک master slide یا layout slide به ارث ببرد. یک جعبه متن عادی یک شکل مستقل بر روی اسلایدی است که در آن ایجاد شده و هنگام تغییر لایه، رفتار جای‌دار را به‌دست نمی‌آورد.

چگونه می‌توانم متن را جایگزین کنم بدون اینکه متن در نمودارها، جدول‌ها یا SmartArt تغییر یابد؟

پیمایش را تنها به اشکالی که نمونه‌ای از AutoShape هستند محدود کنید، همان‌گونه که در مثال «به‌روزرسانی متن» نشان داده شد. نمودارها، جدول‌ها و SmartArt متن خود را در مدل‌های شیء مستقل خود ذخیره می‌کنند، بنابراین توسط آن حلقه تغییر نمی‌یابند.