Форматирование текста презентации в .NET

Обзор

В этой статье показано, как форматировать текст в презентациях PowerPoint и OpenDocument с использованием Aspose.Slides for .NET. Рассматриваются фоновые цвета, прозрачность, интервал между символами, свойства шрифтов, вращение, интервал между абзацами, поведение автоподгонки, привязка текста, табуляция и настройки языка.

Если не указано иное, примеры используют sample.pptx. На первом слайде первая фигура — текстовое поле, а его первый абзац содержит текст, показанный ниже. Индексы слайдов и фигур нумеруются с нуля. Примеры, выделяющие жирные части, используют эффективное форматирование, включая унаследованное жирное форматирование:

Пример текста

Для поиска и выделения буквального текста или совпадений по регулярному выражению см. Search and Replace Text.

Установить цвет фона текста

Используйте IParagraphFormat.DefaultPortionFormat для задания цвета подсветки по умолчанию для абзаца или IBasePortionFormat.HighlightColor для отдельный текстовых частей.

В следующем примере задаётся светло‑серый цвет подсветки по умолчанию для первого абзаца. Явные цвета подсветки для отдельных частей имеют приоритет над этим значением по умолчанию:

using System.Drawing;
using Aspose.Slides;
using Aspose.Slides.Export;

using var presentation = new Presentation("sample.pptx");
var slide = presentation.Slides[0];

var autoShape = (IAutoShape)slide.Shapes[0];
var paragraph = autoShape.TextFrame.Paragraphs[0];

// Установить цвет подсветки для всего абзаца.
paragraph.ParagraphFormat.DefaultPortionFormat.HighlightColor.Color = Color.LightGray;

presentation.Save("gray_paragraph.pptx", SaveFormat.Pptx);

Результат:

Серый абзац

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

using System.Drawing;
using Aspose.Slides;
using Aspose.Slides.Export;

using var presentation = new Presentation("sample.pptx");
var slide = presentation.Slides[0];

var autoShape = (IAutoShape)slide.Shapes[0];
var paragraph = autoShape.TextFrame.Paragraphs[0];

foreach (var portion in paragraph.Portions)
{
    if (portion.PortionFormat.GetEffective().FontBold)
    {
        // Установить цвет подсветки для текстовой части.
        portion.PortionFormat.HighlightColor.Color = Color.LightGray;
    }
}

presentation.Save("gray_text_portions.pptx", SaveFormat.Pptx);

Результат:

Серые текстовые части

Выравнивание абзацев текста

Используйте IParagraphFormat.Alignment для задания выравнивания абзаца внутри текстового кадра. Значение может быть по центру, по левому краю, по правому краю, с выравниванием по ширине и т.д.

В следующем примере показано, как выровнять абзац по центру:

using Aspose.Slides;
using Aspose.Slides.Export;

using var presentation = new Presentation("sample.pptx");
var slide = presentation.Slides[0];

var autoShape = (IAutoShape)slide.Shapes[0];
var paragraph = autoShape.TextFrame.Paragraphs[0];

// Установить выравнивание абзаца по центру.
paragraph.ParagraphFormat.Alignment = TextAlignment.Center;

presentation.Save("aligned_paragraph.pptx", SaveFormat.Pptx);

Результат:

Выровненный абзац

Выравнивание шрифтов внутри строки

Используйте IParagraphFormat.FontAlignment для вертикального выравнивания текстовых частей разного размера шрифта внутри строки. Эта настройка применяется ко всему абзацу и управляет выравниванием внутри каждой его строки.

В следующем самообъясняющем примере создаются четыре подписанных текстовых поля на одном слайде. Каждый абзац содержит одинаковый текст размером 18, 36 и 54 пункта с различным выравниванием шрифта. Используется Arial, отключена автоподгонка и перенос, а текстовые кадры достаточны для одной строки.

using System.Drawing;
using Aspose.Slides;
using Aspose.Slides.Export;

using var presentation = new Presentation();
var slide = presentation.Slides[0];

var alignments = new[] { FontAlignment.Baseline, FontAlignment.Top, FontAlignment.Center, FontAlignment.Bottom };
var fontSizes = new[] { 18f, 36f, 54f };

