André Alves de Lima

Talking about Software Development and more…

Impressão direto na impressora com C#

Você sabe muito bem que tempo é dinheiro. Mas, André, o que isso tem a ver com o artigo de hoje? Tem tudo a ver! Muitos usuários de sistemas não querem ficar perdendo tempo vendo o preview da impressão se eles sabem exatamente o que vai ser impresso. Acontece com usuários das aplicações que eu desenvolvi e garanto que deve acontecer com os usuários da sua aplicação. Tanto é que um dos inscritos da minha newsletter sugeriu que eu abordasse a impressão direto na impressora com C#. E eu pensei: por que não?

Edit: em outubro de 2017 eu gravei um vídeo demonstrando exatamente a mesma implementação que foi detalhada neste artigo. Caso você prefira assistir a versão em vídeo, aqui vai ela:

Imprimindo texto direto na impressora

Definitivamente, o conteúdo mais simples de se imprimir diretamente na impressora é texto, especialmente se for tudo com uma fonte só. Nesse primeiro exemplo, quero demonstrar justamente como você pode imprimir um bloco de texto direto na impressora, sem nenhum preview.

Para isso, crie um novo projeto do tipo “Windows Forms Application“. Com esse novo projeto criado, ajuste o formulário de forma que ele fique parecido com a imagem abaixo:

Como você pode perceber, temos um ComboBox para escolher a impressora a ser utilizada (impressoraComboBox), um botão que será responsável por disparar a impressão (imprimirButton) e um TextBox com o conteúdo que deverá ser impresso (impressaoTextBox). Não esqueça de configurar o TextBox para que ele suporte múltiplas linhas (propriedade Multiline).

Antes de partirmos para o código da impressão, temos que carregar a lista de impressoras. Você não tem noção de quão fácil é listar as impressoras instaladas com o .NET Framework. A classe PrinterSettings tem uma propriedade estática chamada InstalledPrinters, que nada mais é que uma lista de strings com os nomes das impressoras. Mais simples impossível!

Dito isso, crie um método no nosso formulário (chamado CarregarListaDeImpressoras) e faça a chamada desse método no construtor do formulário:

        public FormImpressaoDireta()
        {
            InitializeComponent();

            CarregarListaDeImpressoras();
        }

        private void CarregarListaDeImpressoras()
        {
            impressoraComboBox.Items.Clear();

            foreach (var printer in System.Drawing.Printing.PrinterSettings.InstalledPrinters)
            {
                impressoraComboBox.Items.Add(printer);
            }
        }

Feito isso, vamos implementar o código para fazer a impressão do texto direto na impressora, sem o preview. A classe que temos que utilizar para implementar essa funcionalidade é a PrintDocument. Essa classe utiliza o evento PrintPage para gerenciar a impressão, ou seja, na implementação desse evento, você precisa controlar o que deve ser impresso em cada uma das páginas:

        private void imprimirButton_Click(object sender, EventArgs e)
        {
            using (var printDocument = new System.Drawing.Printing.PrintDocument())
            {
                printDocument.PrintPage += printDocument_PrintPage;
                printDocument.PrinterSettings.PrinterName = impressoraComboBox.SelectedItem.ToString();
                printDocument.Print();
            }
        }

        void printDocument_PrintPage(object sender, System.Drawing.Printing.PrintPageEventArgs e)
        {
            var printDocument = sender as System.Drawing.Printing.PrintDocument;

            if (printDocument != null)
            {
                using (var font = new Font("Times New Roman", 14))
                using (var brush = new SolidBrush(Color.Black))
                {
                    e.Graphics.DrawString(
                        impressaoTextBox.Text,
                        font,
                        brush,
                        new RectangleF(0, 0, printDocument.DefaultPageSettings.PrintableArea.Width, printDocument.DefaultPageSettings.PrintableArea.Height));
                }
            }
        }

Para testar o código, execute a aplicação, escolha uma impressora no ComboBox, digite um texto na caixa de texto e clique em “Imprimir“:

A propósito, você sabia que o Word consegue gerar textos de exemplo (esse que começa em “Lorem ipsum“)? Aprenda como neste link.

E se não couber em uma página?

