// Pode parecer estranho..., mas um site WEB pode imprimir conteudo direto na impressora // Isso pois o aplicativo é simplesmente um programa convencional. // Mas para que isso funciona deve existir uma impressora pdrão conectada ao servidor WEB // É logico que isso não irá funcionar em provedores de hostings, apenas em WEB SERVERs em redes locais protected void btnPrint_Click(object sender, EventArgs e) { // Para imprimir dados vindo de uma tabela de um banco de dados // é preciso definir conexões ao banco, com senhas, executar SELECTs. // Neste exemplo abaixo estou criando 5 registros em memoria e // recalculando o boleto para cada página impressa // Customize de acordo com suas necessidades, pois este é apenas um exemplo // basico por isso serão utilizados apenas poucos campos. blt = new BoletoForm(); tbDados = new DataTable(); // Cria atabela em memoria // Cria as colunas nos respectivos tipos tbDados.Columns.Add("Nome", typeof(string)); tbDados.Columns.Add("Vencimento", typeof(DateTime)); tbDados.Columns.Add("Valor", typeof(double)); tbDados.Columns.Add("NossoNumero", typeof(int)); // insere os dados tbDados.Rows.Add("Fábio", new DateTime(2008, 12, 30), 123.45, 345678); tbDados.Rows.Add("Érika", new DateTime(2008, 7, 25), 60, 12332); tbDados.Rows.Add("Milena", new DateTime(2008, 10, 20), 10.30, 234); tbDados.Rows.Add("Cecília", DateTime.MinValue, 200.55, 456445); tbDados.Rows.Add("qualquer um", new DateTime(2008, 2, 12), 7890.5, 56756); // posiciona o registro atual nReg = 0; PrintDocument pDoc = new PrintDocument(); // ATENÇÃO: IMPORTANTE!!! // ====================== pDoc.PrinterSettings.PrinterName = "EPSON Stylus CX5600 Series"; // É necessário definir o nome da impressora instlada, exatamente com o nome que é exibido no windows. // A impressora do usuários ASPNET é diferente do seu usuários atualmente logado! pDoc.PrintPage += new PrintPageEventHandler(pDoc_PrintPageTabela); pDoc.Print(); }
// Para imprimir uma serie de boletos onde os dados estão vindo de um datatable void pDoc_PrintPageTabela(object sender, PrintPageEventArgs e) { try { //Definição dos dados do sacado(nova isntancia SacadoInfo Sacado = new SacadoInfo(); Sacado.Sacado = (string)tbDados.Rows[nReg]["Nome"]; //Definição das Variáveis do boleto BoletoInfo Boleto = new BoletoInfo(); Boleto.DataVencimento = (DateTime)tbDados.Rows[nReg]["Vencimento"]; Boleto.ValorDocumento = (double)tbDados.Rows[nReg]["Valor"]; Boleto.NossoNumero = tbDados.Rows[nReg]["NossoNumero"].ToString(); Boleto.NumeroDocumento = Boleto.NossoNumero; // Cria uma nova instancia totalmente idependente BoletoForm bol = new BoletoForm(); // monta o boleto com os dados específicos nas classes bol.MakeBoleto(objCedente, objSacado, objBoleto); bol.PrintType = PrintTypes.Documet; // A definição do tipo carne ou normal já define o RenderBoleto bol.Boleto.Carne = chkCarne.Checked; // bol.Boleto.RenderBoleto=new BoletoCarne(); // Na pratica definir como carne é a mesma coisa que instanciar a classe de carne no RenderBoleto PrintRecibo(bol); bol.Print(e.Graphics); nReg++; e.HasMorePages = nReg < tbDados.Rows.Count; if (!e.HasMorePages) { nReg = 0; } } catch (Exception ex) { MessageBox.Show(ex.Message + ex.StackTrace); } }
//// Para imprimir um unico boleto //void pDoc_PrintPageUnico(object sender, PrintPageEventArgs e) //{ // blt.PrintType = PrintTypes.Documet; // blt.Print(e.Graphics); //} // Para imprimir uma serie de boletos onde os dados estão vindo de um datatable void pDoc_PrintPageTabela(object sender, PrintPageEventArgs e) { try { // Definição dos dados do cedente CedenteInfo Cedente = new CedenteInfo(); Cedente.Cedente = "outro cedente!"; Cedente.Banco = "237"; Cedente.Agencia = "1234-5"; Cedente.Conta = "123456-7"; Cedente.Carteira = "06"; Cedente.Modalidade = "11"; // Definição dos dados do sacado SacadoInfo Sacado = new SacadoInfo(); Sacado.Sacado = (string)tbDados.Rows[nReg]["Nome"]; // Definição das Variáveis do boleto BoletoInfo Boleto = new BoletoInfo(); Boleto.DataVencimento = (DateTime)tbDados.Rows[nReg]["Vencimento"]; Boleto.ValorDocumento = (double)tbDados.Rows[nReg]["Valor"]; Boleto.NossoNumero = tbDados.Rows[nReg]["NossoNumero"].ToString(); Boleto.NumeroDocumento = Boleto.NossoNumero; // Cria uma nova instancia totalmente idependente BoletoForm bol = new BoletoForm(); // monta o boleto com os dados específicos nas classes bol.MakeBoleto(Cedente, Sacado, Boleto); bol.PrintType = PrintTypes.Documet; bol.Print(e.Graphics); nReg++; e.HasMorePages = nReg < tbDados.Rows.Count; } catch (Exception) { } }
// Para imprimir um unico boleto void pDoc_PrintPageUnico(object sender, PrintPageEventArgs e) { try { // monta o boleto com os dados específicos nas classes BoletoForm bol = new BoletoForm(); bol.MakeBoleto(objCedente, objSacado, objBoleto); // Redefine para alta qualidade (300dpi) bol.PrintType = PrintTypes.Documet; bol.Boleto.Carne = chkCarne.Checked; PrintRecibo(bol); bol.Print(e.Graphics); // Se usar a mesma instancia é necessário voltar as configurações originais // bltFrm.PrintType = PrintTypes.Image; // bltFrm.Boleto.Escala = Boleto.defaultEscala; } catch (Exception ex) { MessageBox.Show(ex.Message); } }
void PrintRecibo(BoletoForm oBoletoForm) { Boleto blt = oBoletoForm.Boleto; // Aqui não pode conter o clear por causa da impressão que chama o PreRender() antes if (chkExtra.Checked) { int nTop = !blt.Carne && blt.ExibeReciboSacado ? (chkLogo.Checked ? 120 : 110) + 60 : 105; //int nWidth = blt.Carne ? 169 + 50 : 169; blt.CalculaBoleto(); int nWidth = blt.RenderBoleto.Width; //if (chkMaisEspaco.Checked && blt.ExibeReciboSacado) // nTop += 100; //else if (chkMaisEspaco.Checked) // nTop += 50; // As 2 linhas abaixão, dentro desta logica nção é necessário pois quando se define se será carne ou não é criado o layout devido //if (blt.RenderBoleto == null) // blt.RenderBoleto = new BoletoNormal(); // Verifica se os campos já foram criados // Por padrão são criados por ultimo, dentro do render, mas para customizar precisam ser criados antes // Usando as funções internas direta do boleto não é necessário usar //if (blt.RenderBoleto.Count == -1) // blt.RenderBoleto.MakeFields(blt); // Este metodo já checa se existe um objeto de renderização, chamando CalculaBoleto(), e renderizando os campos baiscos // Isso retorna uma instancia de FieldDraw, onde no maximo é possivel definir apenas uma propriedade na mesma linha FieldDraw f; // Linha 1 f=blt.AddFieldDraw(0, 0 + nTop, null, "COMPROVANTE DE ENTREGA DE BOLETO", nWidth - 40, 7); f.Align=StringAlignment.Center; f.Destaque = true; blt.AddFieldDraw(nWidth - 40, 0 + nTop, "Nota Fiscal", "1234").Destaque = true; // Outra forma mais simples de adicionar elementos // Linha 2 // é possivel adicionar linhas diretamente dentro do render Boleto, desde que se tenha feita as checagens anteriores blt.RenderBoleto.Add(new FieldDraw(0, 7 + nTop, "Cliente (Razão social)", blt.Sacado, nWidth, 7, StringAlignment.Near)); // Na pratica a primeira informação adicionar é sempre bom fazer usando o AddFieldDraw, e depois vocês faz como quiser // Linha 3 blt.RenderBoleto.Add(new FieldDraw(0, 14 + nTop, "Nosso Número", blt.NossoNumeroExibicao, nWidth - 80, 7, StringAlignment.Near)); blt.RenderBoleto.Add(new FieldDraw(nWidth - 80, 14 + nTop, "Data de Vencimento", blt.DataVencimento.ToString("dd/MM/yyyy"), 40, 7, StringAlignment.Center)); blt.RenderBoleto.Add(new FieldDraw(nWidth - 40, 14 + nTop, "Valor do Documento", blt.ValorDocumento.ToString("C"))); // Linha 4 - Usando a inclusão direta, só para definir as principais propriedades blt.AddFieldDraw(0, 22 + nTop, "Identificação e assinatura do recebedor", "", nWidth - 80, 10); blt.AddFieldDraw(nWidth - 80, 22 + nTop, "Documento de Identidade", "", 40, 10); blt.AddFieldDraw(nWidth - 40, 22 + nTop, "Data Recebimento", "", 40, 10); } // Depois de tudo 'desenhado' pode-se alterar algo que foi feito // pois na verdade não foi ainda desenhado, e sim montado um array com o que será desenhado if (chkMaisEspaco.Checked) { // Desde que esteja de fato tudo definido blt.CalculaBoleto(); int nSize = blt.RenderBoleto.Count; bool lAchou=false; for(int n=0; n<nSize; n++) { // Acha o campo Demostrativo que ocupa 100% do layout if(blt.RenderBoleto.Get(n).Campo=="Demonstrativo") { lAchou = true; blt.RenderBoleto.Get(n).Campo="Demonstrativo da Cobrança"; // Personaliza o texto blt.RenderBoleto.Get(n).Height+=50; } else if(lAchou) // Desloca tudo adiante em 50 pixel para baixo blt.RenderBoleto.Get(n).Y += 50; } // A logica para aumentar o campo de isntrução é quase a mesma lAchou = false; bool lAchouFim = false; for (int n = 0; n < nSize; n++) { // O que muda é que o campo não tem todo o tamnho do layout então os campos laterais não podem ser empurrados para baixo if (blt.RenderBoleto.Get(n).Campo == BoletoTextos.Instrucoes) { lAchou = true; blt.RenderBoleto.Get(n).Campo = "Instruções para Pagamento"; // Personaliza o texto blt.RenderBoleto.Get(n).Height += 50; } else if (lAchouFim) // Desloca tudo adiante em 50 pixel para baixo blt.RenderBoleto.Get(n).Y += 50; else if(lAchou) { // os campos são inserido em ordem sequencial // então depois de adicionar os elementos laterais, o restante tem que ser deslocado lAchouFim = blt.RenderBoleto.Get(n).X == 0; if (lAchouFim) { blt.RenderBoleto.Get(n).Y += 50; blt.RenderBoleto.Get(n-1).Height += 50; // Aumenta o taamnho do campo anterior } } } } // salva o boleto em uma imagem blt.Save("teste.png"); }
// Para imprimir uma serie de boletos onde os dados estão vindo de um datatable void pDoc_PrintPageTabela(object sender, PrintPageEventArgs e) { try { // Definição dos dados do cedente CedenteInfo Cedente = new CedenteInfo(); Cedente.Cedente = "outro cedente de outro banco!"; Cedente.Banco = "237"; Cedente.Agencia = "1234-5"; Cedente.Conta = "123456-7"; Cedente.Carteira = "06"; Cedente.Modalidade = "11"; // Definição dos dados do sacado SacadoInfo Sacado = new SacadoInfo(); Sacado.Sacado = (string)tbDados.Rows[nReg]["Nome"]; // Definição das Variáveis do boleto BoletoInfo Boleto = new BoletoInfo(); Boleto.DataVencimento = (DateTime)tbDados.Rows[nReg]["Vencimento"]; Boleto.ValorDocumento = (double)tbDados.Rows[nReg]["Valor"]; Boleto.NossoNumero = tbDados.Rows[nReg]["NossoNumero"].ToString(); Boleto.NumeroDocumento = Boleto.NossoNumero; // Cria uma nova instancia totalmente idependente BoletoForm bol = new BoletoForm(); // monta o boleto com os dados específicos nas classes bol.MakeBoleto(Cedente, Sacado, Boleto); bol.PrintType = PrintTypes.Documet; // A definição do tipo carne ou normal já define o RenderBoleto bol.Boleto.Carne = chkCarne.Checked; // bol.Boleto.RenderBoleto=new BoletoCarne(); // Na pratica definir como carne é a mesma coisa que instanciar a classe de carne no RenderBoleto PrintRecibo(bol); bol.Print(e.Graphics); nReg++; e.HasMorePages = nReg < tbDados.Rows.Count; if (!e.HasMorePages) nReg = 0; } catch (Exception ex) { MessageBox.Show(ex.Message); } }
void PrintRecibo(BoletoForm oBoletoForm) { Boleto blt = oBoletoForm.Boleto; // Aqui não pode conter o clear por causa da impressão que chama o PreRender() antes if (chkExtra.Checked) { int nTop = !blt.Carne && blt.ExibeReciboSacado ? (chkLogo.Checked ? 120 : 110) + 60 : 105; //int nWidth = blt.Carne ? 169 + 50 : 169; blt.CalculaBoleto(); int nWidth = blt.RenderBoleto.Width; //if (chkMaisEspaco.Checked && blt.ExibeReciboSacado) // nTop += 100; //else if (chkMaisEspaco.Checked) // nTop += 50; // As 2 linhas abaixão, dentro desta logica nção é necessário pois quando se define se será carne ou não é criado o layout devido //if (blt.RenderBoleto == null) // blt.RenderBoleto = new BoletoNormal(); // Verifica se os campos já foram criados // Por padrão são criados por ultimo, dentro do render, mas para customizar precisam ser criados antes // Usando as funções internas direta do boleto não é necessário usar //if (blt.RenderBoleto.Count == -1) // blt.RenderBoleto.MakeFields(blt); // Este metodo já checa se existe um objeto de renderização, chamando CalculaBoleto(), e renderizando os campos baiscos // Isso retorna uma instancia de FieldDraw, onde no maximo é possivel definir apenas uma propriedade na mesma linha FieldDraw f; // Linha 1 f = blt.AddFieldDraw(0, 0 + nTop, null, "COMPROVANTE DE ENTREGA DE BOLETO", nWidth - 40, 7); f.Align = StringAlignment.Center; f.Destaque = true; blt.AddFieldDraw(nWidth - 40, 0 + nTop, "Nota Fiscal", "1234").Destaque = true; // Outra forma mais simples de adicionar elementos // Linha 2 // é possivel adicionar linhas diretamente dentro do render Boleto, desde que se tenha feita as checagens anteriores blt.RenderBoleto.Add(new FieldDraw(0, 7 + nTop, "Cliente (Razão social)", blt.Sacado, nWidth, 7, StringAlignment.Near)); // Na pratica a primeira informação adicionar é sempre bom fazer usando o AddFieldDraw, e depois vocês faz como quiser // Linha 3 blt.RenderBoleto.Add(new FieldDraw(0, 14 + nTop, "Nosso Número", blt.NossoNumeroExibicao, nWidth - 80, 7, StringAlignment.Near)); blt.RenderBoleto.Add(new FieldDraw(nWidth - 80, 14 + nTop, "Data de Vencimento", blt.DataVencimento.ToString("dd/MM/yyyy"), 40, 7, StringAlignment.Center)); blt.RenderBoleto.Add(new FieldDraw(nWidth - 40, 14 + nTop, "Valor do Documento", blt.ValorDocumento.ToString("C"))); // Linha 4 - Usando a inclusão direta, só para definir as principais propriedades blt.AddFieldDraw(0, 22 + nTop, "Identificação e assinatura do recebedor", "", nWidth - 80, 10); blt.AddFieldDraw(nWidth - 80, 22 + nTop, "Documento de Identidade", "", 40, 10); blt.AddFieldDraw(nWidth - 40, 22 + nTop, "Data Recebimento", "", 40, 10); } // Depois de tudo 'desenhado' pode-se alterar algo que foi feito // pois na verdade não foi ainda desenhado, e sim montado um array com o que será desenhado if (chkMaisEspaco.Checked) { // Desde que esteja de fato tudo definido blt.CalculaBoleto(); int nSize = blt.RenderBoleto.Count; bool lAchou = false; for (int n = 0; n < nSize; n++) { // Acha o campo Demostrativo que ocupa 100% do layout if (blt.RenderBoleto.Get(n).Campo == "Demonstrativo") { lAchou = true; blt.RenderBoleto.Get(n).Campo = "Demonstrativo da Cobrança"; // Personaliza o texto blt.RenderBoleto.Get(n).Height += 50; } else if (lAchou) { // Desloca tudo adiante em 50 pixel para baixo blt.RenderBoleto.Get(n).Y += 50; } } // A logica para aumentar o campo de isntrução é quase a mesma lAchou = false; bool lAchouFim = false; for (int n = 0; n < nSize; n++) { // O que muda é que o campo não tem todo o tamnho do layout então os campos laterais não podem ser empurrados para baixo if (blt.RenderBoleto.Get(n).Campo == BoletoTextos.Instrucoes) { lAchou = true; blt.RenderBoleto.Get(n).Campo = "Instruções para Pagamento"; // Personaliza o texto blt.RenderBoleto.Get(n).Height += 50; } else if (lAchouFim) { // Desloca tudo adiante em 50 pixel para baixo blt.RenderBoleto.Get(n).Y += 50; } else if (lAchou) { // os campos são inserido em ordem sequencial // então depois de adicionar os elementos laterais, o restante tem que ser deslocado lAchouFim = blt.RenderBoleto.Get(n).X == 0; if (lAchouFim) { blt.RenderBoleto.Get(n).Y += 50; blt.RenderBoleto.Get(n - 1).Height += 50; // Aumenta o taamnho do campo anterior } } } } // salva o boleto em uma imagem blt.Save("teste.png"); }