none
Como usar o printdocument em c#? RRS feed

  • 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

    quinta-feira, 8 de março de 2012 18:39

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...

    quinta-feira, 8 de março de 2012 23:08
  • 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

    sexta-feira, 9 de março de 2012 16:54
  • 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); 

    e.Graphics.DrawString(strCidade, times12, brushBlack, new Point(330, 910));
    Lembre-se que quando houver muita concatenização de strings é aconselhável utilizar o System.Text.StringBuilder.

    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...

    sexta-feira, 9 de março de 2012 18:30
  • Eu não entendi como usa o rawkind, eu vi que define o tamanho do papel, mas como utlizá-lo para ir para a próxima folha.

    Aguardo respostas.


    Vinícius Braga Gallo

    sábado, 10 de março de 2012 17:00
  • Alguém sabe como fazer para imprimir em c# sem usar o printdocument. Alguma outra ferramenta.

    Aguardo respostas.


    Vinícius Braga Gallo

    segunda-feira, 12 de março de 2012 15:13
  • 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

    quinta-feira, 15 de março de 2012 14:47
  • 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
    quinta-feira, 15 de março de 2012 14:59
  • 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.

    quinta-feira, 15 de março de 2012 17:52
  • eu ja vi isso mas não me ajudou.

    Aguardo respostas.


    Vinícius Braga Gallo

    quinta-feira, 15 de março de 2012 18:06
  • 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

    quinta-feira, 15 de março de 2012 20:15
  • 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...

    terça-feira, 7 de agosto de 2012 20:48