Se o conteúdo da caixa de texto não couber em uma página, somente a primeira página será impressa. E como conseguimos ajustar o código para que ele se comporte corretamente independentemente do número de páginas? Para isso, temos que alterar um pouco o código de forma que somente o texto que cabe em cada página seja impresso. Como fazer isso? Veja o resultado:

        private string _texto;

        private void imprimirButton_Click(object sender, EventArgs e)
        {
            using (var printDocument = new System.Drawing.Printing.PrintDocument())
            {
                printDocument.PrintPage += printDocument_PrintPage;
                printDocument.PrinterSettings.PrinterName = impressoraComboBox.SelectedItem.ToString();
                _texto = impressaoTextBox.Text;
                printDocument.Print();
            }
        }

        void printDocument_PrintPage(object sender, System.Drawing.Printing.PrintPageEventArgs e)
        {
            var printDocument = sender as System.Drawing.Printing.PrintDocument;

            if (printDocument != null)
            {
                using (var fonte = new Font("Times New Roman", 14))
                using (var brush = new SolidBrush(Color.Black))
                {
                    int caracteresNaPagina = 0;
                    int linhasPorPagina = 0;

                    e.Graphics.MeasureString(
                        _texto, fonte, e.MarginBounds.Size, StringFormat.GenericTypographic,
                        out caracteresNaPagina, out linhasPorPagina);

                    e.Graphics.DrawString(
                        _texto.Substring(0, caracteresNaPagina),
                        fonte,
                        brush,
                        e.MarginBounds);

                    _texto = _texto.Substring(caracteresNaPagina);

                    e.HasMorePages = _texto.Length > 0;
                }
            }
        }

Como você pode ver, agora temos uma “variável” no nível do formulário chamada “_texto“. Essa variável guardará sempre o texto que está faltando imprimir. Portanto, quando clicamos no botão “Imprimir“, nós guardamos o texto completo da caixa de texto nessa variável. Depois, conforme formos imprimindo o texto de cada página, iremos ajustando o valor dessa variável para que ela guarde somente o texto que está faltando.

E como é que medimos a quantidade de texto que cabe em uma página? Fácil! É só utilizarmos o método MeasureString da classe Graphics. Esse método recebe o texto, a fonte e as dimensões da área disponível para impressão, retornando a quantidade de caracteres e linhas que conseguimos imprimir nessa área:

                    int caracteresNaPagina = 0;
                    int linhasPorPagina = 0;

                    e.Graphics.MeasureString(
                        _texto, fonte, e.MarginBounds.Size, StringFormat.GenericTypographic,
                        out caracteresNaPagina, out linhasPorPagina);

Por fim, a outra alteração importante na implementação do evento PrintPage foi feita na última linha, onde indicamos se ainda temos outra página para imprimir ou não (propriedade HasMorePages). Devemos configurar essa propriedade como “true” caso ainda tenhamos texto para ser impresso (Length maior que zero).

Imprimindo imagens e formas geométricas

Da mesma forma que conseguimos imprimir texto utilizando a classe PrintDocument, nós conseguimos imprimir imagens e formas geométricas também. Para isso, ao invés de utilizarmos o método DrawString, temos que utilizar os métodos DrawImage ou Draw*** (onde “***” é o nome da figura geométrica que você quer desenhar).

Por exemplo, para imprimirmos uma imagem do arquivo “logo.png” (localizada no mesmo diretório da aplicação), poderíamos utilizar o seguinte código:

        void printDocument_PrintPage(object sender, System.Drawing.Printing.PrintPageEventArgs e)
        {
            var printDocument = sender as System.Drawing.Printing.PrintDocument;

            if (printDocument != null)
            {
                e.Graphics.DrawImage(Image.FromFile("logo.png"), new Point(5, 5));
            }
        }

Já para imprimirmos um polígono qualquer, temos que substituir a chamada do método DrawImage por DrawPolygon:

                e.Graphics.DrawPolygon(
                    new Pen(Color.Red), 
                    new[] 
                    {
                        new Point(30, 30),
                        new Point(80, 150),
                        new Point(20, 70),
                        new Point(100, 100),
                        new Point(30, 30)
                    });

Imprimindo um RichTextBox formatado

O exemplo de impressão de texto que eu demonstrei nesse artigo não considera a impressão de textos ricos (com formatação). Para conseguirmos imprimir esse tipo de texto com formatação, é necessária muita gambiarra. Durante a minha pesquisa para escrever esse artigo, encontrei dois exemplos de impressão de RichTextBox:

Getting WYSIWYG Print Results from a .NET RichTextBox

How to print the content of a RichTextBox control by using Visual C# .NET or Visual C# 2005

Impressão matricial

Algumas pessoas já me perguntaram como fazer para imprimir diretamente na porta LPT1, a fim de imprimir texto puro em impressoras matriciais. Sempre que alguém me pergunta isso, eu encaminho o link para o componente que o Carlos dos Santos desenvolveu, que implementa justamente essa funcionalidade:

Dot Matrix Print 2.0 – Componente para impressão matricial

Concluindo

Normalmente, quando queremos imprimir informações a partir dos nossos sistemas, utilizamos alguma ferramenta de geração de relatórios (como Report Viewer ou Crystal Reports). Porém, em algumas situações precisamos ter o controle total do conteúdo que será impresso, principalmente as posições onde as informações serão impressas e se queremos ou não exibir um preview antes de imprimir. Nesse artigo você aprendeu a imprimir textos, imagens e figuras geométricas diretamente na impressora. Dessa forma, nas situações em que você precisar desse tipo de controle total da sua impressão, você saberá como proceder.

E você, já teve que fazer algo parecido? Como você acabou resolvendo essa situação? Da mesma forma que eu resolvi ou de alguma outra maneira? Conte nos comentários como foram as suas experiências com a impressão de informações em aplicativos desenvolvidos com o .NET Framework.

Antes de me despedir, convido você a inscrever-se na minha newsletter. Ao fazer isso, você receberá um e-mail toda semana sobre o artigo publicado, ficará sabendo em primeira mão sobre o artigo da próxima semana e receberá também dicas “bônus” que eu só compartilho por e-mail. Além disso, você já deve ter percebido que eu recebo muitas sugestões de temas e eu costumo dar prioridade às sugestões vindas de inscritos da minha newsletter. Inscreva-se aqui ou utilizando o formulário logo abaixo.

Até a próxima!

André Lima

Newsletter do André Lima

* indicates required



Powered by MailChimp