for (var i = 0; i < alignments.Length; i++)
{
    var shape = slide.Shapes.AddAutoShape(ShapeType.Rectangle, 30, 20 + i * 130, 660, 120);
    shape.FillFormat.FillType = FillType.NoFill;
    shape.LineFormat.FillFormat.FillType = FillType.NoFill;

    var textFrame = shape.TextFrame;
    textFrame.TextFrameFormat.AnchoringType = TextAnchorType.Top;
    textFrame.TextFrameFormat.AutofitType = TextAutofitType.None;
    textFrame.TextFrameFormat.WrapText = NullableBool.False;

    var label = textFrame.Paragraphs[0];
    label.Text = alignments[i].ToString();
    label.ParagraphFormat.Alignment = TextAlignment.Left;
    label.ParagraphFormat.DefaultPortionFormat.FontHeight = 14;
    label.ParagraphFormat.DefaultPortionFormat.LatinFont = new FontData("Arial");
    label.ParagraphFormat.DefaultPortionFormat.FillFormat.FillType = FillType.Solid;
    label.ParagraphFormat.DefaultPortionFormat.FillFormat.SolidFillColor.Color = Color.Gray;

    var paragraph = new Paragraph();
    paragraph.ParagraphFormat.FontAlignment = alignments[i];
    paragraph.ParagraphFormat.Alignment = TextAlignment.Left;
    paragraph.ParagraphFormat.DefaultPortionFormat.LatinFont = new FontData("Arial");
    paragraph.ParagraphFormat.DefaultPortionFormat.FillFormat.FillType = FillType.Solid;
    paragraph.ParagraphFormat.DefaultPortionFormat.FillFormat.SolidFillColor.Color = Color.Black;

    foreach (var fontSize in fontSizes)
    {
        var portion = new Portion("Ag ");
        portion.PortionFormat.FontHeight = fontSize;
        paragraph.Portions.Add(portion);
    }

    textFrame.Paragraphs.Add(paragraph);
}

presentation.Save("font_alignment.pptx", SaveFormat.Pptx);

Результат:

Сравнение выравнивания Baseline, Top, Center и Bottom при разных размерах шрифта

Выравнивание шрифта использует метрики шрифта, поэтому видимые края отдельных букв не всегда совпадают точно. Пример включает как прописную букву, так и нижний вынос для демонстрации разницы между базовой линией и нижним выравниванием. Доступность шрифтов и их замена, используемые символы и различие в размерах шрифтов влияют на результат. Размеры кадра, отступы, межстрочный интервал, перенос и автоподгонка также влияют на расположение; используйте одинаковые шрифты и настройки макета при сравнении режимов.

Эта настройка отличается от IParagraphFormat.Alignment, который управляет горизонтальным выравниванием абзаца, и ITextFrameFormat.AnchoringType, который позиционирует блок текста вертикально внутри фигуры. Форматирование надстрочного и подстрочного текста через IBasePortionFormat.Escapement смещает отдельные части относительно базовой линии вместо установки выравнивания шрифта для строк абзаца.

Установить прозрачность текста

Прозрачность текста контролируется альфа‑компонентой цвета, назначенного IBasePortionFormat.FillFormat. В приведённых ниже примерах alpha = 50 — значение альфа‑канала ARGB в диапазоне 0–255, а не процент прозрачности.

Пример кода, показывающий, как применить прозрачность к всему абзацу:

using System.Drawing;
using Aspose.Slides;
using Aspose.Slides.Export;

var alpha = 50;

using var presentation = new Presentation("sample.pptx");
var slide = presentation.Slides[0];

var autoShape = (IAutoShape)slide.Shapes[0];
var paragraph = autoShape.TextFrame.Paragraphs[0];

// Установить полупрозрачную чёрную заливку для текста.
paragraph.ParagraphFormat.DefaultPortionFormat.FillFormat.FillType = FillType.Solid;
paragraph.ParagraphFormat.DefaultPortionFormat.FillFormat.SolidFillColor.Color = Color.FromArgb(alpha, Color.Black);

presentation.Save("transparent_paragraph.pptx", SaveFormat.Pptx);

Результат:

Прозрачный абзац

Следующий пример кода показывает, как применить прозрачность к текстовым частям с жирным шрифтом:

using System.Drawing;
using Aspose.Slides;
using Aspose.Slides.Export;

var alpha = 50;

using var presentation = new Presentation("sample.pptx");
var slide = presentation.Slides[0];

var autoShape = (IAutoShape)slide.Shapes[0];
var paragraph = autoShape.TextFrame.Paragraphs[0];

foreach (var portion in paragraph.Portions)
{
    if (portion.PortionFormat.GetEffective().FontBold)
    {
        // Установить прозрачность текстовой части.
        portion.PortionFormat.FillFormat.FillType = FillType.Solid;
        portion.PortionFormat.FillFormat.SolidFillColor.Color = Color.FromArgb(alpha, Color.Black);
    }
}

presentation.Save("transparent_text_portions.pptx", SaveFormat.Pptx);

Результат:

Прозрачные текстовые части

Установить интервал между символами текста

Используйте IBasePortionFormat.Spacing для увеличения или уменьшения интервала между символами в текстовом поле. В примерах добавляется 3 пункта интервала; отрицательные значения сужают текст.

