Gerenciar Listas com Marcadores e Numeradas em Apresentações no .NET
Visão geral
Aspose.Slides for .NET permite criar e formatar listas com marcadores e numeradas em apresentações PowerPoint e OpenDocument. Um item de lista é um parágrafo cujas configurações de marcador são controladas por seu formato de parágrafo.
Use a propriedade IParagraph.ParagraphFormat para acessar as configurações de lista no nível do parágrafo. O ponto de entrada principal é IParagraphFormat.Bullet, que devolve um objeto IBulletFormat. Com esse objeto, você pode definir o tipo de marcador, símbolo, imagem, cor, tamanho, estilo de numeração e número inicial.
Este artigo mostra como:
- criar uma lista com marcadores usando um símbolo personalizado
- criar um marcador de imagem
- criar uma lista multinível definindo a profundidade do parágrafo
- criar uma lista numerada
- examinar e alterar a formatação de lista em uma apresentação existente
- ler os marcadores e números reais da lista ao lado do texto do parágrafo
Criar uma lista com marcadores
Para criar uma lista com marcadores, adicione objetos IParagraph a um ITextFrame e defina IBulletFormat.Type como BulletType.Symbol. Você pode então definir IBulletFormat.Char, IBulletFormat.Color e IBulletFormat.Height para controlar a aparência do marcador.
O código C# a seguir demonstra como criar uma lista com marcadores em um slide:
using System.Drawing;
using Aspose.Slides;
using Aspose.Slides.Export;
static Paragraph CreateParagraph(string text)
{
var paragraph = new Paragraph();
paragraph.ParagraphFormat.Bullet.Type = BulletType.Symbol;
paragraph.ParagraphFormat.Bullet.Char = '*';
paragraph.ParagraphFormat.Indent = 15;
paragraph.ParagraphFormat.Bullet.IsBulletHardColor = NullableBool.True;
paragraph.ParagraphFormat.Bullet.Color.Color = Color.IndianRed;
paragraph.ParagraphFormat.Bullet.Height = 100;
paragraph.Text = text;
return paragraph;
}
using var presentation = new Presentation();
var slide = presentation.Slides[0];
var autoShape = slide.Shapes.AddAutoShape(ShapeType.Rectangle, 20, 20, 200, 50);
var textFrame = autoShape.TextFrame;
textFrame.Paragraphs.Clear();
var paragraph1 = CreateParagraph("The first paragraph");
textFrame.Paragraphs.Add(paragraph1);
var paragraph2 = CreateParagraph("The second paragraph");
textFrame.Paragraphs.Add(paragraph2);
presentation.Save("symbol_bullets.pptx", SaveFormat.Pptx);
O resultado:

Criar uma lista numerada
Use listas numeradas quando a ordem dos itens for importante. Defina IBulletFormat.Type como BulletType.Numbered. Você também pode escolher um formato de numeração com IBulletFormat.NumberedBulletStyle ou definir IBulletFormat.NumberedBulletStartWith quando a lista deve iniciar a partir de um valor diferente de 1.
O código C# a seguir mostra como criar uma lista numerada em um slide:
using Aspose.Slides;
using Aspose.Slides.Export;
using var presentation = new Presentation();
var slide = presentation.Slides[0];
var autoShape = slide.Shapes.AddAutoShape(ShapeType.Rectangle, 20, 20, 90, 80);
var textFrame = autoShape.TextFrame;
textFrame.Paragraphs.Clear();
var paragraph1 = new Paragraph();
paragraph1.ParagraphFormat.Bullet.Type = BulletType.Numbered;
paragraph1.Text = "Apple";
textFrame.Paragraphs.Add(paragraph1);
var paragraph2 = new Paragraph();
paragraph2.ParagraphFormat.Bullet.Type = BulletType.Numbered;
paragraph2.Text = "Orange";
textFrame.Paragraphs.Add(paragraph2);
var paragraph3 = new Paragraph();
paragraph3.ParagraphFormat.Bullet.Type = BulletType.Numbered;
paragraph3.Text = "Banana";
textFrame.Paragraphs.Add(paragraph3);
presentation.Save("numbered_bullets.pptx", SaveFormat.Pptx);
O resultado:

Criar um marcador de imagem
Aspose.Slides permite substituir um símbolo de marcador padrão por uma imagem. Marcadores de imagem funcionam melhor com imagens simples que permanecem legíveis em tamanho pequeno, como ícones ou arquivos PNG transparentes pequenos.
Note
Idealmente, se você pretende substituir o símbolo de marcador padrão por uma imagem, é melhor escolher um gráfico simples com fundo transparente. Esse tipo de imagem funciona bem como símbolo de marcador personalizado.
Considere que a imagem será reduzida para um tamanho muito pequeno. Por esse motivo, recomendamos fortemente selecionar uma imagem que continue clara e visualmente eficaz quando usada como marcador em uma lista.
Para criar um marcador de imagem, adicione uma imagem a Presentation.Images e atribua o objeto de imagem retornado a IBulletFormat.Picture. Defina IBulletFormat.Type como BulletType.Picture antes de atribuir a imagem.
Suponha que tenhamos um “image.png”:

O código C# a seguir mostra como criar marcadores de imagem em um slide:
using Aspose.Slides;
using Aspose.Slides.Export;
static Paragraph CreateParagraph(string text, IPPImage image)
{
var paragraph = new Paragraph();
paragraph.ParagraphFormat.Bullet.Type = BulletType.Picture;
paragraph.ParagraphFormat.Bullet.Picture.Image = image;
paragraph.ParagraphFormat.Indent = 15;
paragraph.ParagraphFormat.Bullet.Height = 100;
paragraph.Text = text;
return paragraph;
}
using var presentation = new Presentation();
var slide = presentation.Slides[0];
var autoShape = slide.Shapes.AddAutoShape(ShapeType.Rectangle, 20, 20, 200, 50);
var textFrame = autoShape.TextFrame;
textFrame.Paragraphs.Clear();
var imageBytes = File.ReadAllBytes("image.png");
var bulletImage = presentation.Images.AddImage(imageBytes);
var paragraph1 = CreateParagraph("The first paragraph", bulletImage);
textFrame.Paragraphs.Add(paragraph1);
var paragraph2 = CreateParagraph("The second paragraph", bulletImage);
textFrame.Paragraphs.Add(paragraph2);
presentation.Save("picture_bullets.pptx", SaveFormat.Pptx);
O resultado:

Criar uma lista multinível
Use IParagraphFormat.Depth para colocar itens de lista em diferentes níveis. O nível 0 é o nível superior, o nível 1 está aninhado abaixo dele e assim sucessivamente.
O código C# a seguir mostra como criar uma lista com marcadores multinível:
using Aspose.Slides;
using Aspose.Slides.Export;
using var presentation = new Presentation();
var slide = presentation.Slides[0];
var autoShape = slide.Shapes.AddAutoShape(ShapeType.Rectangle, 20, 20, 260, 110);
var textFrame = autoShape.TextFrame;
textFrame.Paragraphs.Clear();
var paragraph1 = new Paragraph();
paragraph1.ParagraphFormat.Depth = 0;
paragraph1.Text = "My text - Depth 0";
textFrame.Paragraphs.Add(paragraph1);
var paragraph2 = new Paragraph();
paragraph2.ParagraphFormat.Depth = 1;
paragraph2.Text = "My text - Depth 1";
textFrame.Paragraphs.Add(paragraph2);
var paragraph3 = new Paragraph();
paragraph3.ParagraphFormat.Depth = 2;
paragraph3.Text = "My text - Depth 2";
textFrame.Paragraphs.Add(paragraph3);
var paragraph4 = new Paragraph();
paragraph4.ParagraphFormat.Depth = 3;
paragraph4.Text = "My text - Depth 3";
textFrame.Paragraphs.Add(paragraph4);
presentation.Save("multilevel_bullets.pptx", SaveFormat.Pptx);
O resultado:

Alterar uma lista existente
Para alterar a formatação de lista em uma apresentação existente, acesse o parágrafo alvo e atualize suas configurações IParagraphFormat.Bullet. As mesmas propriedades usadas para criar listas podem ser usadas para examinar ou modificar listas carregadas de um arquivo PPT, PPTX ou ODP.
O código C# a seguir altera o primeiro parágrafo em um quadro de texto para usar um estilo de lista numerada:
using Aspose.Slides;
using Aspose.Slides.Export;
using var presentation = new Presentation("input.pptx");
var slide = presentation.Slides[0];
var autoShape = (IAutoShape)slide.Shapes[0];
var paragraph = autoShape.TextFrame.Paragraphs[0];
paragraph.ParagraphFormat.Bullet.Type = BulletType.Numbered;
paragraph.ParagraphFormat.Bullet.NumberedBulletStyle = NumberedBulletStyle.BulletRomanUCPeriod;
paragraph.ParagraphFormat.Bullet.NumberedBulletStartWith = 1;
paragraph.ParagraphFormat.MarginLeft = 30;
paragraph.ParagraphFormat.Indent = -20;
presentation.Save("updated_list.pptx", SaveFormat.Pptx);
Ler valores reais de marcadores
Ao extrair o conteúdo de uma apresentação, mantenha os marcadores da lista ao lado do texto do parágrafo. Chame IParagraphFormat.GetEffective e acesse IParagraphFormatEffectiveData.Bullet para obter o formato de marcador efetivo. Verifique seu Type antes de ler ActualBulletValue.
Para listas numeradas, diferencie estes três valores:
- NumberedBulletStyle determina o formato, como números arábicos seguidos por ponto ou letras minúsculas seguidas por ponto.
- NumberedBulletStartWith especifica o número inicial para um grupo de parágrafos numerados.
- ActualBulletValue devolve o marcador formatado para um parágrafo específico. Por exemplo, o segundo item em uma lista que começa em 5 devolve
6..
Preserve Depth em cada parágrafo para manter seu nível de aninhamento. O marcador real não codifica toda a hierarquia: um item aninhado pode devolver c. em vez de um rótulo combinado como 6.c..
O exemplo autocontido a seguir cria listas, salva‑as em uma apresentação e recarrega a apresentação para relatar o texto, profundidade, tipo de marcador e valor real de cada parágrafo. O pequeno marcador de imagem azul é criado a partir de SVG embutido.
using System;
using System.Drawing;
using Aspose.Slides;
using Aspose.Slides.Export;
using (var presentation = new Presentation())
{
presentation.SlideSize.SetSize(720, 440, SlideSizeScaleType.DoNotScale);
var slide = presentation.Slides[0];
var shape = slide.Shapes.AddAutoShape(ShapeType.Rectangle, 30, 20, 660, 400);
shape.FillFormat.FillType = FillType.NoFill;
shape.LineFormat.FillFormat.FillType = FillType.NoFill;
var textFrame = shape.TextFrame;
textFrame.Paragraphs.Clear();
// Criar um marcador de imagem sem um arquivo de imagem externo.
var svg = new SvgImage("<svg xmlns='http://www.w3.org/2000/svg' width='16' height='16'><rect width='16' height='16' rx='4' fill='#0078D4'/></svg>");
var bulletImage = presentation.Images.AddImage(svg);
void AddParagraph(string text, short depth, BulletType type, short start = 1, NumberedBulletStyle style = NumberedBulletStyle.BulletArabicPeriod)
{
var paragraph = new Paragraph { Text = text };
var format = paragraph.ParagraphFormat;
format.Depth = depth;
format.MarginLeft = 30 + depth * 40;
format.Indent = -28;
format.SpaceAfter = 8;
format.DefaultPortionFormat.FontHeight = 22;
format.DefaultPortionFormat.FillFormat.FillType = FillType.Solid;
format.DefaultPortionFormat.FillFormat.SolidFillColor.Color = Color.Black;
format.Bullet.Type = type;
format.Bullet.IsBulletHardColor = NullableBool.True;
format.Bullet.Color.Color = Color.Black;
if (type == BulletType.Numbered)
{
format.Bullet.NumberedBulletStyle = style;
format.Bullet.NumberedBulletStartWith = start;
}
else if (type == BulletType.Symbol)
{
format.Bullet.Char = '\u2022';
}
else if (type == BulletType.Picture)
{
format.Bullet.Picture.Image = bulletImage;
}
textFrame.Paragraphs.Add(paragraph);
}
AddParagraph("First item", 0, BulletType.Numbered, 5);
AddParagraph("Second item", 0, BulletType.Numbered, 5);
AddParagraph("Nested item", 1, BulletType.Numbered, 3, NumberedBulletStyle.BulletAlphaLCPeriod);
AddParagraph("Next nested item", 1, BulletType.Numbered, 3, NumberedBulletStyle.BulletAlphaLCPeriod);
AddParagraph("Deep item", 2, BulletType.Numbered, 4, NumberedBulletStyle.BulletRomanLCPeriod);
AddParagraph("Back to top level", 0, BulletType.Numbered, 5);
AddParagraph("Symbol marker", 0, BulletType.Symbol);
AddParagraph("No bullet", 0, BulletType.None);
AddParagraph("Picture marker", 0, BulletType.Picture);
presentation.Save("actual_bullet_values.pptx", SaveFormat.Pptx);
}
using var loadedPresentation = new Presentation("actual_bullet_values.pptx");
var loadedShape = (IAutoShape)loadedPresentation.Slides[0].Shapes[0];
Console.WriteLine("Text | Depth | Type | Actual value");
foreach (var paragraph in loadedShape.TextFrame.Paragraphs)
{
var bullet = paragraph.ParagraphFormat.GetEffective().Bullet;
string marker;
switch (bullet.Type)
{
case BulletType.Numbered:
case BulletType.Symbol:
marker = bullet.ActualBulletValue;
break;
case BulletType.None:
marker = $"{bullet.ActualBulletValue ?? "null"} (no bullet)";
break;
case BulletType.Picture:
marker = $"{bullet.ActualBulletValue ?? "null"} (image required)";
break;
default:
marker = "unsupported bullet type";
break;
}
Console.WriteLine($"{paragraph.Text} | {paragraph.ParagraphFormat.Depth} | {bullet.Type} | {marker}");
}
As listas de origem são mostradas abaixo.

