30 09 2015
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
Periscope replay: 3 importantes lições que eu aprendi com o livro “Do The Work” (Steven Pressfield) Periscope replay: Programadores(as), 3 dicas rápidas para deixar o seu código mais limpo
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 ?
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
Boa noite Andre. Gostaria de saber como faço para imprimir esse texto direto em em uma impressora termica nao fiscal?
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
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.
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
E isso mesmo meu amigo mais uma vez muito obrigado.
Beleza Francisco!
Qualquer coisa se você ficar com alguma dúvida, entre em contato novamente..
Abraço!
André Lima
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?
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
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.
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
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.
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
Ô 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!
Valeu Leonardo!
Maravilha! Boa sorte aí no desenvolvimento e muito sucesso pra vc!
Abraço!
André Lima
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,
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
boa tarde,amigo tem como imprimir o form inteiro ?
Olá Danilo!
É possível sim.. Aqui tem um exemplo, veja só:
How to: Print a Windows Form
Qualquer coisa se você não conseguir adaptar no seu projeto, é só avisar..
Abraço!
André Lima
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?
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 […]
Olá André boa tarde, você saberia me dizer como eu envio um report.rdcl montado para a impressora direto sem o preview?
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
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!!!
Olá novamente, Diego! Obrigado pelo retorno! Fico feliz que tenha funcionado.. :)
Abraço!
André Lima
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.
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
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.
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
Olá Fabio!
Conseguiu resolver esse problema? O link do StackOverflow ajudou em algo?
Abraço!
André Lima
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á.
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 […]
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
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 […]
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.
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
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…
Olá Rodrigo!
Você já tentou utilizar o evento “Print”? Teoricamente esse evento será disparado uma vez que o relatório tiver sido impresso..
Abraço!
André Lima
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?
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
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
Olá Marco, muito obrigado pelo comentário! Que bom que você gostou.. :)
Abraço!
André Lima
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.
Olá Fabrício, muito obrigado pelo comentário!
Quanto à sua dúvida, eu nunca precisei fazer isso, mas veja se este artigo te ajuda:
Monitor jobs in a printer queue (.NET)
Abraço!
André Lima