Управление текстовыми абзацами PowerPoint в .NET
Обзор
Aspose.Slides for .NET представляет текст как иерархию текстовых фреймов, абзацев и фрагментов:
- ITextFrame представляет контейнер текста в фигуре и предоставляет доступ к её коллекции абзацев.
- IParagraph представляет один абзац в текстовом фрейме и предоставляет доступ к его фрагментам и форматированию уровня абзаца.
- IPortion представляет текстовый фрагмент внутри абзаца. Каждый фрагмент может иметь собственный текст и форматирование уровня символов.
Таким образом, абзац может содержать текст с разными шрифтами, цветами, размерами и другим форматированием, используя несколько фрагментов.
Создание и форматирование абзацев
Создание абзацев с несколькими фрагментами
Следующие шаги создают текстовый фрейм с тремя абзацами, каждый из которых содержит три фрагмента:
- Создайте экземпляр класса Presentation.
- Получите ссылку на соответствующий слайд по его индексу.
- Добавьте прямоугольную IAutoShape на слайд.
- Получите ITextFrame фигуры.
- Используйте абзац по умолчанию и добавьте ещё два объекта IParagraph в текстовый фрейм.
- Добавьте достаточное количество объектов IPortion , чтобы каждый абзац содержал три фрагмента. Абзац по умолчанию уже содержит один пустой фрагмент.
- Задайте текст для каждого фрагмента.
- Примените форматирование уровня символов через IPortion.PortionFormat.
- Сохраните изменённую презентацию.
Этот пример на C# реализует шаги:
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, 150, 300, 150);
var textFrame = shape.TextFrame;
var firstParagraph = textFrame.Paragraphs[0];
firstParagraph.Portions.Add(new Portion());
firstParagraph.Portions.Add(new Portion());
var secondParagraph = new Paragraph();
secondParagraph.Portions.Add(new Portion());
secondParagraph.Portions.Add(new Portion());
secondParagraph.Portions.Add(new Portion());
textFrame.Paragraphs.Add(secondParagraph);
var thirdParagraph = new Paragraph();
thirdParagraph.Portions.Add(new Portion());
thirdParagraph.Portions.Add(new Portion());
thirdParagraph.Portions.Add(new Portion());
textFrame.Paragraphs.Add(thirdParagraph);
var paragraphCount = textFrame.Paragraphs.Count;
for (var paragraphIndex = 0; paragraphIndex < paragraphCount; paragraphIndex++)
{
var paragragaph = textFrame.Paragraphs[paragraphIndex];
var portionCount = paragragaph.Portions.Count;
for (var portionIndex = 0; portionIndex < portionCount; portionIndex++)
{
var portion = paragragaph.Portions[portionIndex];
portion.Text = $"Portion {paragraphIndex + 1}.{portionIndex + 1}";
if (portionIndex == 0)
{
portion.PortionFormat.FillFormat.FillType = FillType.Solid;
portion.PortionFormat.FillFormat.SolidFillColor.Color = Color.Red;
portion.PortionFormat.FontBold = NullableBool.True;
portion.PortionFormat.FontHeight = 15;
}
else if (portionIndex == 1)
{
portion.PortionFormat.FillFormat.FillType = FillType.Solid;
portion.PortionFormat.FillFormat.SolidFillColor.Color = Color.Blue;
portion.PortionFormat.FontItalic = NullableBool.True;
portion.PortionFormat.FontHeight = 18;
}
}
}
presentation.Save("paragraphs_with_portions.pptx", SaveFormat.Pptx);
Создание маркированных и нумерованных списков
Создание маркированного или нумерованного списка
Маркированные пункты и нумерация упрощают просмотр связанных элементов. В Aspose.Slides параметры списка задаются через IBulletFormat.
- Создайте экземпляр класса Presentation.
- Получите ссылку на соответствующий слайд по его индексу.
- Добавьте IAutoShape на выбранный слайд.
- Получите ITextFrame фигуры.
- Удалите абзац по умолчанию из текстового фрейма.
- Создайте Paragraph для символного маркера.
- Установите IBulletFormat.Type в значение BulletType.Symbol и задайте символ маркера.
- Задайте текст абзаца, отступ, цвет маркера и высоту маркера.
- Добавьте абзац в текстовый фрейм.
- Создайте второй абзац и установите IBulletFormat.Type в значение BulletType.Numbered.
- Настройте стиль нумерованного маркера и добавьте абзац в текстовый фрейм.
- Сохраните презентацию.
Этот пример на C# создаёт символный маркер и нумерованный маркер:
using System;
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, 200, 200, 400, 200);
var textFrame = shape.TextFrame;
textFrame.Paragraphs.Clear();
var symbolParagraph = new Paragraph { Text = "Welcome to Aspose.Slides" };
symbolParagraph.ParagraphFormat.Bullet.Type = BulletType.Symbol;
symbolParagraph.ParagraphFormat.Bullet.Char = Convert.ToChar(0x2022);
symbolParagraph.ParagraphFormat.Indent = 25;
symbolParagraph.ParagraphFormat.Bullet.Color.ColorType = ColorType.RGB;
symbolParagraph.ParagraphFormat.Bullet.Color.Color = Color.Black;
symbolParagraph.ParagraphFormat.Bullet.IsBulletHardColor = NullableBool.True;
symbolParagraph.ParagraphFormat.Bullet.Height = 100;
textFrame.Paragraphs.Add(symbolParagraph);
var numberedParagraph = new Paragraph { Text = "This is a numbered item" };
numberedParagraph.ParagraphFormat.Bullet.Type = BulletType.Numbered;
numberedParagraph.ParagraphFormat.Bullet.NumberedBulletStyle = NumberedBulletStyle.BulletCircleNumWDBlackPlain;
numberedParagraph.ParagraphFormat.Indent = 25;
numberedParagraph.ParagraphFormat.Bullet.Color.ColorType = ColorType.RGB;
numberedParagraph.ParagraphFormat.Bullet.Color.Color = Color.Black;
numberedParagraph.ParagraphFormat.Bullet.IsBulletHardColor = NullableBool.True;
numberedParagraph.ParagraphFormat.Bullet.Height = 100;
textFrame.Paragraphs.Add(numberedParagraph);
presentation.Save("bulleted_and_numbered_list.pptx", SaveFormat.Pptx);
Использование изображений в качестве маркеров
Маркеры‑изображения позволяют использовать пользовательское изображение вместо символа или числа.
- Создайте экземпляр класса Presentation.
- Получите ссылку на соответствующий слайд по его индексу.
- Добавьте IAutoShape и получите его ITextFrame.
- Удалите абзац по умолчанию из текстового фрейма.
- Загрузите изображение маркера и добавьте его в коллекцию изображений презентации как IPPImage.
- Создайте Paragraph и задайте его текст.
- Установите IBulletFormat.Type в значение BulletType.Picture.
- Назначьте изображение через IBulletFormat.Picture и задайте высоту маркера.
- Добавьте абзац в текстовый фрейм.
- Сохраните изменённую презентацию.
Этот пример на C# создаёт маркер‑изображение:
using Aspose.Slides;
using Aspose.Slides.Export;
using var presentation = new Presentation();
var slide = presentation.Slides[0];
using var bulletImage = Images.FromFile("bullets.png");
var presentationImage = presentation.Images.AddImage(bulletImage);
var shape = slide.Shapes.AddAutoShape(ShapeType.Rectangle, 200, 200, 400, 200);
var textFrame = shape.TextFrame;
textFrame.Paragraphs.Clear();
var paragraph = new Paragraph { Text = "Welcome to Aspose.Slides" };
paragraph.ParagraphFormat.Bullet.Type = BulletType.Picture;
paragraph.ParagraphFormat.Bullet.Picture.Image = presentationImage;
paragraph.ParagraphFormat.Bullet.Height = 100;
textFrame.Paragraphs.Add(paragraph);
presentation.Save("picture_bullet.pptx", SaveFormat.Pptx);
presentation.Save("picture_bullet.ppt", SaveFormat.Ppt);
Создание многоуровневого списка
Установите IParagraphFormat.Depth , чтобы разместить абзацы на разных уровнях списка. Верхний уровень имеет глубину 0.
- Создайте Presentation и получите слайд.
- Добавьте IAutoShape и очистите абзац по умолчанию из его текстового фрейма.
- Создайте четыре абзаца и настройте их символы маркеров.
- Установите их значения IParagraphFormat.Depth в
0,1,2и3. - Добавьте абзацы в текстовый фрейм и сохраните презентацию.
Этот пример на C# создаёт четырёхуровневый маркированный список:
using System;
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, 200, 200, 400, 200);
var textFrame = shape.TextFrame;
textFrame.Paragraphs.Clear();
var firstParagraph = new Paragraph { Text = "Content" };
firstParagraph.ParagraphFormat.Bullet.Type = BulletType.Symbol;
firstParagraph.ParagraphFormat.Bullet.Char = Convert.ToChar(0x2022);
firstParagraph.ParagraphFormat.DefaultPortionFormat.FillFormat.FillType = FillType.Solid;
firstParagraph.ParagraphFormat.DefaultPortionFormat.FillFormat.SolidFillColor.Color = Color.Black;
firstParagraph.ParagraphFormat.Depth = 0;
var secondParagraph = new Paragraph { Text = "Second level" };
secondParagraph.ParagraphFormat.Bullet.Type = BulletType.Symbol;
secondParagraph.ParagraphFormat.Bullet.Char = '-';
secondParagraph.ParagraphFormat.DefaultPortionFormat.FillFormat.FillType = FillType.Solid;
secondParagraph.ParagraphFormat.DefaultPortionFormat.FillFormat.SolidFillColor.Color = Color.Black;
secondParagraph.ParagraphFormat.Depth = 1;
var thirdParagraph = new Paragraph { Text = "Third level" };
thirdParagraph.ParagraphFormat.Bullet.Type = BulletType.Symbol;
thirdParagraph.ParagraphFormat.Bullet.Char = Convert.ToChar(0x2022);
thirdParagraph.ParagraphFormat.DefaultPortionFormat.FillFormat.FillType = FillType.Solid;
thirdParagraph.ParagraphFormat.DefaultPortionFormat.FillFormat.SolidFillColor.Color = Color.Black;
thirdParagraph.ParagraphFormat.Depth = 2;
var fourthParagraph = new Paragraph { Text = "Fourth level" };
fourthParagraph.ParagraphFormat.Bullet.Type = BulletType.Symbol;
fourthParagraph.ParagraphFormat.Bullet.Char = '-';
fourthParagraph.ParagraphFormat.DefaultPortionFormat.FillFormat.FillType = FillType.Solid;
fourthParagraph.ParagraphFormat.DefaultPortionFormat.FillFormat.SolidFillColor.Color = Color.Black;
fourthParagraph.ParagraphFormat.Depth = 3;
textFrame.Paragraphs.Add(firstParagraph);
textFrame.Paragraphs.Add(secondParagraph);
textFrame.Paragraphs.Add(thirdParagraph);
textFrame.Paragraphs.Add(fourthParagraph);
presentation.Save("multilevel_list.pptx", SaveFormat.Pptx);
Начало нумерованных пунктов списка с пользовательских значений
Используйте IBulletFormat.NumberedBulletStartWith , чтобы задать начальный номер, отображаемый для нумерованного абзаца.
- Создайте Presentation и добавьте IAutoShape на слайд.
- Очистите абзац по умолчанию из текстового фрейма фигуры.
- Создайте три нумерованных абзаца.
- Установите IBulletFormat.NumberedBulletStartWith в
2,3и7для соответствующих абзацев. - Добавьте абзацы в текстовый фрейм и сохраните презентацию.
Этот пример на C# назначает пользовательский начальный номер каждому абзацу:
using Aspose.Slides;
using Aspose.Slides.Export;
using var presentation = new Presentation();
var slide = presentation.Slides[0];
var shape = slide.Shapes.AddAutoShape(ShapeType.Rectangle, 200, 200, 400, 200);
var textFrame = shape.TextFrame;
textFrame.Paragraphs.Clear();
var firstParagraph = new Paragraph { Text = "Start at 2" };
firstParagraph.ParagraphFormat.Bullet.Type = BulletType.Numbered;
firstParagraph.ParagraphFormat.Bullet.NumberedBulletStartWith = 2;
textFrame.Paragraphs.Add(firstParagraph);
var secondParagraph = new Paragraph { Text = "Start at 3" };
secondParagraph.ParagraphFormat.Bullet.Type = BulletType.Numbered;
secondParagraph.ParagraphFormat.Bullet.NumberedBulletStartWith = 3;
textFrame.Paragraphs.Add(secondParagraph);
var thirdParagraph = new Paragraph { Text = "Start at 7" };
thirdParagraph.ParagraphFormat.Bullet.Type = BulletType.Numbered;
thirdParagraph.ParagraphFormat.Bullet.NumberedBulletStartWith = 7;
textFrame.Paragraphs.Add(thirdParagraph);
presentation.Save("custom_numbered_list.pptx", SaveFormat.Pptx);
Управление макетом абзаца и конечными свойствами
Установка отступа первой строки
Используйте свойство IParagraphFormat.Indent , чтобы управлять отступом первой строки абзаца. Это свойство сдвигает только первую строку относительно левого поля абзаца. Положительное значение смещает первую строку вправо, а остальные строки остаются выровненными по телу абзаца.
Используйте IParagraphFormat.MarginLeft , когда нужно переместить весь абзац. Используйте IParagraphFormat.Indent , когда нужно переместить только первую строку.
Пример ниже создаёт несколько абзацев и применяет разные значения IParagraphFormat.Indent , чтобы продемонстрировать, как отступ первой строки влияет на макет абзаца.
- Создайте экземпляр класса Presentation .
- Получите целевой слайд.
- Добавьте прямоугольную IAutoShape на слайд.
- Получите ITextFrame фигуры и удалите абзац по умолчанию.
- Создайте несколько абзацев и задайте им разные значения Indent .
- Добавьте абзацы в текстовый фрейм.
- Сохраните изменённую презентацию.
Этот код показывает, как установить отступ абзаца:
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, 420, 220);
shape.FillFormat.FillType = FillType.NoFill;
shape.LineFormat.FillFormat.FillType = FillType.Solid;
shape.LineFormat.FillFormat.SolidFillColor.Color = Color.Gray;
var textFrame = shape.TextFrame;
textFrame.TextFrameFormat.AutofitType = TextAutofitType.Shape;
textFrame.Paragraphs.Clear();
var firstParagraph = new Paragraph { Text = "No first-line indent. Wrapped lines start at the same position as the first line." };
firstParagraph.ParagraphFormat.DefaultPortionFormat.FillFormat.FillType = FillType.Solid;
firstParagraph.ParagraphFormat.DefaultPortionFormat.FillFormat.SolidFillColor.Color = Color.Black;
firstParagraph.ParagraphFormat.MarginLeft = 20;
firstParagraph.ParagraphFormat.Indent = 0;
var secondParagraph = new Paragraph { Text = "First-line indent of 20 points. The first line moves to the right, while wrapped lines remain aligned to the paragraph body." };
secondParagraph.ParagraphFormat.DefaultPortionFormat.FillFormat.FillType = FillType.Solid;
secondParagraph.ParagraphFormat.DefaultPortionFormat.FillFormat.SolidFillColor.Color = Color.Black;
secondParagraph.ParagraphFormat.MarginLeft = 20;
secondParagraph.ParagraphFormat.Indent = 20;
var thirdParagraph = new Paragraph { Text = "First-line indent of 40 points. This paragraph shows a larger first-line offset to make the effect easier to see." };
thirdParagraph.ParagraphFormat.DefaultPortionFormat.FillFormat.FillType = FillType.Solid;
thirdParagraph.ParagraphFormat.DefaultPortionFormat.FillFormat.SolidFillColor.Color = Color.Black;
thirdParagraph.ParagraphFormat.MarginLeft = 20;
thirdParagraph.ParagraphFormat.Indent = 40;
textFrame.Paragraphs.Add(firstParagraph);
textFrame.Paragraphs.Add(secondParagraph);
textFrame.Paragraphs.Add(thirdParagraph);
presentation.Save("paragraph_indent.pptx", SaveFormat.Pptx);
Результат:

Установка висячего отступа
Висячий отступ — это макет абзаца, при котором первая строка начинается левее остальных строк. В Aspose.Slides вы создаёте этот эффект с помощью свойства IParagraphFormat.Indent . Установите Indent в отрицательное значение, чтобы переместить первую строку влево относительно тела абзаца.
На практике IParagraphFormat.MarginLeft определяет левую позицию тела абзаца, а IParagraphFormat.Indent задаёт позицию первой строки относительно этого поля. Чтобы создать висячий отступ, задайте положительное значение MarginLeft и отрицательное значение Indent.
Это форматирование полезно для библиографий, ссылок, глоссариев и других абзацев, где переносимые строки должны выравниваться по телу абзаца, а не под первым символом первой строки.
- Создайте экземпляр класса Presentation .
- Получите целевой слайд.
- Добавьте прямоугольную IAutoShape на слайд.
- Получите ITextFrame фигуры и удалите абзац по умолчанию.
- Создайте абзацы и задайте каждому положительное значение MarginLeft .
- Установите отрицательное значение Indent , чтобы создать эффект висячего отступа.
- Добавьте абзацы в текстовый фрейм.
- Сохраните изменённую презентацию.
Этот код показывает, как установить висячий отступ для абзаца:
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, 420, 220);
shape.FillFormat.FillType = FillType.NoFill;
shape.LineFormat.FillFormat.FillType = FillType.Solid;
shape.LineFormat.FillFormat.SolidFillColor.Color = Color.Gray;
var textFrame = shape.TextFrame;
textFrame.TextFrameFormat.AutofitType = TextAutofitType.Shape;
textFrame.Paragraphs.Clear();
var firstParagraph = new Paragraph { Text = "A hanging indent is created by combining a positive left margin with a negative indent. The first line starts to the left, while wrapped lines align with the paragraph body." };
firstParagraph.ParagraphFormat.DefaultPortionFormat.FillFormat.FillType = FillType.Solid;
firstParagraph.ParagraphFormat.DefaultPortionFormat.FillFormat.SolidFillColor.Color = Color.Black;
firstParagraph.ParagraphFormat.MarginLeft = 40;
firstParagraph.ParagraphFormat.Indent = -20;
var secondParagraph = new Paragraph { Text = "This second example uses a deeper hanging indent so the difference between the first line and the wrapped lines is easier to compare." };
secondParagraph.ParagraphFormat.DefaultPortionFormat.FillFormat.FillType = FillType.Solid;
secondParagraph.ParagraphFormat.DefaultPortionFormat.FillFormat.SolidFillColor.Color = Color.Black;
secondParagraph.ParagraphFormat.MarginLeft = 60;
secondParagraph.ParagraphFormat.Indent = -30;
textFrame.Paragraphs.Add(firstParagraph);
textFrame.Paragraphs.Add(secondParagraph);
presentation.Save("hanging_indent.pptx", SaveFormat.Pptx);
Результат:

