Pergunta

Estou usando a classe PrintDocument para imprimir para a minha impressora de etiqueta irmão. Quando executo o método print (), a impressora começa a piscar uma luz de erro vermelha, mas tudo o mais retorna bem -sucedido.

Eu posso executar o mesmo código na minha impressora a laser e tudo funciona bem.

Como posso ver o que está causando o erro na minha impressora de 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;
    }
}
Foi útil?

Solução

O PrintDocument é uma API muito básica. Você obtém impressão genérica simples, mas ela tem o custo da funcionalidade reduzida não específica para o driver de impressão. Minha impressora HP geralmente me dá um erro impresso em vez de uma exceção. Não é surpreendente ver algo semelhante acontecendo com você.

O piscar é provavelmente um código que você pode procurar. Se isso falhar, você pode tentar salvar em um formato de imagem, PDF ou XPS. Ou use uma biblioteca de terceiros ou escreva o seu próprio Arquivo PCL. Há uma tonelada de opções. Criar uma saída que você pode visualizar, em oposição a um na memória, deve depurar cálculos como margens. Você pode olhar para um PDF e ver se parece maluco. Lembre -se da maneira como parece o PC pode ser um pouco diferente da saída, especialmente ao imprimir perto das bordas.

Outras dicas

Eu poderia estar completamente errado nisso, mas meu entendimento é que, quando você imprime com esse código, ele não tem nada a ver com a própria impressora, mas com o sistema operacional. O Windows configura uma fila de impressão, coloca a saída nela e seu código retorna.

Em seguida, o Windows tira os itens da fila e os envia através do driver da impressora e da impressora. Se houver um erro na impressão, ele deve aparecer como um documento com falha na fila de impressão. Eu acho que é tarde demais para prender o erro como uma exceção nesta fase.

Por favor, corrija -me se estou enganado.

Eu cercaria seus órgãos de métodos usando um Tente/Catch Block Em seguida, lide com as exceções dentro do (s) catch de cada método. Como um exemplo:

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 em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top