none
Mandar varios arquivos para impressora RRS feed

  • 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!
    quarta-feira, 1 de setembro de 2010 23:18

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
    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
    quinta-feira, 2 de setembro de 2010 23:58
    Moderador
  • 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
    sábado, 4 de setembro de 2010 10:07