Usuário com melhor resposta
Mandar varios arquivos para impressora

Pergunta
-
Olá pessoal, estou com o seguinte problema
Tenho um sistema que gera varios arquivos .doc e .html e preciso que no final dessa "geraçao" ele imprima todos esses documentos que foram gerados (na sequencia, normalmente sao muitos)...
a principio minha "impressao" está assim:
//listaArquivos é um arrayList que contem a string do caminho //do arquivo a ser impresso foreach (string arquivo in listaArquivos) { ShellExecuteA(this.Handle.ToInt32(), "print", arquivo, null, null, 0); } [System.Runtime.InteropServices.DllImport("shell32.dll", EntryPoint = "ShellExecute")] public static extern int ShellExecuteA(int hwnd, string lpOperation, string lpFile, string lpParameters, string lpDirectory, int nShowCmd);
Isso funciona, porém para cada arquivo que for imprimir, aparece a caixa de impressora, onde seleciona a impressora e coloca pra imprimir... como normalmente sao muitos arquivos, e necessario ter que escolher a impressora varias vezes., entao essa forma nao resolve meu problema.
Preciso de uma forma de mandar varios arquivos para impressora, onde o usuario seleciona a impressora apenas uma vez.
Procurei conteudo na internet mas nenhum me ajudou.
Obrigado!
Ao infinito e além!
Respostas
-
Olá,
A principio essa classe postada acima funcionou, porém ela da erro quando o arquivo está sendo impresso (erro na impressão) e acaba não imprimindo nada.
Porém, achei uma solução, postarei abaixo caso alguem tenha o mesmo problema que eu.
A soluçao foi bem simples usei o PrintDocument, acontece que ja tinha usado antes, mas ele nao funcionava, imprimia arquivos em branco, mas agora estou usando um metodo que eu achei na internet, que lê o arquivo text e joga na propiedade do PrintDocument, dessa forma a impressao funciona.
private Font lucida10font; private StreamReader reader; //listaArquivos é uma array com o caminho do arquivo //qtde é quantos arquivos serão impressos for (int i = 0; i <= Qtde; i++) { string filename = listaProvas[i].ToString(); reader = new StreamReader(filename); lucida10font = new Font("Lucida", 10); PrintDocument pd = new PrintDocument(); pd.PrintPage += new PrintPageEventHandler(this.PrintTextFileHandler); pd.DocumentName = "Prova " + i.ToString(); pd.Print(); if (reader != null) reader.Close(); } //metodo que eu achei na net, necessario pra imprimir private void PrintTextFileHandler(object sender, PrintPageEventArgs ppeArgs) { //Get the Graphics object Graphics g = ppeArgs.Graphics; float linesPerPage = 0; float yPos = 0; int count = 0; //Read margins from PrintPageEventArgs float leftMargin = ppeArgs.MarginBounds.Left; float topMargin = ppeArgs.MarginBounds.Top; string line = null; //Calculate the lines per page on the basis of the height of the page and the height of the font linesPerPage = ppeArgs.MarginBounds.Height / lucida10font.GetHeight(g); //Now read lines one by one, using StreamReader while (count < linesPerPage && ((line = reader.ReadLine()) != null)) { //Calculate the starting position yPos = topMargin + (count * lucida10font.GetHeight(g)); //Draw text g.DrawString(line, lucida10font, Brushes.Black, leftMargin, yPos, new StringFormat()); //Move to next line count++; } //If PrintPageEventArgs has more pages to print if (line != null) { ppeArgs.HasMorePages = true; } else { ppeArgs.HasMorePages = false; } }
Desta forma são impressos todos os arquivos sem chamar a impressora toda hora.
Obrigado!
Ao infinito e além!- Marcado como Resposta Fabio R. Luz sábado, 4 de setembro de 2010 10:07
Todas as Respostas
-
Fábio,
Veja se o conteúdo deste link te ajuda em algo:
http://support.microsoft.com/kb/322091/en-gb
Um dos métodos implementa a impressão de um arquivo em que você pode passar o nome da impressora a utilizar...
André Alves de Lima
Visite o meu site: http://andrealveslima.spaces.live.com
Me siga no Twitter: @andrealveslima- Marcado como Resposta Fabio R. Luz sábado, 4 de setembro de 2010 10:13
- Não Marcado como Resposta Fabio R. Luz sábado, 4 de setembro de 2010 10:13
-
Olá,
A principio essa classe postada acima funcionou, porém ela da erro quando o arquivo está sendo impresso (erro na impressão) e acaba não imprimindo nada.
Porém, achei uma solução, postarei abaixo caso alguem tenha o mesmo problema que eu.
A soluçao foi bem simples usei o PrintDocument, acontece que ja tinha usado antes, mas ele nao funcionava, imprimia arquivos em branco, mas agora estou usando um metodo que eu achei na internet, que lê o arquivo text e joga na propiedade do PrintDocument, dessa forma a impressao funciona.
private Font lucida10font; private StreamReader reader; //listaArquivos é uma array com o caminho do arquivo //qtde é quantos arquivos serão impressos for (int i = 0; i <= Qtde; i++) { string filename = listaProvas[i].ToString(); reader = new StreamReader(filename); lucida10font = new Font("Lucida", 10); PrintDocument pd = new PrintDocument(); pd.PrintPage += new PrintPageEventHandler(this.PrintTextFileHandler); pd.DocumentName = "Prova " + i.ToString(); pd.Print(); if (reader != null) reader.Close(); } //metodo que eu achei na net, necessario pra imprimir private void PrintTextFileHandler(object sender, PrintPageEventArgs ppeArgs) { //Get the Graphics object Graphics g = ppeArgs.Graphics; float linesPerPage = 0; float yPos = 0; int count = 0; //Read margins from PrintPageEventArgs float leftMargin = ppeArgs.MarginBounds.Left; float topMargin = ppeArgs.MarginBounds.Top; string line = null; //Calculate the lines per page on the basis of the height of the page and the height of the font linesPerPage = ppeArgs.MarginBounds.Height / lucida10font.GetHeight(g); //Now read lines one by one, using StreamReader while (count < linesPerPage && ((line = reader.ReadLine()) != null)) { //Calculate the starting position yPos = topMargin + (count * lucida10font.GetHeight(g)); //Draw text g.DrawString(line, lucida10font, Brushes.Black, leftMargin, yPos, new StringFormat()); //Move to next line count++; } //If PrintPageEventArgs has more pages to print if (line != null) { ppeArgs.HasMorePages = true; } else { ppeArgs.HasMorePages = false; } }
Desta forma são impressos todos os arquivos sem chamar a impressora toda hora.
Obrigado!
Ao infinito e além!- Marcado como Resposta Fabio R. Luz sábado, 4 de setembro de 2010 10:07