Следующий C#‑код показывает, как расширить интервал между символами в всём абзаце:

using Aspose.Slides;
using Aspose.Slides.Export;

using var presentation = new Presentation("sample.pptx");
var slide = presentation.Slides[0];

var autoShape = (IAutoShape)slide.Shapes[0];
var paragraph = autoShape.TextFrame.Paragraphs[0];

// Примечание: используйте отрицательные значения, чтобы сжать интервал между символами.
paragraph.ParagraphFormat.DefaultPortionFormat.Spacing = 3;  // Увеличить интервал между символами.

presentation.Save("character_spacing_in_paragraph.pptx", SaveFormat.Pptx);

Результат:

Интервал между символами в абзаце

Пример кода ниже показывает, как расширить интервал между символами в текстовых частях с жирным шрифтом:

using Aspose.Slides;
using Aspose.Slides.Export;

using var presentation = new Presentation("sample.pptx");
var slide = presentation.Slides[0];

var autoShape = (IAutoShape)slide.Shapes[0];
var paragraph = autoShape.TextFrame.Paragraphs[0];

foreach (var portion in paragraph.Portions)
{
    if (portion.PortionFormat.GetEffective().FontBold)
    {
        // Примечание: используйте отрицательные значения, чтобы сжать интервал между символами.
        portion.PortionFormat.Spacing = 3;  // Увеличить интервал между символами.
    }
}

presentation.Save("character_spacing_in_text_portions.pptx", SaveFormat.Pptx);

Результат:

Интервал между символами в текстовых частях

Отключить кернинг для конкретных шрифтов

В некоторых случаях текст, отрисованный Aspose.Slides, выглядит чуть плотнее, чем тот же текст в PowerPoint. Это может происходить, потому что PowerPoint игнорирует данные кернинга для определённых шрифтов, даже если шрифт содержит корректную информацию о кернинге и кернинг включён в параметрах PowerPoint.

Чтобы сделать вывод ближе к PowerPoint, можно отключить кернинг для текстовых частей, использующих затронутый шрифт. Установите IBasePortionFormat.KerningMinimalSize в значение, превышающее фактический размер шрифта. Этот пример требует файла “presentation.pptx” с текстовым полем в первой фигуре первого слайда. Он проверяет эффективные имена шрифтов, включая унаследованные, и задаёт порог в 100 пунктов для частей, использующих Roboto. Это отключает кернинг для соответствующих частей с размером шрифта ниже 100 пунктов:

using Aspose.Slides;
using Aspose.Slides.Export;

using var presentation = new Presentation("presentation.pptx");
var slide = presentation.Slides[0];

var autoShape = (IAutoShape)slide.Shapes[0];
var targetFont = "Roboto";

foreach (var paragraph in autoShape.TextFrame.Paragraphs)
{
    foreach (var portion in paragraph.Portions)
    {
        var textFormat = portion.PortionFormat.GetEffective();
        
        var usesTargetFont = textFormat.LatinFont?.FontName == targetFont || 
            textFormat.EastAsianFont?.FontName == targetFont || 
            textFormat.ComplexScriptFont?.FontName == targetFont;

        if (usesTargetFont)
        {
            portion.PortionFormat.KerningMinimalSize = 100;
        }
    }
}

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

Для текста ниже порога эта настройка предотвращает кернинг и может помочь согласовать рендеринг Aspose.Slides с визуальным выводом PowerPoint для шрифтов, подверженных этому специфическому поведению PowerPoint.

Управление свойствами шрифтов текста

Свойства шрифтов можно задать на уровне абзаца через IParagraphFormat.DefaultPortionFormat или для отдельных частей через IPortionFormat.

В следующем примере задаётся шрифт по умолчанию для первого абзаца: Times New Roman 12 пт, полужирный, курсив и пунктирное подчёркивание. Явное форматирование отдельных частей имеет приоритет над этими значениями по умолчанию.

using Aspose.Slides;
using Aspose.Slides.Export;

using var presentation = new Presentation("sample.pptx");
var slide = presentation.Slides[0];

var autoShape = (IAutoShape)slide.Shapes[0];
var paragraph = autoShape.TextFrame.Paragraphs[0];

// Задать свойства шрифта для абзаца.
var portionFormat = paragraph.ParagraphFormat.DefaultPortionFormat;
portionFormat.FontHeight = 12;
portionFormat.FontBold = NullableBool.True;
portionFormat.FontItalic = NullableBool.True;
portionFormat.FontUnderline = TextUnderlineType.Dotted;
portionFormat.LatinFont = new FontData("Times New Roman");

