none
Problema ao imprimir mais páginas com PrintDocument C# RRS feed

  • Pergunta

  • Eu não estou conseguindo imprimir mais páginas. Estou fazendo a impressão via código. Já tentei vários exemplos mas nenhum funciona.

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Windows.Forms;
    using System.Drawing.Printing;
    using GPrint.controller;
    using System.Data.Common;
    using System.Drawing;
    
    namespace GPrint.model
    {
        class Impressao
        {
            //'define os objetos printdocument e os eventos associados
            PrintDocument pd = new PrintDocument();
            int paginaAtual = 1;
            //define o objeto para visualizar a impressao
            private PrintPreviewDialog objPrintPreview = new PrintPreviewDialog();
            //private DbDataReader Leitor;
            //private DB banco;
            public ListView lista;
    
            public void imprimir()
            {
    
                pd.PrintPage += new PrintPageEventHandler(this.Pd_PrintPage);
                pd.DefaultPageSettings.Landscape = true;
                objPrintPreview.Document = this.pd;
                objPrintPreview.WindowState = FormWindowState.Maximized;
                objPrintPreview.PrintPreviewControl.Zoom = 1;
                objPrintPreview.Text = "Impressões por dia";
                objPrintPreview.ShowDialog();
    
            }
    
    
            private void Pd_PrintPage(object sender, PrintPageEventArgs e)
            {
    
                //Variaveis das linhas
                Single LinhasPorPagina = 0;
                Single PosicaoDaLinha = 0;
                int LinhaAtual = 0;
    
                //Título
                string titulo = "Impressões por dia";
    
                //Variáveis das margens
                Single MargemEsquerda = e.MarginBounds.Left;
                Single MargemSuperior = e.MarginBounds.Top + 40;
                Single MargemDireita = e.MarginBounds.Right;
                Single MargemInferior = e.MarginBounds.Bottom;
    
                //classe Pen define um objeto usado para definir linhas e curvas
                Pen CanetaDaImpressora = new Pen(Color.Black, 1);
                //int MargemCentro = (e.MarginBounds.Width - titulo.Length / 2);
                //MessageBox.Show("" + MargemCentro);
    
                //VARIÁVEIS PARA OS CAMPOS QUE APARECERÃO NA TELA
                //DateTime Data1;
                //string Nomes;
                string impressora;
                string nomeDoc;
                //string status;
                string qtdPaginas;
                string proprietario;
                string tamanhoKB;
                string enviado;
                string tamanhoPapel;
    
                //Variaveis das fontes
                Font FonteNegrito;
                Font FonteTitulo;
                Font FonteSubTitulo;
                Font FonteRodape;
                Font FonteNormal;
                Font FonteGrande;
    
                //define efeitos em fontes
                FonteNegrito = new Font("Arial", 10, FontStyle.Bold);
                FonteTitulo = new Font("Arial", 20, FontStyle.Bold);
                FonteSubTitulo = new Font("Arial", 12, FontStyle.Bold);
                FonteRodape = new Font("Arial", 8);
                FonteNormal = new Font("Arial", 8);
                FonteGrande = new Font("Arial", 14);
    
                //define valores para linha atual e para linha da impressao
                LinhaAtual = 0;
                //int L = 0;
    
                //Linhas do Cabeçalho
                e.Graphics.DrawLine(CanetaDaImpressora, MargemEsquerda - 80, 40, MargemDireita + 80, 40);
                e.Graphics.DrawLine(CanetaDaImpressora, MargemEsquerda - 80, 90, MargemDireita + 80, 90);
    
                //nome do título
                //MargemEsquerda + 0
                e.Graphics.DrawString(titulo, FonteTitulo, Brushes.Black, MargemEsquerda, 50, new StringFormat());
    
                //e.Graphics.DrawLine(CanetaDaImpressora, MargemEsquerda - 80, 90, MargemDireita + 80, 90);
                LinhasPorPagina = Convert.ToInt32(e.MarginBounds.Height / FonteGrande.GetHeight(e.Graphics) - 10);
                
                //Aqui são lidos os dados
                //string impressora;string nomeDoc;string status;string qtdPaginas;string proprietario;
                //string tamanhoKB;string enviado;string tamanhoPapel;
                e.Graphics.DrawString("Impressora", FonteNegrito, Brushes.Black, MargemEsquerda - 80, 100, new StringFormat());
                e.Graphics.DrawString("Nome do documento", FonteNegrito, Brushes.Black, MargemEsquerda + 190, 100, new StringFormat());
                //e.Graphics.DrawString("Status", FonteNegrito, Brushes.Black, MargemEsquerda + 350, 100, new StringFormat());
                e.Graphics.DrawString("QTD Pag.", FonteNegrito, Brushes.Black, MargemEsquerda + 450, 100, new StringFormat());
                e.Graphics.DrawString("Proprietário", FonteNegrito, Brushes.Black, MargemEsquerda + 520, 100, new StringFormat());
                e.Graphics.DrawString("Tamanho(KB)", FonteNegrito, Brushes.Black, MargemEsquerda + 650, 100, new StringFormat());
                e.Graphics.DrawString("Enviado", FonteNegrito, Brushes.Black, MargemEsquerda + 750, 100, new StringFormat());
                e.Graphics.DrawString("Tam. Papel", FonteNegrito, Brushes.Black, MargemEsquerda + 870, 100, new StringFormat());
    
                e.Graphics.DrawLine(CanetaDaImpressora, MargemEsquerda - 80, 120, MargemDireita + 80, 120);
                //while (LinhaAtual < LinhasPorPagina && Leitor.Read())
                int i = 0;
                //LinhasPorPagina = 25;
                //LinhasPorPagina = 28;&& i < lista.Items.Count
                //paginaAtual = 1;
                //LinhaAtual < LinhasPorPagina &&
                while (i < lista.Items.Count)
                {
    
                    //string impressora;string nomeDoc;string status;string qtdPaginas;string proprietario;
                    //string tamanhoKB;string enviado;string tamanhoPapel;
    
                    impressora = lista.Items[i].SubItems[0].Text;
                    nomeDoc = lista.Items[i].SubItems[1].Text;
                    //status = lista.Items[i].SubItems[2].Text;
                    qtdPaginas = lista.Items[i].SubItems[3].Text;
                    proprietario = lista.Items[i].SubItems[4].Text;
                    tamanhoKB = lista.Items[i].SubItems[5].Text;
                    enviado = lista.Items[i].SubItems[6].Text;
                    tamanhoPapel = lista.Items[i].SubItems[7].Text;
    
                    PosicaoDaLinha = MargemSuperior + Convert.ToInt32(LinhaAtual * FonteGrande.GetHeight(e.Graphics));
    
                    e.Graphics.DrawString(impressora, FonteNormal, Brushes.Black, MargemEsquerda - 80, PosicaoDaLinha, new StringFormat());
                    e.Graphics.DrawString(nomeDoc, FonteNormal, Brushes.Black, MargemEsquerda + 190, PosicaoDaLinha, new StringFormat());
                    //e.Graphics.DrawString(status, FonteNormal, Brushes.Black, MargemEsquerda + 350, PosicaoDaLinha, new StringFormat());
                    e.Graphics.DrawString(qtdPaginas, FonteNormal, Brushes.Black, MargemEsquerda + 490, PosicaoDaLinha, new StringFormat());
                    e.Graphics.DrawString(proprietario, FonteNormal, Brushes.Black, MargemEsquerda + 520, PosicaoDaLinha, new StringFormat());
                    e.Graphics.DrawString(tamanhoKB, FonteNormal, Brushes.Black, MargemEsquerda + 670, PosicaoDaLinha, new StringFormat());
                    e.Graphics.DrawString(enviado, FonteNormal, Brushes.Black, MargemEsquerda + 750, PosicaoDaLinha, new StringFormat());
                    e.Graphics.DrawString(tamanhoPapel, FonteNormal, Brushes.Black, MargemEsquerda + 870, PosicaoDaLinha, new StringFormat());
                    LinhaAtual += 1;
                    i++;
                }
    
                //Rodape
                e.Graphics.DrawLine(CanetaDaImpressora, MargemEsquerda - 80, MargemInferior + 50, MargemDireita + 80, MargemInferior + 50);
                e.Graphics.DrawString(System.DateTime.Now.ToString(), FonteRodape, Brushes.Black, MargemEsquerda, MargemInferior + 60, new StringFormat());
    
                LinhaAtual += Convert.ToInt32(FonteGrande.GetHeight(e.Graphics));
                LinhaAtual += 1;
    
                e.Graphics.DrawString("Página : " + paginaAtual, FonteRodape, Brushes.Black, MargemDireita - 50, MargemInferior + 60, new StringFormat());
    
                //Incrementa o número da pagina
                paginaAtual += 1;
    
                if (LinhaAtual > LinhasPorPagina)
                {
                    e.HasMorePages = true;
                }
                else
                {
                    e.HasMorePages = false;
                }
    
            }
    
        }
    }

    Agora o código para colocar no botão

     Impressao impressao = new Impressao();
                impressao.lista = this.listViewDados;
                impressao.imprimir();

    Estou imprimindo o conteúdo de um ListView.

    Eu percebi que se eu colocar return dentro de e.HasMorePages=true; ele faz novamente e imprime outra página, mas sóque imprime tudo de novo, ele não continua a impressão do registro que ele parou. Preciso de ajuda.

    quinta-feira, 1 de outubro de 2015 10:39

