Estoy tratando de imprimir un documento en mi aplicación. Pero en diferentes impresoras puedo obtener 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 cuadro de diálogo muestra tengo dos impresoras de 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}

Se puede ver que el diálogo es el de cambiar el tamaño a A4. Así que si usted uncommemt línea después de showdialog estoy cumplimiento de tamaño de papel. La salida, cuando la impresión se parece a esto:

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}

Se puede ver que la impresora Samsung tiene buena Área Imprimible mientras que HP no tiene. HP siempre ha A4 tamaño de lo que va a cambiar en el código (conjunto de originatmargins etc.)

Si puedo cambiar mi configuración de papel en propiedades de impresión (lo siento por el polaco de diálogo):

Cómo imprimir con el tamaño de papel personalizado en winforms

y no cambiar el tamaño de papel después de mostrar un cuadro de diálogo de HP es la impresión de que todo ok. La salida se parece a esto:

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 obligar a los usuarios a ahorrar de tamaño personalizado para su impresora. He intentado también esta con una impresora de Kyocera – funciona, pero para los otros dos impresoras HP no.

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

Alguna idea?

  • Hola! Encontraste alguna solución a esto?
  • No, he cambiado mi trabajo 😉
  • Oops! Espero no tener que hacerlo también!!
  • hahahhaha, hizo que mi día con esta broma… 😀
InformationsquelleAutor bizon | 2011-08-18

2 Comentarios

  1. 15

    Después de la PrintDialog cierra, no acaba de establecer

    pd.DefaultPageSettings.PaperSize = paperSize;

    Probar configuración de la

    pd.PrinterSettings.DefaultPageSettings.PaperSize = paperSize;

    Creo que va a tomar el cuidado de él.

  2. 4

    configuración

    pd.DefaultPageSettings.PaperSize = paperSize;

    y

    pd.PrinterSettings.DefaultPageSettings.PaperSize = paperSize;

    podría no funcionar a veces.

    El más adecuado cosa es seleccionar un tamaño de papel personalizado que se
    instalado en el controlador de Impresoras o Equipo, a continuación, ajuste el
    propiedades de la siguiente

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

    Gusta este código

        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;
    }
    • FYI esta línea es incorrecta: pd.PrinterSettings.PaperSize = ExistingPaperSize; porque no hay ninguna propiedad pd.PrinterSettings.PaperSize. Debe ser pd.PrinterSettings.DefaultPageSettings.PaperSize.
    • Parece que las actualizaciones más recientes para Windows 10 rompió algo con la adición de formularios personalizados para el administrador de impresión. Tuve uno que agregó anteriormente que desapareció después de la actualización, e incluso después de volver a la adición, la nueva forma que todavía no se muestra en la PaperSizes colección. Yo no sabía que sólo podría crear uno que necesita sobre la marcha, sin embargo, esto resuelto mi problema y ahorra tener que meterse con la creación de formularios personalizados. Gracias!

Dejar respuesta

Please enter your comment!
Please enter your name here