O relatório corresponde aos marcadores exibidos no PowerPoint:
Text | Depth | Type | Actual value
First item | 0 | Numbered | 5.
Second item | 0 | Numbered | 6.
Nested item | 1 | Numbered | c.
Next nested item | 1 | Numbered | d.
Deep item | 2 | Numbered | iv.
Back to top level | 0 | Numbered | 7.
Symbol marker | 0 | Symbol | •
No bullet | 0 | None | null (no bullet)
Picture marker | 0 | Picture | null (image required)
Para BulletType.None and BulletType.Picture, ActualBulletValue devolve null, não uma string vazia. Trate esses tipos separadamente: o primeiro não possui marcador, enquanto o segundo requer a extração da imagem do marcador separadamente. Um marcador de imagem não pode ser reproduzido apenas extraindo um marcador de texto.
Perguntas frequentes
É possível exportar listas com marcadores e numeradas para PDF ou imagens?
Sim. Aspose.Slides preserva a formatação da lista quando o formato de destino suporta o layout de texto e os recursos de marcador correspondentes.
Posso editar listas em apresentações existentes?
Sim. Carregue a apresentação, acesse o parágrafo alvo, examine ou atualize suas configurações IParagraphFormat.Bullet e salve a apresentação.
As listas podem conter texto não‑latino?
Sim. O texto dos itens de lista pode conter caracteres Unicode, permitindo criar listas em apresentações multilíngues. Certifique‑se de que as fontes usadas na apresentação suportam os caracteres necessários.