Respostas

  • Olá Marcos, tudo bem?

    Você precisa de alguma forma guardar no nível da classe o texto/registro que está faltando imprimir.. Coincidentemente eu publiquei um exemplo de impressão com PrintDocument ONTEM no meu site, onde eu mostro também como imprimir mais de uma página:

    Impressão direto na impressora com C#


    André Alves de Lima
    Microsoft MVP - Client App Dev
    Visite o meu site: http://www.andrealveslima.com.br
    Me siga no Twitter: @andrealveslima

    • Marcado como Resposta Marcos SJ quinta-feira, 1 de outubro de 2015 12:26
    quinta-feira, 1 de outubro de 2015 11:39
    Moderador
  • Agora eu consegui resolver. Eu declarei a variável i como pública. Ela conta a posição do registro e mesmo se tiver mais páginas imprime de onde parou e também eu estava fazendo a lógica errada.

    Eu troque no loop while o código

    while (i < lista.Items.Count)

    por

     while (i < lista.Items.Count && LinhaAtual < LinhasPorPagina)

    e também troquei

     if (LinhaAtual > LinhasPorPagina)
                {
                    e.HasMorePages = true;
                }
                else
                {
                    e.HasMorePages = false;
                }

    por

    if (i + 1 > LinhasPorPagina && i < LinhaAtual)
                {
                    e.HasMorePages = true;                
                }
                else
                {
                    e.HasMorePages = false;
                }
    Sendo que declarei a variável int i como pública e assim imprime de onde parei.

    • Marcado como Resposta Marcos SJ segunda-feira, 5 de outubro de 2015 14:12
    sexta-feira, 2 de outubro de 2015 01:32

