Inquiridor
Como usar o printdocument em c#?

Pergunta
-
Tudo bem pessoal,
estou com uma duvida em relação a PrintDocument, eu estou fazendo um software e queria imprimir um contrato, eu estou conseguindo colocar os daods certinho em uma folha, só que quando chega no final da folha eu não consigo inserir mais uma folha e escrever coisas novas nessa nova folha. Eu já proocurei em vários fóruns, inclusive aqui, mas não encontrei algo que resolva o meu problema, falta só isso praticamente para finalizar o software.
Por favor me ajudem.
Desde já agredo pela atenção.
Atenciosamente.
Vinícius Braga Gallo
Todas as Respostas
-
Ok Vinicios, boa noite.
Hmmm.
Vamos esclarecer algumas coisas, para que seu problema seja resolvido o mais rápido possível.
Você usa o System.Drawing.Printing.PrintDocument, essa classe define um objeto reutilizável que envia output para uma impressora, quando impresso de um Windows Form Application.
Esta é a classe ideal para seu caso?
Mas está ocorrendo um erro? Você quer continuar imprimindo na próxima página e não consegue?
Você pode utilizar os eventos:
BeginPrint, EndPrint e PrintPage para saber se tudo está ocorrendo corretamente. Faça impressões aqui para saber se está chegando ao fim, ou se está parando em algum lugar, etc.
Veja que o QueryPageSettings ocorre sempre antes de cada evento PrintPage.
Você pode encontrar todas as informações e também um bom exemplo aqui:
http://msdn.microsoft.com/en-us/library/system.drawing.printing.printdocument.aspx
Você também encontrará aqui um exemplo de como saber o tamanho da página e verificar se a página atual já terminou.
E será impresso na próxima página!
Se este exemplo não te ajudar, você pode incluir parte do código onde faz a impressão para fazermos uma análise.
=DÉ ajudando os outros que ajudamos nos mesmos...
-
O meu código é esse:
e.Graphics.DrawString("Carteira de Identidade nº " + fiad1.RgEsposa + ",", new Font("Times New Roman", 12), new SolidBrush(Color.Black), new Point(220, 830)); e.Graphics.DrawString("CPF " + fiad1.Cpf + ", ambos capazes,", new Font("Times New Roman", 12), new SolidBrush(Color.Black), new Point(480, 830)); e.Graphics.DrawString("residente(s) e domiciliado(s) na " + fiad1.Endereco + ",", new Font("Times New Roman", 12), new SolidBrush(Color.Black), new Point(50, 870)); e.Graphics.DrawString("bairro " + fiad1.Bairro + ",", new Font("Times New Roman", 12), new SolidBrush(Color.Black), new Point(50, 910)); e.Graphics.DrawString("Cep " + fiad1.Cep + ",", new Font("Times New Roman", 12), new SolidBrush(Color.Black), new Point(200, 910)); e.Graphics.DrawString("Cidade " + fiad1.Cidade + ",", new Font("Times New Roman", 12), new SolidBrush(Color.Black), new Point(330, 910)); e.Graphics.DrawString("no Estado " + fiad1.Estado + ".", new Font("Times New Roman", 12), new SolidBrush(Color.Black), new Point(530, 910));
esse é o final do código da primeira folha. Só que quero saber como vai para a próxima folha. E essa folha esteja em branco.
Aguardo respostas.
Até mais.
Vinícius Braga Gallo
-
Define antes os atributos/propriedades da fonte e brush em objetos reutilizáveis e mais legíveis.
Exemplo:
// Texto string strCidade = "Cidade " + fiad1.Cidade + ", "; // Cria a font/brush. Font times12 = new Font("Times New Roman", 12); // voce cria um objeto e usa diversas vezes! SolidBrush brushBlack = new SolidBrush(Color.Black);
Lembre-se que quando houver muita concatenização de strings é aconselhável utilizar o System.Text.StringBuilder.
e.Graphics.DrawString(strCidade, times12, brushBlack, new Point(330, 910));
Há outra coisa que percebi que você não tem controle, é o tamanho da página! Como saberá qual página está enviando a saída se não sabe nem seu tamanho?!
Veja aqui a propriedade RawKind http://msdn.microsoft.com/en-us/library/system.drawing.printing.papersize.rawkind.aspx
Com os tamanhos comuns de papeis.
Veja um exemplo que contém quantidade de páginas:
http://social.msdn.microsoft.com/Forums/pt-BR/vscsharppt/thread/b08c25cb-5176-478e-85dd-1da1ad1aa6e3/Outro
diferente:
http://www.macoratti.net/09/09/c_prn1.htmÉ ajudando os outros que ajudamos nos mesmos...
-
Esse link esta errado.
Vinícius Braga Gallo
-
-
-
Ola Vinicius,
Você deve saber quantas linhas seu documento terá para poder "passar" para outra página, usando o
e.HasMorePages = true;
No exemplo abaixo, eu faço uma consulta no banco e imprimo os dados:
protected void _PrintPage(object sender, System.Drawing.Printing.PrintPageEventArgs e) { Graphics g = e.Graphics; Font FonteLinha = new System.Drawing.Font("Arial", 12); float iLinhasPagina = (e.MarginBounds.Height / FonteLinha.GetHeight(e.Graphics)); float iPosicaoLinha = 0; int iLinhaAtual = 0; //titulo g.DrawString("Listagem", new Font("Verdana", 24, FontStyle.Bold, GraphicsUnit.Point), Brushes.Blue, 360, 15); //linha g.DrawLine(new Pen(Brushes.Black, 3), new Point(15, 60), new Point(830, 60)); //cabeçalho dos campos a serem impressos g.DrawString("ProductName", new Font("Arial", 12, FontStyle.Bold, GraphicsUnit.Point), Brushes.Blue, 15, 85); g.DrawString("QuantityPerUnit", new Font("Arial", 12, FontStyle.Bold, GraphicsUnit.Point), Brushes.Blue, 350, 85); g.DrawString("UnitPrice", new Font("Arial", 12, FontStyle.Bold, GraphicsUnit.Point), Brushes.Blue, 650, 85); while (iLinhaAtual < iLinhasPagina && iTotalRegistros > 0) { iPosicaoLinha = (e.MarginBounds.Top + (iLinhaAtual * FonteLinha.GetHeight(e.Graphics))); g.DrawString(dt.Rows[i]["ProductName"].ToString(), FonteLinha, Brushes.Blue, 15, iPosicaoLinha); g.DrawString(dt.Rows[i]["QuantityPerUnit"].ToString(), FonteLinha, Brushes.Blue, 350, iPosicaoLinha); g.DrawString(decimal.Parse(dt.Rows[i]["UnitPrice"].ToString()).ToString("#,#.00#;(#,#.00#)"), FonteLinha, Brushes.Blue, 720, iPosicaoLinha, new StringFormat(StringFormatFlags.DirectionRightToLeft)); iLinhaAtual += 1; iTotalRegistros -= 1; i += 1; } if (iTotalRegistros > 0) e.HasMorePages = true; else e.HasMorePages = false; //rodapé g.DrawString("Página: " + iPaginaAtual, new Font("Arial", 8), Brushes.Black, 30, e.MarginBounds.Bottom + 30); g.DrawString("Data: " + DateTime.Now.ToString("dd/MM/yyyy"), new Font("Arial", 8), Brushes.Black, 700, e.MarginBounds.Bottom + 30); iPaginaAtual += 1; }
A consulta esta no BeginPrint onde eu indico pra var iTotalRegistros a quantidade de registros retornados pela consulta.
Espero ter ajudado.
Att
-
Como ficaria essa consulta do iTotalRegistros no BeginPrint? Eu fiz um teste aqui o iLinhasPagina esta dando um valor muito grande então nunca vai acabar esse while. E nunca vai dar colocar outra página pois quando chegar no if o iTotalRegistros vai ser igual a zero. Espero que eu tenho conseguido explicar corretamente.
Aguardo respostas.
Vinícius Braga Gallo
- Editado ViniciusCSharp quinta-feira, 15 de março de 2012 16:33 acrescentar duvidas
-
Vinicius, da uma olhada neste link, pode ser que te ajude.
http://www.macoratti.net/09/09/c_prn1.htm
CASO A RESPOSTA TENHA AJUDADO FAVOR MARCAR COMO RESPONDIDA.
-
-
Ola Vinicius,
O while acabará quando as seguintes condições forem aceitas:
iLinhaAtual < iLinhasPagina && iTotalRegistros > 0
A linha atual tem que ser menor que o numero de linhas e a quantidade de registros, tem que ser maior que zero.
Quando a linha atual, for maior que o numero de linhas que vc deverá imprimir na página, o código sai do while, assim na próxima verificação, será criada uma nova página, voltando para o while e assim sucessivamente, até completar a quantidade total de registros.
Sobre o iTotalRegistros, basta atribuir pra ele a quantidade de registros que sua consulta tem.
con = new SqlConnection(@"Data Source=(local)\SQLEXPRESS;Initial Catalog=Northwind;Integrated Security=True");
cmd = new SqlCommand("select ProductName, QuantityPerUnit, UnitPrice from Products", con);
SqlDataAdapter da = new SqlDataAdapter(cmd);
DataSet ds = new DataSet();
da.Fill(ds);
dt = ds.Tables[0];
iTotalRegistros = dt.Rows.Count;
Att
-
Vinicius, tudo bem com você?!
Espero que sim!
E os estudos como estão?!
Acredito que esteja fera em aplicações para console!
Você conseguiu aplicar as sugestões dadas no seu projeto?
Conte nos como conseguiu resolver seu problema ou se ainda possui dúvidas!
Caso alguma dessas respostas te ajudaram na resolução, marque quais foram, assim outras pessoas poderão encontrar a resposta para a mesma dúvida que teve!
Caso não tenha resolvido, poste mais informações, mantenha contato até elaborarmos uma solução (exemplo) clara para seu problema.
;)
É ajudando os outros que nos ajudamos...