Установка свойств завершающего фрагмента абзаца
Свойство IParagraph.EndParagraphPortionFormat контролирует форматирование знака конца абзаца. В следующем примере задаётся размер шрифта и латинский шрифт для знака конца второго абзаца:
- Загрузите Presentation и получите слайд.
- Добавьте IAutoShape и очистите его абзац по умолчанию.
- Создайте два абзаца и добавьте к ним текстовые фрагменты.
- Создайте PortionFormat для знака конца второго абзаца.
- Задайте IBasePortionFormat.FontHeight и IBasePortionFormat.LatinFont .
- Назначьте формат IParagraph.EndParagraphPortionFormat и сохраните презентацию.
using Aspose.Slides;
using Aspose.Slides.Export;
using var presentation = new Presentation("Test.pptx");
var slide = presentation.Slides[0];
var shape = slide.Shapes.AddAutoShape(ShapeType.Rectangle, 10, 10, 200, 250);
var textFrame = shape.TextFrame;
textFrame.Paragraphs.Clear();
var firstParagraph = new Paragraph();
firstParagraph.Portions.Add(new Portion("Sample text"));
var secondParagraph = new Paragraph();
secondParagraph.Portions.Add(new Portion("Sample text 2"));
var endParagraphFormat = new PortionFormat();
endParagraphFormat.FontHeight = 48;
endParagraphFormat.LatinFont = new FontData("Times New Roman");
secondParagraph.EndParagraphPortionFormat = endParagraphFormat;
textFrame.Paragraphs.Add(firstParagraph);
textFrame.Paragraphs.Add(secondParagraph);
presentation.Save("end_paragraph_format.pptx", SaveFormat.Pptx);
Подсчёт отрисованных строк
Для правил абзаца, влияющих на автоматический перенос и пунктуацию в конце строк, см. Control Line Breaking и Control Hanging Punctuation.
Используйте IParagraph.GetLinesCount для подсчёта строк, занимаемых абзацем после размещения текста, включая автоматический перенос. Это полезно при проверке длины текста и макета в шаблонах презентаций.
Абзац — это один элемент в ITextFrame.Paragraphs, и он может занимать несколько отрисованных строк. Явный разрыв строки внутри абзаца принудительно создаёт новую строку без создания другого абзаца. Автоматический перенос создаёт строки на основе доступной ширины без вставки явных разрывов строк в текст. Поэтому подсчёт абзацев или символов разрыва строк не даёт количества отрисованных строк.
Следующий пример создаёт текстовую фигуру, подсчитывает её строки, сужает фигуру и затем заменяет текст более короткой строкой. Перенос включён, а автоподгонка отключена, так что ширина фигуры управляет переносом без автоматического сжатия текста или изменения размеров фигуры. Размеры фигуры указаны в пунктах. В конце пример добавляет ещё один абзац и суммирует количество строк по всему текстовому фрейму.
using System;
using Aspose.Slides;
using var presentation = new Presentation();
var slide = presentation.Slides[0];
var shape = slide.Shapes.AddAutoShape(ShapeType.Rectangle, 50, 50, 400, 200);
var textFrame = shape.TextFrame;
textFrame.TextFrameFormat.WrapText = NullableBool.True;
textFrame.TextFrameFormat.AutofitType = TextAutofitType.None;
var paragraph = textFrame.Paragraphs[0];
paragraph.ParagraphFormat.DefaultPortionFormat.FontHeight = 20;
paragraph.Text = "This text demonstrates how automatic wrapping changes the number of rendered lines.";
Console.WriteLine($"Original width: {paragraph.GetLinesCount()}");
shape.Width = 150;
Console.WriteLine($"Narrower shape: {paragraph.GetLinesCount()}");
paragraph.Text = "Short text.";
Console.WriteLine($"Shorter text: {paragraph.GetLinesCount()}");
var secondParagraph = new Paragraph { Text = "Another paragraph." };
secondParagraph.ParagraphFormat.DefaultPortionFormat.FontHeight = 20;
textFrame.Paragraphs.Add(secondParagraph);
var totalLineCount = 0;
foreach (var currentParagraph in textFrame.Paragraphs)
{
totalLineCount += currentParagraph.GetLinesCount();
}
Console.WriteLine($"Total lines in the text frame: {totalLineCount}");
При данном тексте и этих размерах сужение фигуры увеличивает количество строк, а замена текста короткой строкой уменьшает его. Точные цифры могут варьироваться в зависимости от наличия шрифтов и их замен, размера шрифта, полей, отступов, переноса и настроек автоподгонки. При проверке шаблона используйте шрифты и параметры макета, предназначенные для целевой среды.
Само количество строк не определяет, выходит ли текст за пределы контейнера. Важно также доступная высота, высота строк, интервалы между абзацами и строками, а также поведение автоподгонки; даже одна строка может превысить доступную ширину при отключённом переносе.
Импорт и экспорт содержимого абзацев
Импорт HTML‑текста в абзацы
Используйте ParagraphCollection.AddFromHtml , чтобы преобразовать разметку HTML в абзацы и фрагменты в текстовом фрейме.
- Создайте экземпляр класса Presentation .
- Получите слайд и добавьте IAutoShape .
- Получите ITextFrame фигуры и очистите её абзац по умолчанию.
- Прочитайте исходный HTML‑файл.
- Передайте строку HTML в ParagraphCollection.AddFromHtml .
- Сохраните изменённую презентацию.
using System.IO;
using Aspose.Slides;
using Aspose.Slides.Export;
using var presentation = new Presentation();
var slide = presentation.Slides[0];
var shapeWidth = presentation.SlideSize.Size.Width - 20;
var shapeHeight = presentation.SlideSize.Size.Height - 20;
var shape = slide.Shapes.AddAutoShape(ShapeType.Rectangle, 10, 10, shapeWidth, shapeHeight);
shape.FillFormat.FillType = FillType.NoFill;
shape.TextFrame.Paragraphs.Clear();
using var reader = new StreamReader("file.html");
var html = reader.ReadToEnd();
shape.TextFrame.Paragraphs.AddFromHtml(html);
presentation.Save("html_text.pptx", SaveFormat.Pptx);
Экспорт текста абзаца в HTML
Используйте ParagraphCollection.ExportToHtml , чтобы экспортировать выбранный диапазон абзацев в HTML.
- Создайте экземпляр класса Presentation и загрузите нужную презентацию.
- Получите слайд и найдите IAutoShape , содержащий текст.
- Получите ITextFrame фигуры.
- Вызовите ParagraphCollection.ExportToHtml с индексом начального абзаца и числом абзацев для экспорта.
- Запишите полученную строку HTML в файл.
using System;
using System.IO;
using System.Text;
using Aspose.Slides;
using var presentation = new Presentation("ExportingHTMLText.pptx");
var shape = presentation.Slides[0].Shapes[0];
if (shape is IAutoShape textShape && textShape.TextFrame != null)
{
var paragraphs = textShape.TextFrame.Paragraphs;
var html = paragraphs.ExportToHtml(0, paragraphs.Count, null);
using var writer = new StreamWriter("paragraphs.html", false, Encoding.UTF8);
writer.Write(html);
}
else
{
Console.WriteLine("The first shape is not a text shape.");
}
Отрисовка абзаца как изображения
IParagraph.GetImage напрямую отрисовывает отдельный абзац и возвращает IImage . Сохраните результат в файл или поток с помощью IImage.Save . Нет необходимости отрисовывать содержащую фигуру или вручную обрезать bitmap.
IParagraph.GetImage может вернуть null, если абзац не найден в родительской коллекции, не имеет корректных границ отрисовки или не может быть отрисован. Проверьте результат перед сохранением и освободите полученное изображение после использования.
Отрисовка абзаца в масштабе по умолчанию
Предположим, у нас есть файл презентации sample.pptx с одним слайдом, где первая фигура — это текстовое поле, содержащее три абзаца.

