printform print imprimir form example ejemplos c# winforms printing

imprimir - printdocument c# ejemplos



Cómo imprimir con tamaño de papel personalizado en winforms (2)

Después de que se cierre PrintDialog, no solo configure

pd.DefaultPageSettings.PaperSize = paperSize;

Prueba también configurando

pd.PrinterSettings.DefaultPageSettings.PaperSize = paperSize;

Creo que eso lo cuidará.

Estoy tratando de imprimir un documento en mi aplicación. Pero en diferentes impresoras obtengo diferentes resultados. Este es mi código:

PaperSize paperSize = new PaperSize("My Envelope", 440, 630); paperSize.RawKind = (int)PaperKind.Custom; PrintDocument pd = new PrintDocument(); pd.PrintPage += (sender, args) => Console.Out.WriteLine("Printable Area for printer {0} = {1}", args.PageSettings.PrinterSettings.PrinterName, args.PageSettings.PrintableArea); pd.DefaultPageSettings.PaperSize = paperSize; pd.DefaultPageSettings.Landscape = true; pd.DefaultPageSettings.Margins = new Margins(60, 40, 20, 20); Console.Out.WriteLine("My paper size: " + pd.DefaultPageSettings.PaperSize); PrintDialog printDialog = new PrintDialog(); // to choose printer printDialog.Document = pd; if (printDialog.ShowDialog(this) == DialogResult.OK) { // pd.DefaultPageSettings.PaperSize = paperSize; // uncomment to override size from dialog Console.Out.WriteLine("Paper size for printer {0} = {1}", printDialog.PrinterSettings.PrinterName, pd.DefaultPageSettings.PaperSize); _sptTxtControl.Print(pd); }

Cuando el diálogo muestra tengo dos impresoras: Samsung y HP. Esta es la salida de la consola para estos dos:

My paper size: [PaperSize My Envelope Kind=Custom Height=630 Width=440] Paper size for printer HP LaserJet 1022n = [PaperSize A4 Kind=A4 Height=1169 Width=827] Printable Area for printer HP LaserJet 1022n = {X=21,83333,Y=15,66667,Width=789,3333,Height=1137,333} My paper size: [PaperSize My Envelope Kind=Custom Height=630 Width=440] Paper size for printer Samsung SCX-4x28 Series PCL6 = [PaperSize A4 Kind=A4 Height=1169 Width=827] Printable Area for printer Samsung SCX-4x28 Series PCL6 = {X=17,33333,Y=17,16667,Width=792,3333,Height=1135,167}

Puedes ver que el diálogo está cambiando el tamaño a A4. Por lo tanto, si no está de acuerdo con la línea después de mostrar el diálogo, estoy aplicando el tamaño del papel. La salida al imprimir se ve así:

My paper size: [PaperSize My Envelope Kind=Custom Height=630 Width=440] Paper size for printer HP LaserJet 1022n = [PaperSize My Envelope Kind=Custom Height=630 Width=440] Printable Area for printer HP LaserJet 1022n = {X=21,83333,Y=15,66667,Width=789,3333,Height=1137,333} My paper size: [PaperSize My Envelope Kind=Custom Height=630 Width=440] Paper size for printer Samsung SCX-4x28 Series PCL6 = [PaperSize My Envelope Kind=Custom Height=630 Width=440] Printable Area for printer Samsung SCX-4x28 Series PCL6 = {X=16,66667,Y=20,Width=400,1667,Height=589,8333}

Puede ver que la impresora Samsung tiene una buena área de impresión, mientras que HP no. HP siempre tiene un tamaño A4, lo que cambiaré en el código (establecer originatmargins, etc.)

Si cambio mi configuración de papel en las propiedades de impresión (perdón por el diálogo polaco):

y no cambie el tamaño del papel después de mostrar el diálogo, entonces HP está imprimiendo todo bien. La salida se ve así:

My paper size: [PaperSize My Envelope Kind=Custom Height=630 Width=440] Paper size for printer HP LaserJet 1022n = [PaperSize My Envelop Format Kind=Custom Height=630 Width=440] Printable Area for printer HP LaserJet 1022n = {X=18,66667,Y=16,Width=405,3333,Height=597,3333}

Pero no quiero forzar al usuario a guardar un tamaño personalizado para su impresora. También he intentado esto con una impresora Kyocera: funciona, pero no lo hace para otras dos impresoras HP.

Y la peor parte es que Word 2010 imprime bien el mismo documento RTF con este tamaño en ambas impresoras, no puedo culpar al controlador de HP.

¿Algunas ideas?


ajuste

pd.DefaultPageSettings.PaperSize = paperSize;

y

pd.PrinterSettings.DefaultPageSettings.PaperSize = paperSize;

podría no funcionar a veces.

Lo más apropiado es seleccionar un tamaño de papel personalizado que se instale en el controlador de Impresoras o en la Computadora y luego configure las propiedades de los siguientes

pd.DefaultPageSettings.PaperSize = ExistingPaperSize; pd.PrinterSettings.PaperSize = ExistingPaperSize;

Como este codigo

PrintDocument pd = new PrintDocument(); pd.PrinterSettings = printdg.PrinterSettings; PaperSize RequiredPaperSize = CalculatePaperSize(WIDTH,HEIGHT); bool FoundMatchingPaperSize = false; for (int index = 0; index < pd.PrinterSettings.PaperSizes.Count; index++) { if (pd.PrinterSettings.PaperSizes[index].Height == RequiredPaperSize.Height && pd.PrinterSettings.PaperSizes[index].Width == RequiredPaperSize.Width) { pd.PrinterSettings.DefaultPageSettings.PaperSize = pd.PrinterSettings.PaperSizes[index]; pd.DefaultPageSettings.PaperSize = pd.PrinterSettings.PaperSizes[index]; FoundMatchingPaperSize = true; break; } } //Method to calculate PaperSize from Centimeter to 1/100 of an inch /// Caclulates the paper size /// </summary> /// <param name="WidthInCentimeters"></param> /// <param name="HeightInCentimetres"></param> /// <returns></returns> public static System.Drawing.Printing.PaperSize CalculatePaperSize(double WidthInCentimeters, double HeightInCentimetres) { int Width = int.Parse( ( Math.Round ((WidthInCentimeters*0.393701) * 100, 0, MidpointRounding.AwayFromZero) ).ToString() ); int Height = int.Parse( ( Math.Round ((HeightInCentimetres*0.393701) * 100, 0, MidpointRounding.AwayFromZero) ).ToString() ); PaperSize NewSize = new PaperSize(); NewSize.RawKind = (int)PaperKind.Custom; NewSize.Width = Width; NewSize.Height = Height; NewSize.PaperName = "Letter"; return NewSize; }