presentation.Save("font_properties_for_paragraph.pptx", SaveFormat.Pptx);

Результат:

Свойства шрифта абзаца

В следующем примере к частям, у которых эффективное форматирование жирное, применяется Times New Roman 13 пт, курсив и пунктирное подчёркивание:

using Aspose.Slides;
using Aspose.Slides.Export;

using var presentation = new Presentation("sample.pptx");
var slide = presentation.Slides[0];

var autoShape = (IAutoShape)slide.Shapes[0];
var paragraph = autoShape.TextFrame.Paragraphs[0];

foreach (var portion in paragraph.Portions)
{
    if (portion.PortionFormat.GetEffective().FontBold)
    {
        // Задать свойства шрифта для текстовой части.
        portion.PortionFormat.FontHeight = 13;
        portion.PortionFormat.FontItalic = NullableBool.True;
        portion.PortionFormat.FontUnderline = TextUnderlineType.Dotted;
        portion.PortionFormat.LatinFont = new FontData("Times New Roman");
    }
}

presentation.Save("font_properties_for_text_portions.pptx", SaveFormat.Pptx);

Результат:

Свойства шрифта текстовых частей

Контроль нормализации высоты текста

Используйте IBasePortionFormat.NormaliseHeight при воспроизведении типографики шаблона или исследовании различий в высоте символов. В PowerPoint включение нормализации растягивает или сжимает отдельные символы по вертикали, чтобы они имели одинаковую видимую высоту внутри текстовой части. Это не гарантирует одинаковую высоту текста между разными шрифтами.

Установите свойство в NullableBool.True or False для явного включения или отключения нормализации. NullableBool.NotDefined оставляет локальную настройку неопределённой, так что часть наследует значение, например, из DefaultPortionFormat абзаца. Это не эквивалентно False. Используйте IPortionFormat.GetEffective и читайте IBasePortionFormatEffectiveData.NormaliseHeight для получения разрешённого булевого значения.

Следующий самостоятельный пример требует установленный Arial. Он создаёт два блока текста, содержащих одинаковые прописные буквы, строчные буквы, нижние выносы и символы с диакритикой в размере 54 пт. Оба абзаца включают нормализацию по умолчанию. Верхняя часть явно отключает её; нижняя наследует настройку. Размеры кадров, отступы и интервал между абзацами одинаковы, перенос и автоподгонка отключены для постоянного сравнения. Пример выводит False: False и NotDefined: True, затем сохраняет «text_height_normalization.pptx».

using System;
using System.Drawing;
using Aspose.Slides;
using Aspose.Slides.Export;

using var presentation = new Presentation();
var slide = presentation.Slides[0];

var settings = new[] { NullableBool.False, NullableBool.NotDefined };

for (var i = 0; i < settings.Length; i++)
{
    var shape = slide.Shapes.AddAutoShape(ShapeType.Rectangle, 30, 60 + i * 200, 660, 150);
    shape.FillFormat.FillType = FillType.NoFill;
    shape.LineFormat.FillFormat.FillType = FillType.NoFill;

    var textFrame = shape.TextFrame;
    textFrame.Text = "Hxgjpq ÅÉ 0123";
    textFrame.TextFrameFormat.AutofitType = TextAutofitType.None;
    textFrame.TextFrameFormat.WrapText = NullableBool.False;
    textFrame.TextFrameFormat.AnchoringType = TextAnchorType.Top;
    textFrame.TextFrameFormat.MarginTop = 0;
    textFrame.TextFrameFormat.MarginLeft = 0;

    var paragraph = textFrame.Paragraphs[0];
    paragraph.ParagraphFormat.Alignment = TextAlignment.Left;
    paragraph.ParagraphFormat.SpaceBefore = 0;
    paragraph.ParagraphFormat.SpaceAfter = 0;
    paragraph.ParagraphFormat.SpaceWithin = 100;
    paragraph.ParagraphFormat.DefaultPortionFormat.NormaliseHeight = NullableBool.True;

    var portion = paragraph.Portions[0];
    portion.PortionFormat.LatinFont = new FontData("Arial");
    portion.PortionFormat.FontHeight = 54;
    portion.PortionFormat.FillFormat.FillType = FillType.Solid;
    portion.PortionFormat.FillFormat.SolidFillColor.Color = Color.Black;
    portion.PortionFormat.NormaliseHeight = settings[i];

    Console.WriteLine($"{settings[i]}: {portion.PortionFormat.GetEffective().NormaliseHeight}");
}

presentation.Save("text_height_normalization.pptx", SaveFormat.Pptx);

Сравнение ниже экспортировано из сохранённой презентации. В верхнем ряду нормализация отключена (False); в нижнем — наследуется включённая настройка (NotDefined → True). Оставьте Arial установленным для воспроизведения внешнего вида.