В следующем примере отрисовывается второй абзац в обычной текстовой фигуре в масштабе по умолчанию и сохраняется полученное изображение в формате PNG. Объявление using гарантирует правильное освобождение изображения.
using System;
using Aspose.Slides;
using var presentation = new Presentation("sample.pptx");
var shape = presentation.Slides[0].Shapes[0];
if (shape is IAutoShape textShape &&
textShape.TextFrame != null &&
textShape.TextFrame.Paragraphs.Count > 1)
{
var paragraph = textShape.TextFrame.Paragraphs[1];
using var paragraphImage = paragraph.GetImage();
if (paragraphImage != null)
{
paragraphImage.Save("paragraph.png", ImageFormat.Png);
}
else
{
Console.WriteLine("The paragraph could not be rendered.");
}
}
else
{
Console.WriteLine("The expected text shape or paragraph was not found.");
}
Результат:

Отрисовка абзаца в ячейке таблицы с масштабированием
Используйте перегрузку IParagraph.GetImage , принимающую параметры float scaleX и float scaleY, чтобы задать горизонтальные и вертикальные коэффициенты масштабирования. В следующем примере создаётся таблица, абзац в её первой ячейке отрисовывается в два раза шире и выше по сравнению с масштабом по умолчанию, и результат сохраняется как PNG‑изображение.
using System;
using Aspose.Slides;
var scaleX = 2f;
var scaleY = 2f;
using var presentation = new Presentation();
var slide = presentation.Slides[0];
var table = slide.Shapes.AddTable(50, 50, new[] { 300d }, new[] { 80d });
var paragraph = table[0, 0].TextFrame.Paragraphs[0];
paragraph.Text = "Text in a table cell";
using var paragraphImage = paragraph.GetImage(scaleX, scaleY);
if (paragraphImage != null)
{
paragraphImage.Save("table_paragraph.png", ImageFormat.Png);
}
else
{
Console.WriteLine("The paragraph could not be rendered.");
}
Коэффициент масштаба 1 сохраняет размер оси в пикселях по умолчанию. Например, 2 для обеих осей создаёт изображение, чья ширина и высота примерно в два раза больше стандартных, что даёт в четыре раза больше пикселей. Большие коэффициенты обычно дают более чёткий текст при увеличении или выводе в высоком разрешении, но также увеличивают использование памяти и размер файла. Коэффициенты ниже 1 дают меньшие изображения с меньшим детализацией. Используйте одинаковые коэффициенты, чтобы сохранить соотношение сторон абзаца; разные горизонтальные и вертикальные коэффициенты растягивают вывод независимо.
Отрисовка всей фигуры с помощью IShape.GetImage остаётся полезной, когда вывод должен включать заливку, контур или другой визуальный контекст фигуры. Для изображения только абзаца используйте IParagraph.GetImage .
FAQ
Могу ли я полностью отключить перенос строк внутри текстового фрейма?
Да. Установите ITextFrameFormat.WrapText , чтобы отключить перенос, и строки не будут разрываться у краёв текстового фрейма.
Как получить точные границы конкретного абзаца на слайде?
Используйте IParagraph.GetRect , чтобы получить ограничивающий прямоугольник абзаца. IPortion.GetRect предоставляет границы отдельного фрагмента.
Где контролируется выравнивание абзаца (по левому, правому краю, по центру или по ширине)?
IParagraphFormat.Alignment — это настройка уровня абзаца и применяется ко всему абзацу независимо от форматирования отдельных фрагментов. Для вертикального выравнивания фрагментов разного размера шрифта в каждой строке см. Align Fonts Within a Line.
Можно ли задать язык проверки правописания только для части абзаца?
Да. Установите IBasePortionFormat.LanguageId для отдельных фрагментов, чтобы один абзац мог содержать текст на нескольких языках.