48 thoughts on “Impressão direto na impressora com C#

  • Ricardo Fabricio disse:

    André, obrigado por compartilhar parte do seu tempo e conhecimento é de grande ajuda a todos nós.

    Gostaria de uma ajudinha…

    É possível justificar um texto/paragrafo utilizando o controle richtextbox ?

    • andrealveslima disse:

      Olá Ricardo, obrigado pelo comentário!

      Fiz algumas pesquisas aqui e não consegui encontrar uma maneira de justificar texto no RichTextBox do Windows Forms.. Só dá para alinhar à direita, esquerda ou centralizado.. O controle de RichTextBox do Windows Forms é bem limitado.. Acho que você só conseguiria essa funcionalidade ao implementar um controle derivado dele fazendo as devidas alterações.. Encontrei este exemplo que parece que atende ao que você precisa (obs: não testei, então, não sei se realmente funciona):

      Extending RichTextBox

      De qualquer forma, como falei, os controles nativos do Windows Forms são bem limitados.. Eu sugeriria a compra de alguma suite de controles comerciais, como DevExpress ou Telerik.. Os controles de RichText dessas duas bibliotecas dão de 10000 a zero no controle do Windows Forms:

      DevExpress WinForms Rich Text Editor

      Telerik RadRichTextEditor

      Abraço!
      André Lima

    • Nascimento disse:

      Boa noite Andre. Gostaria de saber como faço para imprimir esse texto direto em em uma impressora termica nao fiscal?

      • andrealveslima disse:

        Olá Nascimento!

        Infelizmente não faço ideia.. Muita gente me pergunta como imprimir em impressora fiscal e não fiscal.. Porém, como eu não tenho uma aqui para testar, fica difícil ajudar..

        Você já tentou utilizar o mesmo procedimento que eu mostrei aqui no vídeo com a sua impressora térmica? Qual foi o resultado?

        Abraço!
        André Lima

  • FRANCISCO RICARDO disse:

    Excelente post esta de parabens, me ajudou bastante.

    Estou tentando fazer impressao direta mais em relatorios com report view.

    Voce tem alguma dica quem saber criar um novo artigo sobre..

    Mais uma vez obirgado.

    • andrealveslima disse:

      Olá Francisco, obrigado pelo comentário!

      Como assim impressão direta pelo Report Viewer? Você quer imprimir o relatório direto sem mostrar o preview? Caso seja isso, talvez este artigo te ajude:

      Walkthrough: Printing a Local Report without Preview

      Um outro artigo que pode te ajudar é este aqui que eu publiquei umas semanas atrás:

      Como podemos exportar relatórios do Report Viewer?

      Nele eu mostro como exportar o relatório para PDF sem o preview.. Talvez seja útil para você também..

      Enfim, dê uma olhada nesses links e depois me avisa se te ajudou ou não..

      Abraço!
      André Lima

      • FRANCISCO RICARDO disse:

        E isso mesmo meu amigo mais uma vez muito obrigado.

        • andrealveslima disse:

          Beleza Francisco!

          Qualquer coisa se você ficar com alguma dúvida, entre em contato novamente..

          Abraço!
          André Lima

          • FRANCISCO RICARDO disse:

            Boa tarde andre, venho novamente lhe agradecer e dizer que seu post e seus comentarios abriram bastante meus horizontes, consegui implementar uma classe para impressao direta no meu sistema ficou show.

            Mais estou com um problema, tenho uma aplicação que imprimi os pedidos de um cliente via desktop, ta funcionando direitinho imprimindo sem problemas.

            Entao estou fazendo esse pedido atrazes de um app que desenvolvi em android, desenvolvi tambem um WEBSERVICE em C# tudo funcionando direitinho, mais to com um problema na hora da impressao, quando mando imprimir pelo webservice (IIS 7)ele nao imprimi fica apenas processando mas nao imprimi, apos varios testes verifiquei que o problema esta na classe printDocument pois quando chamado o metodo print() ela abre e fecha automaticamente uma janela com o titulo de imprimir e um botao cancelar, de praxe do PrintDocument, e por o IIS não aceitar esses tipos de janelas essa não imprimir, mas o mais interessante e quando copilo do visual studio funciona direitinho, quando publico para o meu servidor IIS 7 ele não imprimi. Podeira me dar uma dica?

          • andrealveslima disse:

            Olá Francisco!

            Será que não é porque o IIS está rodando com um usuário que não tenha acesso à impressora do servidor? Você já tentou alterar a aplicação no IIS para rodar como outro usuário que tenha acesso a impressora (como local system)?

            Abraço!
            André Lima

          • FRANCISCO RICARDO disse:

            Infelizmente tenho pouco conhecimento em IIS ja andei pesquisando sobre criar usuarios e dar acesso as funcionalidades do servidor mas nao encontro nada concreto.

            Se poder me ajudar dando algumas dicas de como criar usuarios e da permissoes a eles fico muito agradecido.

            Mais uma vez muito obrigado.

          • andrealveslima disse:

            Olá Francisco,

            Não estou com um ambiente que tenha IIS aqui para eu tirar uns screenshots, mas, basicamente você só tem que ir no application pool onde seu serviço está rodando e alterar o usuário nas propriedades dele (em application pool identity).. Tem um tutorial no TechNet explicando:

            Especificar uma identidade para um pool de aplicativos (IIS 7)

            Abraço!
            André Lima

  • Leonardo disse:

    Bom dia. Obrigado pela dica Andre.
    Estou buscando uma solução para imprimir com C#, porém não usando a impressora do servidor, mas a impressora do cliente. Minha aplicação é web e tenho que imprimir na LPT1 do cliente. Pode me dar uma ajuda?
    Obrigado mais uma vez.

    • andrealveslima disse:

      Olá Leonardo, obrigado pelo comentário!

      Infelizmente eu tenho pouquíssima experiência com desenvolvimento web.. Não faço a mínima ideia de como você poderia imprimir na LPT do cliente através de uma web application.. O máximo que eu consegui encontrar em uma rápida pesquisa que eu fiz aqui foi esta biblioteca comercial que aparentemente faz o que você está querendo fazer:

      WebClientPrint for ASP.NET

      Se isso não te ajudar, sugiro que você poste essa sua pergunta nos fóruns da MSDN, categoria “desenvolvimento web”:

      Fóruns MSDN, web development

      Desculpe por não ter conseguido ajudar mais..

      Abraço!
      André Lima

      • Leonardo disse:

        Ô André, que isso cara, muito obrigado por responder prontamente. A solução comercial apresentada é bem interessante, principalmente se o cliente estiver com muita pressa. Mas no nosso caso vou desenvolver um applet em java pra executar o arquivo bat na máquina do cliente. Este arquivo vai conter apenas um comando type. Por hora, o cliente pode executar este arquivo manualmente, tendo apenas o cuidado de salvar o arquivo gerado, o que vai pra impressora, sempre na mesma pasta.
        Mais uma vez obrigado e bom trabalho pra você.
        Grande abraço!

  • João Paulo disse:

    Olá André, excelente post. Estou procurando como listar impressoras de rede, mesmo as que não estão instaladas e exibir em uma lista. Você sabe como faz?

    Grato pela atenção,

    • andrealveslima disse:

      Olá João, obrigado pelo comentário!

      Nunca precisei fazer isso, mas, fui procurar aqui para ver se conseguia fazer.. Encontrei estes dois links com duas soluções:

      List available network printers (non-installed as well)

      How to get Printers from Network which is not installed in my system?

      Porém, nenhum dos dois exemplos funcionaram aqui no meu computador.. Consegui compilar os dois, mas, o primeiro retorna uma lista com todos os recursos da rede (impressoras ou não), só que não consegui encontrar um meio de só separar as impressoras.. Já o segundo, dá um erro quando tento executar (The specified domain either does not exist or could not be contacted)..

      Mas, por que você está querendo listar mesmo as impressoras não instaladas? Que eu saiba, o Windows não vai deixar você imprimir em uma impressora que não esteja instalada no seu computador..

      Enfim, de qualquer maneira, se você conseguir encontrar alguma maneira de fazer isso, volta aqui e avisa a gente..

      Abraço!
      André Lima

  • Danilo da silva disse:

    boa tarde,amigo tem como imprimir o form inteiro ?

  • Giovana disse:

    Bom dia André. Obrigada pelo compartilhamento de seu conhecimento.
    Eu tenho uma aplicação que gera arquivos PDF, e gostaria de mandá-los direto para a impressora (hoje ele é aberto no leitor PDF e enviado automaticamente para a impressora). Escrevi os bytes do arquivo diretamente na minha impressora e tudo funcionou, mas quando imprimo em outra impressora, cujo driver é PCL6, não consigo um resultado satisfatório. Você sabe o que devo fazer?

    • andrealveslima disse:

      Olá Giovana, obrigado pelo comentário!

      Você já pensou em “pedir” para o Adobe Reader imprimir o seu arquivo silenciosamente (sem exibir a interface do Adobe Reader)? Acredito que os computadores onde a sua aplicação está rodando tenham o Adobe Reader instalado, não? Essa alternativa é discutida nesta thread do StackOverflow, veja só:

      How can I send a file document to the printer and have it print?

      Esse esquema do driver diferente ao mandar os bytes do arquivo para a impressora eu não tenho ideia do que possa estar acontecendo.. :(

      Abraço!
      André Lima

  • […] dias atrás eu recebi um comentário no meu artigo sobre impressão direta com C# perguntando se seria possível imprimirmos um formulário no Windows Forms. Eu sabia que isso era […]

  • Diego Marlyson Santos Duque disse:

    Olá André boa tarde, você saberia me dizer como eu envio um report.rdcl montado para a impressora direto sem o preview?

    • andrealveslima disse:

      Olá Diego!

      Eu tenho planos de escrever um artigo sobre esse tema no futuro, mas infelizmente ainda não consegui encontrar um tempo.. Já dei uma pesquisada e encontrei alguns links (ainda não testei mas parecem promissores).. Veja se os links te ajudam:

      Manually Printing a Report

      Imprimir reportviewer Via Codigo C#

      Se você conseguir fazer funcionar, avisa aqui a gente, OK?

      Abraço!
      André Lima

      • Diego Marlyson Santos Duque disse:

        André bom dia, implementei a classe disponibilizada no segundo link que você me passou e funcionou perfeitamente, só tive que gerar o report, popular seu datasource, chamar a classe passado como parâmetro o reportviewr1.LocalReport e chamar o método Print().

        Obrigado pela dica!!!

  • FABIO C MEDEIROS disse:

    Olá Andre. Muito bom seu artigo. Me ajudou muito.
    Como faço para imprimir em formulário continuo, ajustando o espaçamento exato entre uma página e outra para que os dados casem no formulário?
    Obrigado.

    • andrealveslima disse:

      Olá Fabio, muito obrigado pelo comentário!

      Cara, impressão direta é um jogo de paciência.. A única coisa que podemos fazer é posicionar a impressão na coordenada correta na página.. No caso do formulário contínuo, apesar das páginas estarem “grudadas” eu acredito que para o PrintDocument você teria que considerar páginas separadas, ajustando a coordenada da impressão adequadamente..

      Você já tentou implementar esse tipo de impressão e não deu certo? Qual é que foi o problema exatamente?

      Abraço!
      André Lima

      • FABIO C MEDEIROS disse:

        Olá.
        No meu caso a primeira impressão casa perfeitamente no formulário, porém as impressões seguintes começam a sair do posicionamento, chegando a determinado momento estar totalmente fora da área correta do formulário.

        Como faço para determinar o tamanho exato da área de impressão para que ao terminar a impressão de um documento a posição inicial do formulário seja a mesma do inicio do primeiro documento.
        Obrigado.

        • andrealveslima disse:

          Olá Fabio!

          Que zica hein.. Eu nunca precisei determinar o tamanho da área disponível para impressão, mas parece que esta thread do StackOverflow aborda exatamente esse tema:

          How to find the actual printable area? (PrintDocument)

          Você já chegou a dar uma olhada nesse código?

          Abraço!
          André Lima

        • andrealveslima disse:

          Olá Fabio!

          Conseguiu resolver esse problema? O link do StackOverflow ajudou em algo?

          Abraço!
          André Lima

          • FABIO C MEDEIROS disse:

            Boa tarde André. Consegui por outro método de impressão, que foi a geração de uma arquivo TXT e envio direto para impressora. Entretanto, estou com outro problema que é a captura do nome de compartilhamento da impressora que estou enviando o arquivo. Como a impressora que utilizo é matricial e para imprimir nessas impressoras usando os computadores atuais que não tem porta paralela, é preciso enviar para LPT1 usando o comando “TYPE > LPT1”, porém antes tenho que executar o comando “net use LPT1 \\meuip\NomeCompart” em um arquivo “.BAT”. Daí preciso capturar o nome de compartilhamento da Impressora. Você sabe como faço para capturar essa informação usando o C#? Agradeço desde já.

          • andrealveslima disse:

            Olá Fabio, obrigado pelo retorno!

            Entendi.. Nunca precisei fazer isso, mas dei uma pesquisada aqui e encontrei esta thread no StackOverflow:

            Is there a .NET way to enumerate all available network printers?

            Você já deu uma olhada nela? Tentou fazer dessa forma?

            Abraço!
            André Lima

  • […] importante quando o usuário precisa de muita rapidez na operação. Uns tempos atrás eu mostrei como imprimir informações direto na impressora através da classe PrintDocument. Em uma outra oportunidade, eu mostrei como exportar relatórios do Report Viewer. Mas, até hoje […]

  • Diego disse:

    Parabéns pelo post Andre, me ajudou muito, porem estou quebrando a cabeça com algo já faz um tempo
    tenho uma impressora térmica epson th20 que imprimo fichinhas pra bar, porem são muitas fichas, o problema e que fica piscando na tela uma janelinha imprimindo porque do um while no comando print(), ai se tiver 50 fichas vai chamar 50 vezes o comando print(), um detalhe e que as fichas são sempre iguais, porem o comando copies não funciona na termina, se tiver alguma sujestao ficarei grato

    • andrealveslima disse:

      Olá Diego!

      Desculpe a demora em responder o seu comentário.. É que eu estou de férias e só consegui tirar um tempinho agora para responder as coisas atrasadas..

      Enfim, cara, eu não tenho ideia de como você poderia evitar que essa janela fosse exibida.. Você já pesquisou esse negócio do “copies” e realmente não funciona com impressoras térmicas? Não funciona com nenhuma ou com essa sua especificamente? O que acontece? Ele imprime sempre uma cópia somente? Como é que ficou o seu código?

      Abraço!
      André Lima

  • […] anos atrás eu escrevi um artigo sobre impressão direto na impressora com C#. Esse artigo acabou ficando bastante popular aqui no site, por isso resolvi gravar uma versão em […]

  • Rodrigo Malagodi disse:

    Boa noite André, tudo bem?

    Cara, existe alguma forma de verificar se o Report RDLC foi impresso? Tenho uma aplicação onde o usuário imprime um ticket e depois imprime outro do registro, porém, minha impressora não tem o corte automático e preciso imprimir um ticket, retira-lo manualmente e na sequencia imprimir o segundo ticket.

    Ah, ia me esquecendo. Aplicação em C# Windows Form.

    Muito obrigado.

    • andrealveslima disse:

      Olá Rodrigo!

      Como é que o relatório está sendo impresso? Você exibe o relatório em uma janela de preview ou você imprime ele direto na impressora?

      Abraço!
      André Lima

      • Rodrigo Malagodi disse:

        O report está dentro de um reportviewer dentro de um formulário. Eu tenho 2 reports pra cada pedido: Um que é o rptTickCompleto e o outro que é o rptTickePizzaiolo. Esta é uma parte do código do bnt de fechar o pedido, que pergunta se o usuário quer imprimir o rptTickCompleto:

        //Exibe cupom fiscal
        this.qryImpressaoTicketTableAdapter.qryImpressaoTicket(this.PizzawareDataSet.qryImpressaoTicket, numPedido);
        this.reportViewer1.RefreshReport();

        this.qryTickPizzaioloTableAdapter.qryTicketPizzaiolo(this.PizzawareDataSet.qryTickPizzaiolo, numPedido);
        this.reportViewer2.RefreshReport();

        DialogResult message = MessageBox.Show(“Gostaria de imprimir o cupom de entrega?”, “Pizzaware”, MessageBoxButtons.YesNo, MessageBoxIcon.Question);
        if (message == DialogResult.Yes)
        {
        reportViewer1.PrintDialog();
        KeyPreview = true;
        }
        if (message == DialogResult.No)
        {
        FinalizaPedido();
        }

        Só que tenho o método reportviewer1_PrintingBegin() que também exibe a PrintDialog() do rptTicketPizzaiolo.

        private void reportViewer1_PrintingBegin(object sender, ReportPrintEventArgs e)
        {
        reportViewer1.Visible = false;
        reportViewer1.ShowToolBar = false;
        reportViewer1.ShowPrintButton = false;

        if (Aqui eu pensei em tomada de decisão, mas não sei se é possível)
        {
        reportViewer2.Visible = true;
        reportViewer2.PrintDialog();
        }
        }

        Eu preciso saber se é possível que o sistema confirme a impressão do rptTickCompleto (que é o primeiro a ser impresso) para que o PrintDialog() do rptTicketPizzaiolo seja exibido, pois assim o usuário poderia imprimir um ticket e retira-lo da impressora para depois imprimir o outro.

        Espero não ter deixado muito confuso e desde já lhe agradeço a atenção.

        Abraços…

        • andrealveslima disse:

          Olá Rodrigo!

          Você já tentou utilizar o evento “Print”? Teoricamente esse evento será disparado uma vez que o relatório tiver sido impresso..

          reportViewer1.Print += (s, e) => reportViewer2.PrintDialog();
          

          Abraço!
          André Lima

  • Ramon Shuan disse:

    Ola Andre boa noite!

    Voce teria alguma post referente a impressao de cupom não fiscal?
    tipo preciso configurar as areas de impressao os textos de acordo com a bobina?

    • andrealveslima disse:

      Olá Ramon!

      Infelizmente não tenho experiência nessa área.. Qual seria a impressora que você vai trabalhar? O fornecedor não tem um exemplo em .NET para você ter uma base?

      Abraço!
      André Lima

  • Marco Antonio Pereira disse:

    Boa tarde André,
    Sensacional dica/post, estava procurando a solução de problema pra um cliente. Como sempre muito bem explicado, de forma simples e direta.

    Obrigado por compartilhar conhecimentos, sucesso sempre na sua.

    Deus abençoe.
    Abração

  • Fabrício disse:

    Boa noite André.

    Excelente artigo como sempre.
    Eu estou com um problema, não sei se você poderia me ajudar.
    Eu preciso monitora a fila de impressão e sempre que alguém enviar uma impressão de qualquer software eu preciso mostrar uma mensagem na tela para esse usuário.
    Fiz diversas pesquisas, mas não encontrei nada que possa me ajudar.
    Você tem alguma ideia de como eu possa fazer isso?

    Obrigado.

Deixe uma resposta

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *