.net - print - no se puede cambiar papersize a menos que la propiedad kind esté establecida como custom
Altura de papel dinámico con.NET PrintDocument (1)
No es necesario calcular la altura al imprimir en impresoras POS, ya que el controlador maneja la altura y el corte del papel al final del documento. Vaya a la configuración de la impresora POS y seleccione ''Recibo'' como tamaño de papel. Por lo general, también hay configuraciones para controlar cómo y cuándo la impresora corta papel (Corte completo, Curvado parcial, Solo alimentación, ...)
Me encontré con un problema al dimensionar páginas en una impresora térmica. Empecé con esta respuesta: https://stackoverflow.com/a/27165167/1030464 y ahora tengo el código que pegué a continuación.
Esto funciona bien, sin embargo, aunque calculo y configuro el tamaño de la página, parece imprimir una página de tamaño A4 completa cada vez. (Estoy probando en una impresora Sam4s Ellix II y Microsoft PDF) - Es un gran problema, ya que a menudo es necesario imprimir fragmentos de texto de 5-6 líneas de longitud.
Necesito soportar múltiples impresoras térmicas y solo necesito las funciones básicas (así que no necesito recibir señales como atascos de papel, etc.), así que decidí usar el controlador de impresora de Windows, en lugar del POS para .NET.
Calculo la altura del texto y el tamaño del papel en consecuencia, sin embargo, no tiene efecto en el tamaño del papel de salida. ¿Alguien tiene una solución para este problema?
Muchas gracias
public int Print(DatabaseConnector dc)
{
try {
// Set up PrintDocument
PrintDocument recordDoc = new PrintDocument();
recordDoc.DocumentName = "PrintTask ID "+id.ToString();
recordDoc.PrintPage += new PrintPageEventHandler(PrintTask.PrintReceiptPage); // Filling in the stuff
// Print Controller
StandardPrintController spc = new StandardPrintController();
recordDoc.PrintController = spc; // This hides popup
// Printer Settings
PrinterSettings ps = new PrinterSettings();
ps.PrinterName = dc.ReadSetting("PrinterName");
recordDoc.PrinterSettings = ps;
recordDoc.Print();
// Clean up
recordDoc.Dispose();
}
catch (Exception exc)
{
((MainForm)Application.OpenForms[0]).msg(exc.Message);
}
return 1; // ignore this
}
private static void PrintReceiptPage(object sender, PrintPageEventArgs e)
{
try {
// Read settings
DatabaseConnector db = new DatabaseConnector();
PrintTask pt = db.ReadTask();
float x = float.Parse(db.ReadSetting("PaperMarginFromLeft"));
float y = float.Parse(db.ReadSetting("PaperMarginFromTop"));
float width = float.Parse(db.ReadSetting("PaperWidth"));
float height = 0F;
string text;
// Set up font
Font drawFont1 = new Font(db.ReadSetting("PrintFont"), Int32.Parse(db.ReadSetting("PrintFontSize")), FontStyle.Regular);
SolidBrush drawBrush = new SolidBrush(Color.Black);
// Set format of string.
StringFormat drawFormatLeft = new StringFormat();
drawFormatLeft.Alignment = StringAlignment.Near;
// Draw string to screen.
text = pt.getData();
e.Graphics.DrawString(text, drawFont1, drawBrush, new RectangleF(x, y, width, height), drawFormatLeft);
// calculate text size
SizeF textSize = e.Graphics.MeasureString(text, drawFont1);
y += textSize.Height;
// Set page size - has no effect
e.HasMorePages = false;
float inchHeight = PrintTask.PixelsToInchY(y, e.Graphics);
PaperSize originalPaperSize = e.PageSettings.PaperSize;
PaperSize scaledSize = new PaperSize("Custom", originalPaperSize.Width, (int)Math.Ceiling(inchHeight * 100));
e.PageSettings.PaperSize = scaledSize;
e.PageSettings.PrinterSettings.DefaultPageSettings.PaperSize = scaledSize;
}
catch (Exception exc)
{
((MainForm)Application.OpenForms[0]).msg(exc.Message);
}
}
public static float PixelsToInchX(float n, Graphics graphics)
{
return n * graphics.DpiX / 300;
}
public static float PixelsToInchY(float n, Graphics graphics)
{
return n * graphics.DpiY / 300;
}