تغییر اندازه اشکال در اسلایدهای ارائه

مروری کلی

یکی از رایج‌ترین سوالاتی که مشتریان Aspose.Slides برای C++ می‌پرسند این است که چگونه شکل‌ها را طوری تغییر اندازه دهند که هنگام تغییر اندازه اسلاید، داده‌ها بریده نشوند. این مقالهٔ فنی کوتاه نحوهٔ انجام این کار را نشان می‌دهد.

تغییر اندازه شکل‌ها

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

// بارگذاری فایل ارائه.
auto presentation = MakeObject<Presentation>(u"sample.ppt");

// دریافت اندازهٔ اصلی اسلاید.
float currentHeight = presentation->get_SlideSize()->get_Size().get_Height();
float currentWidth = presentation->get_SlideSize()->get_Size().get_Width();

// تغییر اندازهٔ اسلاید بدون مقیاس‌بندی اشکال موجود.
presentation->get_SlideSize()->SetSize(SlideSizeType::A4Paper, SlideSizeScaleType::DoNotScale);

// دریافت اندازهٔ جدید اسلاید.
float newHeight = presentation->get_SlideSize()->get_Size().get_Height();
float newWidth = presentation->get_SlideSize()->get_Size().get_Width();

float heightRatio = newHeight / currentHeight;
float widthRatio = newWidth / currentWidth;

// تغییر اندازه و تغییر موقعیت اشکال در هر اسلاید.
for (auto&& slide : presentation->get_Slides())
{
    for (auto&& shape : slide->get_Shapes())
    {
        // مقیاس‌بندی اندازهٔ شکل.
        shape->set_Height(shape->get_Height() * heightRatio);
        shape->set_Width(shape->get_Width() * widthRatio);

        // مقیاس‌بندی موقعیت شکل.
        shape->set_Y(shape->get_Y() * heightRatio);
        shape->set_X(shape->get_X() * widthRatio);
    }
}

presentation->Save(u"output.pptx", SaveFormat::Pptx);
presentation->Dispose();

از کد زیر در پروژهٔ خود برای تغییر اندازهٔ اسلایدهای حاوی جدول استفاده کنید. برای جداول، تنظیم عرض یا ارتفاع یک حالت خاص است: باید ارتفاع ردیف‌ها و عرض ستون‌ها را به‌صورت جداگانه تنظیم کنید تا اندازهٔ کلی جدول تغییر کند.

auto presentation = MakeObject<Presentation>(u"sample.pptx");

// دریافت اندازهٔ اصلی اسلاید.
float currentHeight = presentation->get_SlideSize()->get_Size().get_Height();
float currentWidth = presentation->get_SlideSize()->get_Size().get_Width();

// تغییر اندازهٔ اسلاید بدون مقیاس‌بندی اشکال موجود.
presentation->get_SlideSize()->SetSize(SlideSizeType::A4Paper, SlideSizeScaleType::DoNotScale);
//presentation.SlideSize.Orientation = SlideOrienation.Portrait;

// دریافت اندازهٔ جدید اسلاید.
float newHeight = presentation->get_SlideSize()->get_Size().get_Height();
float newWidth = presentation->get_SlideSize()->get_Size().get_Width();

float heightRatio = newHeight / currentHeight;
float widthRatio = newWidth / currentWidth;

for (auto&& master : presentation->get_Masters())
{
    for (auto&& shape : master->get_Shapes())
    {
        // مقیاس‌بندی اندازهٔ شکل.
        shape->set_Height(shape->get_Height() * heightRatio);
        shape->set_Width(shape->get_Width() * widthRatio);

        // مقیاس‌بندی موقعیت شکل.
        shape->set_Y(shape->get_Y() * heightRatio);
        shape->set_X(shape->get_X() * widthRatio);
    }

    for (auto&& layoutSlide : master->get_LayoutSlides())
    {
        for (auto&& shape : layoutSlide->get_Shapes())
        {
            // مقیاس‌بندی اندازهٔ شکل.
            shape->set_Height(shape->get_Height() * heightRatio);
            shape->set_Width(shape->get_Width() * widthRatio);

            // مقیاس‌بندی موقعیت شکل.
            shape->set_Y(shape->get_Y() * heightRatio);
            shape->set_X(shape->get_X() * widthRatio);
        }
    }
}

for (auto&& slide : presentation->get_Slides())
{
    for (auto&& shape : slide->get_Shapes())
    {
        // مقیاس‌بندی اندازهٔ شکل.
        shape->set_Height(shape->get_Height() * heightRatio);
        shape->set_Width(shape->get_Width() * widthRatio);

        // مقیاس‌بندی موقعیت شکل.
        shape->set_Y(shape->get_Y() * heightRatio);
        shape->set_X(shape->get_X() * widthRatio);

        if (ObjectExt::Is<ITable>(shape))
        {
            SharedPtr<ITable> table = ExplicitCast<ITable>(shape);
            for (auto&& row : table->get_Rows())
            {
                row->set_MinimalHeight(row->get_MinimalHeight() * heightRatio);
            }
            for (auto&& column : table->get_Columns())
            {
                column->set_Width(column->get_Width() * widthRatio);
            }
        }
    }
}

presentation->Save(u"output.pptx", SaveFormat::Pptx);
presentation->Dispose();

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

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

آیا کد ارائه‌شده برای تمام انواع شکل‌ها کار می‌کند؟
مثال پایه برای اکثر انواع شکل‌ها (جعبه‌های متن، تصاویر، نمودارها و غیره) کار می‌کند. اما برای جداول، باید ردیف‌ها و ستون‌ها را جداگانه مدیریت کنید، زیرا ارتفاع و عرض جدول توسط ابعاد سلول‌های تک‌تکه تعیین می‌شود.

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

آیا این تغییر اندازه برای اسلایدهای اصلی (Master) و اسلایدهای طرح‌بندی (Layout) نیز کار می‌کند؟
بله، اما همچنین باید از طریق Masters و Layout slides حلقه بزنید و منطق مقیاس‌بندی یکسان را بر شکل‌های آن‌ها اعمال کنید تا سازگاری در سراسر ارائه حفظ شود.

آیا می‌توانم جهت اسلاید (پرتره/لنداسکیپ) را همراه با تغییر اندازه تغییر دهم؟
بله. می‌توانید از presentation->get_SlideSize()->set_Orientation برای تغییر جهت استفاده کنید. مطمئن شوید منطق مقیاس‌بندی را متناسب تنظیم کنید تا طرح حفظ شود.

آیا محدودیتی برای اندازهٔ اسلایدی که می‌توانم تنظیم کنم وجود دارد؟
Aspose.Slides از اندازه‌های سفارشی پشتیبانی می‌کند، اما اندازه‌های بسیار بزرگ ممکن است بر عملکرد یا سازگاری با برخی نسخه‌های PowerPoint تأثیر بگذارد.

چگونه می‌توانم از تغییر شکل اشکال با نسبت ابعاد ثابت جلوگیری کنم؟
قبل از مقیاس‌بندی می‌توانید متد get_AspectRatioLocked شکل را بررسی کنید. اگر قفل شده باشد، به‌جای مقیاس‌بندی جداگانهٔ عرض و ارتفاع، عرض یا ارتفاع را به‌صورت نسبت‌مند تنظیم کنید.