Usuário com melhor resposta
Problema ao imprimir mais páginas com PrintDocument C#

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