Текст Arial 54 пт с отключённой нормализацией сверху и унаследованной нормализацией снизу

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

Применить и удалить зачёркивание

Используйте IBasePortionFormat.StrikethroughType на текстовой части, чтобы отображать исправления, отменённые термины или прежние цены без удаления исходного текста. Установите значение TextStrikethroughType.Single or Double для одной или двух линий через текст.

Чтобы удалить зачёркивание, задайте TextStrikethroughType.None. Это явно отключает эффект, даже если окружающее форматирование задаёт зачёркивание. В отличие от этого, TextStrikethroughType.NotDefined оставляет локальную настройку неопределённой, позволяя части наследовать форматирование, например, из абзаца. Это не гарантирует удаление зачёркивания. Используйте IPortionFormat.GetEffective для чтения итогового форматирования, включая унаследованные значения.

Следующий самостоятельный пример создаёт три сравнения цен. Каждый абзац имеет отдельные части для метки, прежней цены и текущей цены, поэтому только прежняя цена подвергается изменению. В первой строке сначала применяется, а затем удаляется зачёркивание; остальные строки сохраняют одиночное и двойное зачёркивание. Изменение этого свойства сохраняет текст и остальные его форматирования, включая жирную прежнюю цену.

using System.Drawing;
using Aspose.Slides;
using Aspose.Slides.Export;

using var presentation = new Presentation();
var slide = presentation.Slides[0];

var shape = slide.Shapes.AddAutoShape(ShapeType.Rectangle, 50, 50, 620, 220);
shape.FillFormat.FillType = FillType.NoFill;
shape.LineFormat.FillFormat.FillType = FillType.NoFill;
shape.TextFrame.Paragraphs.Clear();

var labels = new[] { "None: ", "Single: ", "Double: " };

foreach (var label in labels)
{
    var paragraph = new Paragraph();
    paragraph.ParagraphFormat.Alignment = TextAlignment.Left;
    paragraph.ParagraphFormat.SpaceAfter = 20;

    var format = paragraph.ParagraphFormat.DefaultPortionFormat;
    format.FontHeight = 28;
    format.LatinFont = new FontData("Arial");
    format.FillFormat.FillType = FillType.Solid;
    format.FillFormat.SolidFillColor.Color = Color.Black;

    paragraph.Portions.Add(new Portion(label));

    var previousPrice = new Portion("$100");
    previousPrice.PortionFormat.FontBold = NullableBool.True;
    paragraph.Portions.Add(previousPrice);
    paragraph.Portions.Add(new Portion(" → $80"));
    
    shape.TextFrame.Paragraphs.Add(paragraph);
}

var paragraphs = shape.TextFrame.Paragraphs;

// Применить зачёркивание, затем явно удалить его у первой прежней цены.
paragraphs[0].Portions[1].PortionFormat.StrikethroughType = TextStrikethroughType.Single;
paragraphs[0].Portions[1].PortionFormat.StrikethroughType = TextStrikethroughType.None;

paragraphs[1].Portions[1].PortionFormat.StrikethroughType = TextStrikethroughType.Single;
paragraphs[2].Portions[1].PortionFormat.StrikethroughType = TextStrikethroughType.Double;

presentation.Save("strikethrough.pptx", SaveFormat.Pptx);

Результат сверху вниз: без зачёркивания, одиночное зачёркивание и двойное зачёркивание.

Прежние цены без зачёркивания, с одиночным и двойным зачёркиванием

Установить вращение текста

Используйте ITextFrameFormat.TextVerticalType для задания предустановленной ориентации текста внутри фигуры.

В следующем примере код задаёт ориентацию текста в фигуре как TextVerticalType.Vertical270, что вращает текст на 90 градусов против часовой стрелки:

using Aspose.Slides;
using Aspose.Slides.Export;

using var presentation = new Presentation("sample.pptx");
var slide = presentation.Slides[0];

var autoShape = (IAutoShape)slide.Shapes[0];
autoShape.TextFrame.TextFrameFormat.TextVerticalType = TextVerticalType.Vertical270;

presentation.Save("text_rotation.pptx", SaveFormat.Pptx);

Результат:

Вращение текста

Установить пользовательское вращение для текстовых кадров

Используйте ITextFrameFormat.RotationAngle для задания пользовательского угла вращения для ITextFrame.

Пример кода ниже вращает текстовый кадр на 3 градуса по часовой стрелке внутри фигуры:

using Aspose.Slides;
using Aspose.Slides.Export;

using var presentation = new Presentation("sample.pptx");
var slide = presentation.Slides[0];

