c# - printpage - Imprimiendo imagen con PrintDocument. Cómo ajustar la imagen para que se ajuste al tamaño del papel.
printform c# (6)
De acuerdo con TonyM y BBoy: esta es la respuesta correcta para la impresión original de 4 * 6 etiquetas. (args.pageBounds). Esto me funcionó para imprimir las etiquetas de envío del servicio API de Endicia.
private void SubmitResponseToPrinter(ILabelRequestResponse response)
{
PrintDocument pd = new PrintDocument();
pd.PrintPage += (sender, args) =>
{
Image i = Image.FromFile(response.Labels[0].FullPathFileName.Trim());
args.Graphics.DrawImage(i, args.PageBounds);
};
pd.Print();
}
En C #, estoy tratando de imprimir una imagen usando la clase PrintDocument con el siguiente código. La imagen es de tamaño 1200 px de ancho y 1800 px de altura. Estoy tratando de imprimir esta imagen en un papel 4 * 6 con una pequeña impresora zeebra. Pero el programa está imprimiendo solo 4 * 6 son de la imagen grande. ¡eso significa que no está ajustando la imagen al tamaño del papel!
PrintDocument pd = new PrintDocument();
pd.PrintPage += (sender, args) =>
{
Image i = Image.FromFile("C://tesimage.PNG");
Point p = new Point(100, 100);
args.Graphics.DrawImage(i, 10, 10, i.Width, i.Height);
};
pd.Print();
Cuando imprimo la misma imagen usando Window Print (haga clic con el botón derecho y seleccione imprimir, se está escalando automáticamente al tamaño del papel e imprimiendo correctamente. Eso significa que todo vino en papel 4 * 6). ¿Cómo hago lo mismo en mi programa C #?
La solución proporcionada por BBoy funciona bien. Pero en mi caso tuve que usar
e.Graphics.DrawImage(memoryImage, e.PageBounds);
Esto imprimirá sólo el formulario. Cuando uso MarginBounds, se imprime toda la pantalla, incluso si el formulario es más pequeño que la pantalla del monitor. PageBounds resolvió ese problema. Gracias a BBoy!
Los parámetros que está pasando al método DrawImage deben tener el tamaño que desea que tenga la imagen en el papel en lugar del tamaño de la imagen en sí, el comando DrawImage se hará cargo de la escala por usted. Probablemente, la forma más sencilla es usar la siguiente anulación del comando DrawImage.
args.Graphics.DrawImage(i, args.MarginBounds);
Nota: Esto sesgará la imagen si las proporciones de la imagen no son las mismas que el rectángulo. Algunos cálculos simples sobre el tamaño de la imagen y el tamaño del papel le permitirán crear un nuevo rectángulo que se ajuste a los límites del papel sin sesgar la imagen.
No para pisotear la respuesta ya decente de BBoy, pero he hecho el código que mantiene la relación de aspecto. Tomé su sugerencia, por lo que debería obtener crédito parcial aquí!
PrintDocument pd = new PrintDocument();
pd.DefaultPageSettings.PrinterSettings.PrinterName = "Printer Name";
pd.DefaultPageSettings.Landscape = true; //or false!
pd.PrintPage += (sender, args) =>
{
Image i = Image.FromFile(@"C:/.../.../image.jpg");
Rectangle m = args.MarginBounds;
if ((double)i.Width / (double)i.Height > (double)m.Width / (double)m.Height) // image is wider
{
m.Height = (int)((double)i.Height / (double)i.Width * (double)m.Width);
}
else
{
m.Width = (int)((double)i.Width / (double)i.Height * (double)m.Height);
}
args.Graphics.DrawImage(i, m);
};
pd.Print();
Responder:
public void Print(string FileName)
{
StringBuilder logMessage = new StringBuilder();
logMessage.AppendLine(string.Format(CultureInfo.InvariantCulture, "-------------------[ START - {0} - {1} -------------------]", MethodBase.GetCurrentMethod(), DateTime.Now.ToShortDateString()));
logMessage.AppendLine(string.Format(CultureInfo.InvariantCulture, "Parameter: 1: [Name - {0}, Value - {1}", "None]", Convert.ToString("")));
try
{
if (string.IsNullOrWhiteSpace(FileName)) return; // Prevents execution of below statements if filename is not selected.
PrintDocument pd = new PrintDocument();
//Disable the printing document pop-up dialog shown during printing.
PrintController printController = new StandardPrintController();
pd.PrintController = printController;
//For testing only: Hardcoded set paper size to particular paper.
//pd.PrinterSettings.DefaultPageSettings.PaperSize = new PaperSize("Custom 6x4", 720, 478);
//pd.DefaultPageSettings.PaperSize = new PaperSize("Custom 6x4", 720, 478);
pd.DefaultPageSettings.Margins = new Margins(0, 0, 0, 0);
pd.PrinterSettings.DefaultPageSettings.Margins = new Margins(0, 0, 0, 0);
pd.PrintPage += (sndr, args) =>
{
System.Drawing.Image i = System.Drawing.Image.FromFile(FileName);
//Adjust the size of the image to the page to print the full image without loosing any part of the image.
System.Drawing.Rectangle m = args.MarginBounds;
//Logic below maintains Aspect Ratio.
if ((double)i.Width / (double)i.Height > (double)m.Width / (double)m.Height) // image is wider
{
m.Height = (int)((double)i.Height / (double)i.Width * (double)m.Width);
}
else
{
m.Width = (int)((double)i.Width / (double)i.Height * (double)m.Height);
}
//Calculating optimal orientation.
pd.DefaultPageSettings.Landscape = m.Width > m.Height;
//Putting image in center of page.
m.Y = (int)((((System.Drawing.Printing.PrintDocument)(sndr)).DefaultPageSettings.PaperSize.Height - m.Height) / 2);
m.X = (int)((((System.Drawing.Printing.PrintDocument)(sndr)).DefaultPageSettings.PaperSize.Width - m.Width) / 2);
args.Graphics.DrawImage(i, m);
};
pd.Print();
}
catch (Exception ex)
{
log.ErrorFormat("Error : {0}/n By : {1}-{2}", ex.ToString(), this.GetType(), MethodBase.GetCurrentMethod().Name);
}
finally
{
logMessage.AppendLine(string.Format(CultureInfo.InvariantCulture, "-------------------[ END - {0} - {1} -------------------]", MethodBase.GetCurrentMethod().Name, DateTime.Now.ToShortDateString()));
log.Info(logMessage.ToString());
}
}
Puedes usar mi código aquí
//Print Button Event Handeler
private void btnPrint_Click(object sender, EventArgs e)
{
PrintDocument pd = new PrintDocument();
pd.PrintPage += PrintPage;
//here to select the printer attached to user PC
PrintDialog printDialog1 = new PrintDialog();
printDialog1.Document = pd;
DialogResult result = printDialog1.ShowDialog();
if (result == DialogResult.OK)
{
pd.Print();//this will trigger the Print Event handeler PrintPage
}
}
//The Print Event handeler
private void PrintPage(object o, PrintPageEventArgs e)
{
try
{
if (File.Exists(this.ImagePath))
{
//Load the image from the file
System.Drawing.Image img = System.Drawing.Image.FromFile(@"C:/myimage.jpg");
//Adjust the size of the image to the page to print the full image without loosing any part of it
Rectangle m = e.MarginBounds;
if ((double)img.Width / (double)img.Height > (double)m.Width / (double)m.Height) // image is wider
{
m.Height = (int)((double)img.Height / (double)img.Width * (double)m.Width);
}
else
{
m.Width = (int)((double)img.Width / (double)img.Height * (double)m.Height);
}
e.Graphics.DrawImage(img, m);
}
}
catch (Exception)
{
}
}