Pregunta

Estoy usando la clase PrintDocument para imprimir en la impresora de la etiqueta de mi hermano. Cuando ejecuto el método print (), la impresora comienza a flashear una luz de error rojo, pero todo lo demás regresa exitoso.

Puedo ejecutar este mismo código en mi impresora láser y todo funciona bien.

¿Cómo puedo ver qué está causando el error en la impresora de mi etiqueta?

Código:

public class Test
{
    private Font printFont;
    private List<string> _documentLinesToPrint = new List<string>();

    public void Run()
    {
        _documentLinesToPrint.Add("Test1");
        _documentLinesToPrint.Add("Test2");
        printFont = new Font("Arial", 10);
        var pd = new PrintDocument();
        pd.DefaultPageSettings.Margins = new Margins(25, 25, 25, 25);
        pd.DefaultPageSettings.PaperSize = new PaperSize("Label", 400, 237);

        var printerSettings = new System.Drawing.Printing.PrinterSettings();
        printerSettings.PrinterName ="Brother QL-570 LE";
        pd.PrinterSettings = printerSettings;
        pd.PrinterSettings.Copies = 1;
        pd.PrintPage += new PrintPageEventHandler(this.pd_PrintPage);
        pd.Print();
    }

    // The PrintPage event is raised for each page to be printed. 
    private void pd_PrintPage(object sender, PrintPageEventArgs ev)
    {
        float linesPerPage = 0;
        float yPos = 0;
        int count = 0;
        float leftMargin = ev.MarginBounds.Left;
        float topMargin = ev.MarginBounds.Top;
        string line = null;

        // Calculate the number of lines per page.
        linesPerPage = ev.MarginBounds.Height /
           printFont.GetHeight(ev.Graphics);

        // Print each line of the file. 
        while ((count < linesPerPage) && (count < _documentLinesToPrint.Count))
        {
            line = _documentLinesToPrint[count];

            yPos = topMargin + (count *
               printFont.GetHeight(ev.Graphics));
            ev.Graphics.DrawString(line, printFont, Brushes.Black,
               leftMargin, yPos, new StringFormat());

            line = null;
            count++;
        }

        // If more lines exist, print another page. 
        if (line != null)
            ev.HasMorePages = true;
        else
            ev.HasMorePages = false;
    }
}
¿Fue útil?

Solución

PrintDocument es una API muy básica. Obtiene una impresión genérica simple, pero tiene el costo de la funcionalidad reducida no específica para el controlador de impresión. Mi impresora HP generalmente me da un error impreso en lugar de una excepción. No es sorprendente ver que algo similar te suceda.

El parpadeo es probablemente un código que puede buscar. Si eso falla, puede intentar guardar en un formato de imagen, PDF o XPS. O use una biblioteca de terceros o escriba la suya Archivo PCL. Hay un montón de opciones. Crear una salida que pueda ver en lugar de una en la memoria debe depurar cálculos como márgenes. Puedes mirar un PDF y ver si se ve loco. Solo tenga en cuenta la forma en que se ve en la PC puede ser ligeramente diferente a la salida, especialmente cuando se imprime cerca de los bordes.

Otros consejos

Podría estar completamente equivocado en esto, pero entiendo que cuando imprime con este código, no tiene nada que ver con la impresora en sí, sino con el sistema operativo. Windows configura una cola de impresión, coloca la salida y su código regresa.

Luego, Windows elimina los elementos de la cola y los envía a través del controlador de la impresora y a su impresora. Si hay un error en la impresión, debe aparecer como un documento fallido en la cola de impresión. Creo que es demasiado tarde para atrapar el error como una excepción en esta etapa.

Por favor, corrígeme si me equivoco.

Rodearía tu cuerpo con un método usando un Bloque de prueba/captura luego maneje la (s) excepción (s) dentro del catch de cada método. Como ejemplo:

public class Test
{
    private Font printFont;
    private List<string> _documentLinesToPrint = new List<string>();

    public void Run()
    {
        try
        {
            _documentLinesToPrint.Add("Test1");
            _documentLinesToPrint.Add("Test2");
            printFont = new Font("Arial", 10);
            var pd = new PrintDocument();
            pd.DefaultPageSettings.Margins = new Margins(25, 25, 25, 25);
            pd.DefaultPageSettings.PaperSize = new PaperSize("Label", 400, 237);

            var printerSettings = new System.Drawing.Printing.PrinterSettings();
            printerSettings.PrinterName = "Brother QL-570 LE";
            pd.PrinterSettings = printerSettings;
            pd.PrinterSettings.Copies = 1;
            pd.PrintPage += new PrintPageEventHandler(this.pd_PrintPage);
            pd.Print();
        }
        catch (InvalidPrinterException exc)
        {
            // handle your errors here.
        }

        catch (Exception ex)
        {
            // handle your errors here.
        }
    }

    // The PrintPage event is raised for each page to be printed. 
    private void pd_PrintPage(object sender, PrintPageEventArgs ev)
    {
        try
        {
            float linesPerPage = 0;
            float yPos = 0;
            int count = 0;
            float leftMargin = ev.MarginBounds.Left;
            float topMargin = ev.MarginBounds.Top;
            string line = null;

            // Calculate the number of lines per page.
            linesPerPage = ev.MarginBounds.Height /
               printFont.GetHeight(ev.Graphics);

            // Print each line of the file. 
            while ((count < linesPerPage) && (count < _documentLinesToPrint.Count))
            {
                line = _documentLinesToPrint[count];

                yPos = topMargin + (count *
                   printFont.GetHeight(ev.Graphics));
                ev.Graphics.DrawString(line, printFont, Brushes.Black,
                   leftMargin, yPos, new StringFormat());

                line = null;
                count++;
            }

            // If more lines exist, print another page. 
            if (line != null)
                ev.HasMorePages = true;
            else
                ev.HasMorePages = false;
        }
        catch (InvalidPrinterException exc)
        {
            // handle your errors here.
        }

        catch (Exception ex)
        {
            // handle your errors here.
        }
    }
}
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top