studio - printdocument c# ticket
Impresión de derecha a izquierda en c# (2)
Según msdn: http://www.microsoft.com/middleeast/msdn/arabicsupp.aspx
¿Cómo GDI + soporta el árabe?
GDI + admite la manipulación de texto árabe, incluido el texto de impresión con el orden de lectura RTL para ambos dispositivos de salida, Pantalla e Impresora. El método Graphics.DrawString dibuja la cadena de texto especificada en una ubicación x, y designada o un rectángulo (según su sobrecarga), con los objetos Brush y Font especificados utilizando los atributos de formato del objeto StringFormat especificado. El objeto StringFormat incluye información de diseño de texto, como el orden de lectura del texto.
Por lo tanto, puede mover fácilmente el origen del objeto gráfico para que aparezca en la parte superior derecha, en lugar de arriba, para imprimir el texto árabe en la ubicación designada en la pantalla sin problemas, sin tener que calcular las ubicaciones explícitamente.
Si bien esto es cierto cuando se configura la coordinación (X, Y) en (0,0), pero si deseo aumentar la coordinación X para imprimir en un área específica del papel, la coordinación X aumentará hacia el lado derecho del papel, no hacia el lado derecho. izquierda como se supone cuando se imprime de derecha a izquierda; lo que significa imprimir fuera del papel. Vea esta demostración:
static void Main(string[] args)
{
PrintDocument p = new PrintDocument();
p.PrintPage += new PrintPageEventHandler(PrintPage);
p.Print();
}
static void PrintPage(object sender, PrintPageEventArgs e)
{
string drawString = "إختبار الرسم";
SolidBrush drawBrush = new SolidBrush(Color.Black);
Font drawFont = new System.Drawing.Font("Arail", 16);
RectangleF recAtZero = new RectangleF(0, 0, e.PageBounds.Width, e.PageBounds.Height);
StringFormat drawFormat = new StringFormat();
drawFormat.FormatFlags = StringFormatFlags.DirectionRightToLeft;
e.Graphics.DrawString(drawString, drawFont, drawBrush, recAtZero, drawFormat);
RectangleF recAtGreaterThantZero = new RectangleF(300, 0, e.PageBounds.Width, e.PageBounds.Height);
e.Graphics.DrawString(drawString, drawFont, drawBrush, recAtGreaterThantZero, drawFormat);
}
Cómo mover el origen del objeto gráfico para que sea superior derecho en lugar de superior izquierdo y cuando aumenta la coordinación X, avanza el punto de impresión hacia la izquierda y no hacia la derecha.
PD: Lo que estoy haciendo ahora es establecer la coordinación X en negativa para forzar que se mueva hacia la izquierda.
Podrías hacer una transformación de coordenadas muy simple:
public static class CoordinateConverter
{
public static RectangleF Convert(RectangleF source, RectangleF drawArea)
{
// I assume drawArea.X to be 0
return new RectangleF(
drawArea.Width - source.X - source.Width,
source.Y,
source.Width,
source.Height);
}
public static RectangleF ConvertBack(Rectangle source, RectangleF drawArea)
{
return new RectangleF(
source.X + source.Width - drawArea.Width,
source.Y,
source.Width,
source.Height);
}
}
Ahora, cada vez que desee dibujar algo de texto, puede usar este convertidor para cambiar las coordenadas. Por supuesto, también puedes refinar un rectángulo para no crear nuevos todo el tiempo. Pero el principio sigue siendo el mismo. Espero haber entendido tu pregunta correctamente.
Utilice StringFormatFlags.DirectionRightToLeft, como esto:
StringFormat format = new StringFormat(StringFormatFlags.DirectionRightToLeft);
e.Graphics.DrawString("سلام",
this.Font,
new SolidBrush(Color.Red),
r1,
format);