Todas as Respostas

  • Olá Marcos, tudo bem?

    Você precisa de alguma forma guardar no nível da classe o texto/registro que está faltando imprimir.. Coincidentemente eu publiquei um exemplo de impressão com PrintDocument ONTEM no meu site, onde eu mostro também como imprimir mais de uma página:

    Impressão direto na impressora com C#


    André Alves de Lima
    Microsoft MVP - Client App Dev
    Visite o meu site: http://www.andrealveslima.com.br
    Me siga no Twitter: @andrealveslima

    • Marcado como Resposta Marcos SJ quinta-feira, 1 de outubro de 2015 12:26
    quinta-feira, 1 de outubro de 2015 11:39
    Moderador
  • Agora eu consegui resolver. Eu declarei a variável i como pública. Ela conta a posição do registro e mesmo se tiver mais páginas imprime de onde parou e também eu estava fazendo a lógica errada.

    Eu troque no loop while o código

    while (i < lista.Items.Count)

    por

     while (i < lista.Items.Count && LinhaAtual < LinhasPorPagina)

    e também troquei

     if (LinhaAtual > LinhasPorPagina)
                {
                    e.HasMorePages = true;
                }
                else
                {
                    e.HasMorePages = false;
                }

    por

    if (i + 1 > LinhasPorPagina && i < LinhaAtual)
                {
                    e.HasMorePages = true;                
                }
                else
                {
                    e.HasMorePages = false;
                }
    Sendo que declarei a variável int i como pública e assim imprime de onde parei.

    • Marcado como Resposta Marcos SJ segunda-feira, 5 de outubro de 2015 14:12
    sexta-feira, 2 de outubro de 2015 01:32