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