var autoShape = (IAutoShape)slide.Shapes[0];
autoShape.TextFrame.TextFrameFormat.RotationAngle = 3;

presentation.Save("custom_text_rotation.pptx", SaveFormat.Pptx);

Результат:

Пользовательское вращение текста

Установить межстрочный интервал абзацев

Aspose.Slides предоставляет IParagraphFormat.SpaceAfter, IParagraphFormat.SpaceBefore и IParagraphFormat.SpaceWithin для управления интервалом абзацев. Эти свойства применяются следующим образом:

  • Положительное значение задаёт межстрочный интервал в процентах от высоты строки.
  • Отрицательное значение задаёт межстрочный интервал в пунктах.

В следующем примере задаётся интервал внутри первого абзаца в 200 % от высоты строки (двойной интервал):

using Aspose.Slides;
using Aspose.Slides.Export;

using var presentation = new Presentation("sample.pptx");
var slide = presentation.Slides[0];

var autoShape = (IAutoShape)slide.Shapes[0];
var paragraph = autoShape.TextFrame.Paragraphs[0];

paragraph.ParagraphFormat.SpaceWithin = 200;

presentation.Save("line_spacing.pptx", SaveFormat.Pptx);

Результат:

Межстрочный интервал внутри абзаца

Контроль разрыва строк

Правила разрыва строк в абзаце полезны в узких текстовых блоках и презентациях, где смешивается латинский и восточноазиатский текст. Следующие свойства принадлежат IParagraphFormat, поэтому они применимы ко всему абзацу:

  • LatinLineBreak управляет правилами разрыва латинского текста. В смешанном тексте изменение этого свойства может также влиять на место переноса соседнего восточноазиатского текста и пунктуации.
  • EastAsianLineBreak управляет правилами разрыва восточноазиатского текста, включая ограничения на символы в начале и в конце строки.

Эти правила не заменяют ITextFrameFormat.WrapText, который включае​т автоматический перенос внутри текстового кадра. Они влияют на макет при переносе, но не вставляют символы разрыва строки. Явный разрыв строки заставляет начать новую строку внутри абзаца независимо от доступной ширины.

Следующий самостоятельный пример создаёт узкий текстовый блок, содержащий китайский и латинский текст. Он явно задаёт оба свойства разрыва строк и сохраняет «line_breaking.pptx». Чтобы поэкспериментировать с любым из правил, измените значение соответствующего свойства, оставив остальные настройки фиксированными. Пример использует Arial 24 пт и SimSun, ширина кадра 160 пт, горизонтальные отступы кадра 0. ITextFrameFormat.AutofitType установлен в TextAutofitType.None, чтобы размер текста и кадра оставались фиксированными.

using System.Drawing;
using Aspose.Slides;
using Aspose.Slides.Export;

using var presentation = new Presentation();
var slide = presentation.Slides[0];

var shape = slide.Shapes.AddAutoShape(ShapeType.Rectangle, 50, 50, 160, 300);
shape.FillFormat.FillType = FillType.NoFill;

var textFrame = shape.TextFrame;
textFrame.TextFrameFormat.WrapText = NullableBool.True;
textFrame.TextFrameFormat.AutofitType = TextAutofitType.None;
textFrame.TextFrameFormat.MarginLeft = 0;
textFrame.TextFrameFormat.MarginRight = 0;

var paragraph = textFrame.Paragraphs[0];
paragraph.Text = "中文排版测试,PowerPoint 中文演示。";

var format = paragraph.ParagraphFormat;
format.Alignment = TextAlignment.Left;
format.DefaultPortionFormat.FontHeight = 24;
format.DefaultPortionFormat.LatinFont = new FontData("Arial");
format.DefaultPortionFormat.EastAsianFont = new FontData("SimSun");
format.DefaultPortionFormat.FillFormat.FillType = FillType.Solid;
format.DefaultPortionFormat.FillFormat.SolidFillColor.Color = Color.Black;
format.LatinLineBreak = NullableBool.False;
format.EastAsianLineBreak = NullableBool.True;

presentation.Save("line_breaking.pptx", SaveFormat.Pptx);

Контроль «висящей» пунктуации

IParagraphFormat.HangingPunctuation позволяет допустимой пунктуации выходить за правый край линии текста вместо того, чтобы занимать следующую строку. Применяется ко всему абзацу и отличается от «висящего» отступа.

Следующий самостоятельный пример включает «висящую» пунктуацию в текстовом кадре шириной 100 пт и сохраняет «hanging_punctuation.pptx». При Arial 24 пт и нулевых горизонтальных отступах кадра конечная точка остаётся после слова «sentence» и выходит за правый край текста. Установите свойство в NullableBool.False для сравнения: при этих настройках точка занимает отдельную строку. Перенос включён, автоподгонка отключена, чтобы фиксировать доступную ширину.

