Depois de alguns dias pesquisando, encontrei algumas soluções viáveis para enviar um arquivo diretamente para a impressora (sem abrir janelas de diálogo), cada uma com suas limitações.
Solução 1: Fazer uma cópia do arquivo para o local da impressora
No prompt do DOS basta utilizar o comando:
copy nome_arquivo nome_impressora
O equivalente em C# é:
System.IO.File.Copy(nome_arquivo , nome_impressora);
Onde nome_arquivo é o nome físico completo do arquivo e nome_impressora é o nome do compartilhamento da impressora composto pelo IP ou nome da máquina mais o nome do compartilhamento.
Limitação: Imprime somente arquivos texto e a impressora deverá estar compartilhada.
Solução 2: Utilizar o comando print do windows.
Esta foi a melhor solução que encontrei. A idéia é utilizar o comando “print” do shell do Windows. Ao executar o comando, o Windows irá abrir o programa padrão estabelecido pelo tipo do arquivo e imprimir automaticamente, fechando o programa após a impressão.
Em Delphi utiliza-se o comando ShellExecute para executar um comando shell.
ShellExecute(Handle, 'print',PChar('arquivo'), nil,nil,SW_SHOW);
No Framework .Net não existe esta função, no entanto ela está implementada na dll shell32.dll do Windows. Para utiliza-la em C#, VB6 ou VB .Net devemos criar uma referência para a mesma.
[DllImport("shell32.dll", EntryPoint = "ShellExecute")] public static extern int ShellExecuteA(int hwnd, string lpOperation, string lpFile, string lpParameters, string lpDirectory, int nShowCmd);
Para utilizar a directiva DllImport é preciso referênciar o namespace System.Runtime.InteropServices.
Veja o exemplo a seguir utilizado em um projeto do tipo Windows Application.
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Text; using System.Windows.Forms; using System.Runtime.InteropServices; namespace ImprimeArquivo { public partial class Form1 : Form { public Form1() { InitializeComponent(); } private void button1_Click(object sender, EventArgs e) { OpenFileDialog ofd = new OpenFileDialog(); if (ofd.ShowDialog() == DialogResult.OK) { Form1.ShellExecuteA(this.Handle.ToInt32(), "print", ofd.FileName, null, null, 0); } } [DllImport("shell32.dll", EntryPoint = "ShellExecute")] public static extern int ShellExecuteA(int hwnd, string lpOperation, string lpFile, string lpParameters, string lpDirectory, int nShowCmd); } }
Solução 3: http://support.microsoft.com/kb/322091/pt-br
