Trabajar con párrafos
Un párrafo es un conjunto de caracteres combinados en un bloque lógico y que termina con un carácter especial: un salto de párrafo. En Aspose.Words, un párrafo está representado por la clase Paragraph.
Insertar un párrafo
Para insertar un nuevo párrafo en el documento, de hecho, debe insertar un carácter de salto de párrafo en él. DocumentBuilder.Writeln inserta no sólo una cadena de texto en el documento, sino que también agrega un salto de párrafo.
El formato de fuente actual también lo especifica la propiedad Font, y el formato de párrafo actual lo determina la propiedad ParagraphFormat. En la siguiente sección, entraremos en más detalles sobre el formato de párrafo.
El siguiente ejemplo de código muestra cómo insertar un párrafo en un documento:
// For complete examples and data files, please go to https://github.com/aspose-words/Aspose.Words-for-.NET | |
// The path to the documents directory. | |
string dataDir = RunExamples.GetDataDir_WorkingWithDocument(); | |
// Initialize document. | |
Document doc = new Document(); | |
DocumentBuilder builder = new DocumentBuilder(doc); | |
// Specify font formatting | |
Font font = builder.Font; | |
font.Size = 16; | |
font.Bold = true; | |
font.Color = System.Drawing.Color.Blue; | |
font.Name = "Arial"; | |
font.Underline = Underline.Dash; | |
// Specify paragraph formatting | |
ParagraphFormat paragraphFormat = builder.ParagraphFormat; | |
paragraphFormat.FirstLineIndent = 8; | |
paragraphFormat.Alignment = ParagraphAlignment.Justify; | |
paragraphFormat.KeepTogether = true; | |
builder.Writeln("A whole paragraph."); | |
dataDir = dataDir + "DocumentBuilderInsertParagraph_out.doc"; | |
doc.Save(dataDir); |
Dar formato al párrafo
El formato de párrafo actual está representado por el objeto ParagraphFormat devuelto por la propiedad ParagraphFormat. Este objeto encapsula varias propiedades de formato de párrafo disponibles en Microsoft Word. Puede restablecer fácilmente el formato predeterminado de un párrafo (estilo normal, alineado a la izquierda, sin sangría, sin espaciado, sin bordes, sin sombreado) llamando a ClearFormatting.
El siguiente ejemplo de código muestra cómo configurar el formato de párrafo:
// For complete examples and data files, please go to https://github.com/aspose-words/Aspose.Words-for-.NET | |
Document doc = new Document(); | |
DocumentBuilder builder = new DocumentBuilder(doc); | |
// Set paragraph formatting properties | |
ParagraphFormat paragraphFormat = builder.ParagraphFormat; | |
paragraphFormat.Alignment = ParagraphAlignment.Center; | |
paragraphFormat.LeftIndent = 50; | |
paragraphFormat.RightIndent = 50; | |
paragraphFormat.SpaceAfter = 25; | |
// Output text | |
builder.Writeln("I'm a very nice formatted paragraph. I'm intended to demonstrate how the left and right indents affect word wrapping."); | |
builder.Writeln("I'm another nice formatted paragraph. I'm intended to demonstrate how the space after paragraph looks like."); | |
dataDir = dataDir + "DocumentBuilderSetParagraphFormatting_out.doc"; | |
doc.Save(dataDir); |
Aplicar estilo de párrafo
Algunos objetos de formato, como Font o ParagraphFormat, admiten estilos. Un estilo integrado o definido por el usuario está representado por un objeto Style, que contiene las propiedades de estilo apropiadas como nombre, estilo base, fuente, formato de párrafo de estilo, etc.
Además, el objeto Style expone la propiedad StyleIdentifier, que devuelve el identificador de estilo independiente de la configuración regional representado por el valor de enumeración StyleIdentifier. El hecho es que los nombres de los estilos integrados en Microsoft Word están traducidos a diferentes idiomas. Con el identificador de estilo, puede encontrar el estilo correcto independientemente del idioma del documento. Los valores de enumeración corresponden a los estilos Microsoft Word integrados, como Normal, Encabezado 1, Encabezado 2, etc. Todos los estilos definidos por el usuario se establecen en el valor de enumeración StyleIdentifier.User.
El siguiente ejemplo de código muestra cómo aplicar un estilo de párrafo:
// For complete examples and data files, please go to https://github.com/aspose-words/Aspose.Words-for-.NET | |
Document doc = new Document(); | |
DocumentBuilder builder = new DocumentBuilder(doc); | |
// Set paragraph style | |
builder.ParagraphFormat.StyleIdentifier = StyleIdentifier.Title; | |
builder.Write("Hello"); | |
dataDir = dataDir + "DocumentBuilderApplyParagraphStyle_out.doc"; | |
doc.Save(dataDir); |
Insertar separador de estilos para colocar diferentes estilos de párrafo
Se puede agregar un separador de estilo al final de un párrafo usando el método abreviado de teclado Ctrl+Alt+Enter en Microsoft Word. Esta característica le permite utilizar dos estilos de párrafo diferentes en el mismo párrafo impreso lógico. Si desea que aparezca algún texto del principio de un encabezado en particular en la tabla de contenido, pero no desea que se muestre el encabezado completo en la tabla de contenido, puede usar esta función.
El siguiente ejemplo de código muestra cómo insertar un separador de estilo para dar cabida a diferentes estilos de párrafo:
// For complete examples and data files, please go to https://github.com/aspose-words/Aspose.Words-for-.NET | |
Document doc = new Document(); | |
DocumentBuilder builder = new DocumentBuilder(doc); | |
Style paraStyle = builder.Document.Styles.Add(StyleType.Paragraph, "MyParaStyle"); | |
paraStyle.Font.Bold = false; | |
paraStyle.Font.Size = 8; | |
paraStyle.Font.Name = "Arial"; | |
// Append text with "Heading 1" style. | |
builder.ParagraphFormat.StyleIdentifier = StyleIdentifier.Heading1; | |
builder.Write("Heading 1"); | |
builder.InsertStyleSeparator(); | |
// Append text with another style. | |
builder.ParagraphFormat.StyleName = paraStyle.Name; | |
builder.Write("This is text with some other formatting "); | |
dataDir = dataDir + "InsertStyleSeparator_out.doc"; | |
// Save the document to disk. | |
doc.Save(dataDir); |
Identificar el separador de estilo de párrafo
Aspose.Words expone la propiedad pública BreakIsStyleSeparator en la clase Paragraph
para identificar un párrafo con un separador de estilo, como se muestra en el siguiente ejemplo:
// For complete examples and data files, please go to https://github.com/aspose-words/Aspose.Words-for-.NET | |
// The path to the documents directory. | |
string dataDir = RunExamples.GetDataDir_RenderingAndPrinting(); | |
// Initialize document. | |
string fileName = "TestFile.doc"; | |
Document doc = new Document(dataDir + fileName); | |
foreach (Paragraph paragraph in doc.GetChildNodes(NodeType.Paragraph, true)) | |
{ | |
if (paragraph.BreakIsStyleSeparator) | |
{ | |
Console.WriteLine("Separator Found!"); | |
} | |
} |
Aplicar bordes y sombreado a un párrafo
Los bordes en Aspose.Words están representados por la clase BorderCollection: se trata de una colección de objetos Border a los que se accede por índice o por tipo de borde. El tipo de borde, a su vez, está representado por la enumeración BorderType. Algunos valores de enumeración se aplican a varios o solo a un elemento del documento. Por ejemplo, BorderType.Bottom se aplica a un párrafo o celda de una tabla, mientras que BorderType.DiagonalDown especifica un borde diagonal solo en una celda de la tabla.
Tanto la colección de bordes como cada borde por separado tienen atributos similares, como color, estilo de línea, ancho de línea, distancia desde el texto y sombra opcional. Están representados por propiedades del mismo nombre. Puede obtener diferentes tipos de bordes combinando valores de propiedades. Además, los objetos BorderCollection y Border le permiten restablecer estos valores a sus valores predeterminados llamando al método ClearFormatting.
Aspose.Words también tiene la clase Shading que contiene atributos de sombreado para los elementos del documento. Puede establecer la textura de sombreado deseada y los colores que se aplican al fondo y al primer plano de un elemento utilizando el valor de enumeración TextureIndex. TextureIndex también le permite aplicar diferentes patrones al objeto Shading. Por ejemplo, para establecer el color de fondo de un elemento del documento, utilice el valor TextureIndex.TextureSolid y establezca el color de sombreado de primer plano según corresponda.
El siguiente ejemplo de código muestra cómo aplicar bordes y sombreado a un párrafo:
// For complete examples and data files, please go to https://github.com/aspose-words/Aspose.Words-for-.NET | |
Document doc = new Document(); | |
DocumentBuilder builder = new DocumentBuilder(doc); | |
// Set paragraph borders | |
BorderCollection borders = builder.ParagraphFormat.Borders; | |
borders.DistanceFromText = 20; | |
borders[BorderType.Left].LineStyle = LineStyle.Double; | |
borders[BorderType.Right].LineStyle = LineStyle.Double; | |
borders[BorderType.Top].LineStyle = LineStyle.Double; | |
borders[BorderType.Bottom].LineStyle = LineStyle.Double; | |
// Set paragraph shading | |
Shading shading = builder.ParagraphFormat.Shading; | |
shading.Texture = TextureIndex.TextureDiagonalCross; | |
shading.BackgroundPatternColor = System.Drawing.Color.LightCoral; | |
shading.ForegroundPatternColor = System.Drawing.Color.LightSalmon; | |
builder.Write("I'm a formatted paragraph with double border and nice shading."); | |
dataDir = dataDir + "DocumentBuilderApplyBordersAndShadingToParagraph_out.doc"; | |
doc.Save(dataDir); |
Contar líneas de párrafo
Si desea contar el número de líneas de un párrafo de cualquier documento de Word, puede utilizar el siguiente ejemplo de código:
// The path to the documents directory. | |
string dataDir = RunExamples.GetDataDir_WorkingWithDocument(); | |
string fileName = "Properties.doc"; | |
Document document = new Document(dataDir + fileName); | |
var collector = new LayoutCollector(document); | |
var it = new LayoutEnumerator(document); | |
foreach (Paragraph paragraph in document.GetChildNodes(NodeType.Paragraph, true)) | |
{ | |
var paraBreak = collector.GetEntity(paragraph); | |
object stop = null; | |
var prevItem = paragraph.PreviousSibling; | |
if (prevItem != null) | |
{ | |
var prevBreak = collector.GetEntity(prevItem); | |
if (prevItem is Paragraph) | |
{ | |
it.Current = collector.GetEntity(prevItem); // para break | |
it.MoveParent(); // last line | |
stop = it.Current; | |
} | |
else if (prevItem is Table) | |
{ | |
var table = (Table)prevItem; | |
it.Current = collector.GetEntity(table.LastRow.LastCell.LastParagraph); // cell break | |
it.MoveParent(); // cell | |
it.MoveParent(); // row | |
stop = it.Current; | |
} | |
else | |
{ | |
throw new Exception(); | |
} | |
} | |
it.Current = paraBreak; | |
it.MoveParent(); | |
// We move from line to line in a paragraph. | |
// When paragraph spans multiple pages the we will follow across them. | |
var count = 1; | |
while (it.Current != stop) | |
{ | |
if (!it.MovePreviousLogical()) | |
break; | |
count++; | |
} | |
const int MAX_CHARS = 16; | |
var paraText = paragraph.GetText(); | |
if (paraText.Length > MAX_CHARS) | |
paraText = $"{paraText.Substring(0, MAX_CHARS)}..."; | |
Console.WriteLine($"Paragraph '{paraText}' has {count} line(-s)."); | |
} |