using System.Drawing;
using Aspose.Slides;
using Aspose.Slides.Export;

using var presentation = new Presentation();
var slide = presentation.Slides[0];

var shape = slide.Shapes.AddAutoShape(ShapeType.Rectangle, 50, 50, 100, 200);
shape.FillFormat.FillType = FillType.NoFill;

var textFrame = shape.TextFrame;
textFrame.TextFrameFormat.WrapText = NullableBool.True;
textFrame.TextFrameFormat.AutofitType = TextAutofitType.None;
textFrame.TextFrameFormat.MarginLeft = 0;
textFrame.TextFrameFormat.MarginRight = 0;

var paragraph = textFrame.Paragraphs[0];
paragraph.Text = "Simple text, next sentence.";

var format = paragraph.ParagraphFormat;
format.Alignment = TextAlignment.Left;
format.DefaultPortionFormat.FontHeight = 24;
format.DefaultPortionFormat.LatinFont = new FontData("Arial");
format.DefaultPortionFormat.FillFormat.FillType = FillType.Solid;
format.DefaultPortionFormat.FillFormat.SolidFillColor.Color = Color.Black;
format.HangingPunctuation = NullableBool.True;

presentation.Save("hanging_punctuation.pptx", SaveFormat.Pptx);

Не каждая пунктуация может «висеть». На это сравнение также влияют условия шрифта и макета, описанные выше: изменение шрифта, доступной ширины, отступов или параметров автоподгонки может убрать видимую разницу.

Установить тип автоподгонки для текстовых кадров

ITextFrameFormat.AutofitType определяет, как текст ведёт себя, когда превышает границы своего контейнера. Используйте его для контроля того, будет ли текст сжиматься, выходить за пределы или автоматически изменять размер фигуры. Следующий пример настраивает фигуру на изменение размера для соответствия тексту и сохраняет результат в «autofit_type.pptx».

using Aspose.Slides;
using Aspose.Slides.Export;

using var presentation = new Presentation("sample.pptx");
var slide = presentation.Slides[0];

var autoShape = (IAutoShape)slide.Shapes[0];
autoShape.TextFrame.TextFrameFormat.AutofitType = TextAutofitType.Shape;

presentation.Save("autofit_type.pptx", SaveFormat.Pptx);

Чтобы подсчитать строки после автоматического переноса и увидеть, как изменяется ширина текста или фигуры, см. Count Rendered Lines. Одна лишь подсчёт строк не указывает, выходит ли текст за пределы контейнера.

Установить привязку текстовых кадров

ITextFrameFormat.AnchoringType определяет, как текст позиционируется вертикально внутри фигуры, например, вверху, по центру или внизу. Следующий пример привязывает текст к нижней части первой фигуры и сохраняет результат в «text_anchor.pptx».

using Aspose.Slides;
using Aspose.Slides.Export;

using var presentation = new Presentation("sample.pptx");
var slide = presentation.Slides[0];

var autoShape = (IAutoShape)slide.Shapes[0];
autoShape.TextFrame.TextFrameFormat.AnchoringType = TextAnchorType.Bottom;

presentation.Save("text_anchor.pptx", SaveFormat.Pptx);

Установить табуляцию текста

Используйте IParagraphFormat.DefaultTabSize и IParagraphFormat.Tabs для настройки табуляции в абзаце. В следующем примере задаётся стандартный интервал табуляции 100 пт и добавляется левый табулятор на 30 пт. Эти настройки влияют на текст, содержащий символы табуляции.

using Aspose.Slides;
using Aspose.Slides.Export;

using var presentation = new Presentation("sample.pptx");
var slide = presentation.Slides[0];

var autoShape = (IAutoShape)slide.Shapes[0];
var paragraph = autoShape.TextFrame.Paragraphs[0];
paragraph.ParagraphFormat.DefaultTabSize = 100;
paragraph.ParagraphFormat.Tabs.Add(30, TabAlignment.Left);

presentation.Save("paragraph_tabs.pptx", SaveFormat.Pptx);

Результат:

Табуляция абзаца

Установить язык проверки правописания

Aspose.Slides предоставляет IBasePortionFormat.LanguageId, позволяющий задать язык проверки правописания для текстовой части. Язык проверки определяет, какой язык используется для проверки орфографии и грамматики в PowerPoint.

В следующем примере требуется файл «presentation.pptx» с текстовым полем в первой фигуре первого слайда и как минимум один абзац. Он заменяет содержимое первого абзаца на «1。», задаёт SimSun в качестве шрифта и назначает язык проверки упрощённого китайского (zh-CN). Затем сохраняет результат в «proofing_language.pptx»:

using Aspose.Slides;
using Aspose.Slides.Export;

using var presentation = new Presentation("presentation.pptx");
var slide = presentation.Slides[0];

var autoShape = (IAutoShape)slide.Shapes[0];
var paragraph = autoShape.TextFrame.Paragraphs[0];
paragraph.Portions.Clear();

var font = new FontData("SimSun");

var textPortion = new Portion();
textPortion.PortionFormat.ComplexScriptFont = font;
textPortion.PortionFormat.EastAsianFont = font;
textPortion.PortionFormat.LatinFont = font;

// Установить язык проверки правописания на упрощённый китайский.
textPortion.PortionFormat.LanguageId = "zh-CN";

textPortion.Text = "1。";
paragraph.Portions.Add(textPortion);

presentation.Save("proofing_language.pptx", SaveFormat.Pptx);

Установить язык по умолчанию

Используйте LoadOptions.DefaultTextLanguage для определения языка по умолчанию для текста, создаваемого при загрузке или создании презентации. В следующем примере создаётся презентация с американским английским в качестве языка текста по умолчанию, добавляется текстовое поле и выводится en-US для первой текстовой части.

using System;
using Aspose.Slides;

var loadOptions = new LoadOptions();
loadOptions.DefaultTextLanguage = "en-US";

using var presentation = new Presentation(loadOptions);
var slide = presentation.Slides[0];

// Добавить новую прямоугольную фигуру с текстом.
var shape = slide.Shapes.AddAutoShape(ShapeType.Rectangle, 20, 20, 150, 50);
shape.TextFrame.Text = "Sample text";

// Проверить язык первой части.
var portion = shape.TextFrame.Paragraphs[0].Portions[0];
Console.WriteLine(portion.PortionFormat.LanguageId);

Установить стиль текста по умолчанию

Для применения форматирования текста по умолчанию на уровне презентации используйте IPresentation.DefaultTextStyle.

В следующем примере задаётся шрифт 14 пт полужирный в качестве значения по умолчанию для абзацев верхнего уровня в новой презентации и сохраняется в «default_text_style.pptx». Текст может наследовать эти значения, если более конкретное форматирование их не переопределяет.

using Aspose.Slides;
using Aspose.Slides.Export;

using var presentation = new Presentation();
// Получить формат абзаца верхнего уровня.
var paragraphFormat = presentation.DefaultTextStyle.GetLevel(0);

if (paragraphFormat != null)
{
    paragraphFormat.DefaultPortionFormat.FontHeight = 14;
    paragraphFormat.DefaultPortionFormat.FontBold = NullableBool.True;
}

presentation.Save("default_text_style.pptx", SaveFormat.Pptx);

Извлечение текста с эффектом «Все прописные»

В PowerPoint применение эффекта шрифта All Caps заставляет текст отображаться заглавными буквами на слайде, даже если он был введён строчными. При извлечении такой текстовой части с помощью Aspose.Slides библиотека возвращает текст точно в том виде, в каком он был введён. Чтобы сопоставить отображаемый текст, проверьте TextCapType и преобразуйте возвращённую строку в верхний регистр, когда значение равно All.

Этот пример требует файл «sample2.pptx» с текстовым полем в первой фигуре первого слайда. В первой части первого абзаца содержится «Hello, Aspose!» с применённым эффектом All Caps, как показано ниже.

Эффект All Caps

Пример кода ниже показывает, как извлечь текст с применённым эффектом All Caps:

using System;
using Aspose.Slides;

using var presentation = new Presentation("sample2.pptx");
var slide = presentation.Slides[0];

var autoShape = (IAutoShape)slide.Shapes[0];
var textPortion = autoShape.TextFrame.Paragraphs[0].Portions[0];

Console.WriteLine($"Original text: {textPortion.Text}");

var textFormat = textPortion.PortionFormat.GetEffective();
if (textFormat.TextCapType == TextCapType.All)
{
    var text = textPortion.Text.ToUpper();
    Console.WriteLine($"All-Caps effect: {text}");
}

Вывод:

Original text: Hello, Aspose!
All-Caps effect: HELLO, ASPOSE!

FAQ

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

Для изменения текста в таблице на слайде используйте ITable. Итерируйте ячейки и обновляйте каждую ячейку через ICell.TextFrame и форматирование абзаца через IParagraph.ParagraphFormat.

Как применить градиентный цвет к тексту на слайде PowerPoint?

Для применения градиентного цвета к тексту используйте IBasePortionFormat.FillFormat. Задайте IFillFormat.FillType как FillType.Gradient и настройте градиентные стопы, направление и прозрачность.

Связанная функция: Format text within slides.