Изменение размеров фигур на слайдах презентации в .NET

Обзор

Один из самых часто задаваемых вопросов клиентами Aspose.Slides for .NET — как изменить размер фигур так, чтобы при изменении размера слайда данные не обрезались. В этой короткой технической статье показано, как это сделать.

Изменение размера фигур

Чтобы фигуры не смещались при изменении размера слайда, обновите позицию и размеры каждой фигуры в соответствии с новым макетом слайда.

 // Загрузить файл презентации.
using (Presentation presentation = new Presentation("sample.pptx"))
{
    // Получить исходный размер слайда.
    float currentHeight = presentation.SlideSize.Size.Height;
    float currentWidth = presentation.SlideSize.Size.Width;

    // Изменить размер слайда без масштабирования существующих фигур.
    presentation.SlideSize.SetSize(SlideSizeType.A4Paper, SlideSizeScaleType.DoNotScale);

    // Получить новый размер слайда.
    float newHeight = presentation.SlideSize.Size.Height;
    float newWidth = presentation.SlideSize.Size.Width;

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

    // Изменить размер и позицию фигур на каждом слайде.
    foreach (ISlide slide in presentation.Slides)
    {
        foreach (IShape shape in slide.Shapes)
        {
            // Масштабировать размер фигуры.
            shape.Height *= heightRatio;
            shape.Width *= widthRatio;

            // Масштабировать позицию фигуры.
            shape.Y *= heightRatio;
            shape.X *= widthRatio;
        }
    }

    presentation.Save("output.pptx", SaveFormat.Pptx);
}

Используйте следующий код, чтобы изменить размер слайдов, содержащих таблицы. Для таблиц установка ширины или высоты является особым случаем: необходимо скорректировать высоту отдельных строк и ширину столбцов, чтобы изменить общий размер таблицы.

using (Presentation presentation = new Presentation("sample.pptx"))
{
    // Получить исходный размер слайда.
    float currentHeight = presentation.SlideSize.Size.Height;
    float currentWidth = presentation.SlideSize.Size.Width;

    // Изменить размер слайда без масштабирования существующих фигур.
    presentation.SlideSize.SetSize(SlideSizeType.A4Paper, SlideSizeScaleType.DoNotScale);
    // presentation.SlideSize.Orientation = SlideOrienation.Portrait;

    // Получить новый размер слайда.
    float newHeight = presentation.SlideSize.Size.Height;
    float newWidth = presentation.SlideSize.Size.Width;

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

    foreach (IMasterSlide master in presentation.Masters)
    {
        foreach (IShape shape in master.Shapes)
        {
            // Масштабировать размер фигуры.
            shape.Height *= heightRatio;
            shape.Width *= widthRatio;

            // Масштабировать позицию фигуры.
            shape.Y *= heightRatio;
            shape.X *= widthRatio;
        }

        foreach (ILayoutSlide layoutSlide in master.LayoutSlides)
        {
            foreach (IShape shape in layoutSlide.Shapes)
            {
                // Масштабировать размер фигуры.
                shape.Height *= heightRatio;
                shape.Width *= widthRatio;

                // Масштабировать позицию фигуры.
                shape.Y *= heightRatio;
                shape.X *= widthRatio;
            }
        }
    }

    foreach (ISlide slide in presentation.Slides)
    {
        foreach (IShape shape in slide.Shapes)
        {
            // Масштабировать размер фигуры.
            shape.Height *= heightRatio;
            shape.Width *= widthRatio;

            // Масштабировать позицию фигуры.
            shape.Y *= heightRatio;
            shape.X *= widthRatio;

            if (shape is ITable)
            {
                ITable table = (ITable)shape;
                foreach (IRow row in table.Rows)
                {
                    row.MinimalHeight *= heightRatio;
                }
                foreach (IColumn column in table.Columns)
                {
                    column.Width *= widthRatio;
                }
            }
        }
    }

    presentation.Save("output.pptx", SaveFormat.Pptx);
}

FAQ

Почему после изменения размера слайда фигуры искажаются или обрезаются?

При изменении размера слайда фигуры сохраняют свою исходную позицию и размер, если явно не изменить масштаб. Это может привести к обрезке содержимого или смещению фигур.

Работает ли предоставленный код для всех типов фигур?

Базовый пример работает для большинства типов фигур (текстовые поля, изображения, диаграммы и т.д.). Однако для таблиц необходимо отдельно обрабатывать строки и столбцы, поскольку высота и ширина таблицы определяются размерами отдельных ячеек.

Как изменить размер таблиц при изменении размера слайда?

Необходимо пройтись по всем строкам и столбцам таблицы и пропорционально изменить их высоту и ширину, как показано во втором примере кода.

Будет ли это изменение работать для шаблонных слайдов и слайдов макета?

Да, но также следует пройтись по Masters и LayoutSlides и применить ту же логику масштабирования к их фигурам, чтобы обеспечить согласованность во всей презентации.

Можно ли изменить ориентацию слайда (портрет/альбом) вместе с изменением размера?

Да. Можно установить presentation.SlideSize.Orientation, чтобы изменить ориентацию. Убедитесь, что логика масштабирования настроена соответствующим образом для сохранения макета.

Есть ли ограничение на размер слайда, который я могу установить?

Aspose.Slides поддерживает пользовательские размеры, но очень большие размеры могут повлиять на производительность или совместимость с некоторыми версиями PowerPoint.

Как предотвратить искажение фигур с фиксированным соотношением сторон?

Можно проверить свойство AspectRatioLocked у фигуры перед масштабированием. Если оно заблокировано, изменяйте ширину или высоту пропорционально, а не масштабируйте их по отдельности.