O

ourdaneta

Usuario (Venezuela)

Primer post: 16 jul 2012Último post: 16 jul 2012
1
Posts
0
Puntos totales
0
Comentarios
I
Imprimir Texto Justificado .Net (C#)
Ciencia EducacionporAnónimo7/16/2012

Saludos a la comunidad, este es mi primer post y va dedicado a los programadores de .Net, lo hice porque se me presento la necesidad de generar un reporte utilizando PrintDocument que imprima el texto justificado (como una carta de Microsoft Word) y esta clase no cuenta con ningun metodo que permita realizar esta tarea tan comun, ademas, navegando en internet en busca de esta solucion me encontre que está solicitada por un gran numero de personas y aun no se ha publicado una respuesta concreta, en fin, aca les dejo del codigo en C# using System.Windows.Forms; using System.Drawing; using System; namespace WindowsFormsApplication { public partial class Form1 : Form { public Form1() { this.InitializeComponent(); } private void Boton_Click(object sender, System.EventArgs e) { Font Fuente = new Font("Arial", 10, FontStyle.Bold | FontStyle.Italic | FontStyle.Underline); string Texto = "Esta es la cadena de caracteres que se desea imprimir de forma justificada en todo el " + "formulario sin importar el tipo de fuente ni el tamaño que esta tenga establecido, son varias " + "lineas que deben ser impresas pero al metodo solo se le debe pasar la posicion inicial y el ancho " + "que debe tener la impresion, este debe encargarse de realizar todos los calculos correspondientes."; this.PrintTextJustify(Texto, Fuente, 10, 10, 400); } private string[] ExtractWords(string Text) { // Variables locales. bool Margin = true; int i = 0, WordCount = 0; string[] Words = null; string Word = ""; char Character; // Recorre la cadena de caracteres. while (i < Text.Length) { // Toma un caracter. Character = Text; // Si el caracter es un deliminador y ya paso el margen. if (this.IsDelimiterChar(Character) && !Margin) { // Si la palabra no esta vacia la toma. if (Word != string.Empty) { WordCount++; Array.Resize<string>(ref Words, WordCount); Words[WordCount - 1] = Word; Word = ""; } } else { // Agrega el caracter a la palabra. Word += Character; // Ya no es parte del margen. if (Margin) Margin = false; } i++; } // Si la palabra no esta vacia la toma. if (Word != string.Empty) { WordCount++; Array.Resize<string>(ref Words, WordCount); Words[WordCount - 1] = Word; } return Words; } // Devuelve verdadero si el caracter indicado es un delimitador de palabra. private bool IsDelimiterChar(char Character) { bool IsDelimiter = false; char[] Delimiters = new char[] { 'n', 't', ' ' }; for (int i = 0; i < Delimiters.Length; i++) { if (Character == Delimiters) IsDelimiter = true; } return IsDelimiter; } private void PrintTextJustify(string Text, Font TextFont, float x, float y, int Width) { // Variables locales. int Index = 0, WordCount = 0; float InternalSpaceWidth, SpaceWidth, WordWidth, TotalWordsWidth = 0F, XPos, FontHeight = TextFont.GetHeight(); string[] Words, Aux; string Word; Graphics g = this.CreateGraphics(); float k; // Tamaño del espacio entre caracteres. SpaceWidth = g.MeasureString(" ", TextFont).Width; // Extrae las palabras a un arreglo. Words = this.ExtractWords(Text); // Ciclo principal. while (Index < Words.Length) { // Toma el ancho de la siguiente palabra. WordWidth = g.MeasureString(Words, TextFont).Width; if (TotalWordsWidth + WordWidth + (WordCount * SpaceWidth) > Width) { if (Index == 0) { MessageBox.Show("La palabra mas corta supera el ancho establecido", "Internal", MessageBoxButtons.OK, MessageBoxIcon.Information); return; } InternalSpaceWidth = (Width - TotalWordsWidth) / (WordCount - 1); k = (InternalSpaceWidth * (WordCount - 1)) + TotalWordsWidth; // Imprime cada palabra donde corresponde. XPos = x; for (int i = 0; i < Index; i++) { Word = Words; g.DrawString(Word, TextFont, Brushes.Black, XPos, y); XPos += g.MeasureString(Word, TextFont).Width + InternalSpaceWidth; } // Quita la linea que se imprimio del arreglo. Aux = null; WordCount = 1; for (int i = Index; i < Words.Length; i++, WordCount++) { Array.Resize<string>(ref Aux, WordCount); Aux[Aux.Length - 1] = Words; } Words = new string[Aux.Length]; Aux.CopyTo(Words, 0); // Incrementa Y. y += TextFont.Height; // Inicializa la linea y el indice. Index = 0; TotalWordsWidth = 0; WordCount = 0; } else { TotalWordsWidth += WordWidth; WordCount++; Index++; } } // Imprime la ultima linea. if (Words.Length > 0) { XPos = x; for (int i = 0; i < Words.Length; i++) { Word = Words; g.DrawString(Word, TextFont, Brushes.Black, XPos, y); XPos += g.MeasureString(Word, TextFont).Width + SpaceWidth; } } } } } Este ejemplo imprime el texto justificado sobre un WindowsForm, para hacerlo por impresora agregen un parametro tipo Graphics al metodo PrintTextJustify y pasen alli el objeto Graphics con el que estan realizando la impresion, por supuesto, deben quitar la linea donde se crea el objeto Graphics del formulario. Espero les sea de mucha ayuda. Oscar E. Urdaneta Analista Programador Occidental de Aduanas, C.A. Hapag Lloyds Agents.

0
2
PosteameloArchivo Histórico de Taringa! (2004-2017). Preservando la inteligencia colectiva de la internet hispanohablante.

CONTACTO

18 de Septiembre 455, Casilla 52

Chillán, Región de Ñuble, Chile

Solo correo postal

© 2026 Posteamelo.com. No afiliado con Taringa! ni sus sucesores.

Contenido preservado con fines históricos y culturales.