Tem certas ocasiões que é preciso imprimir, usando o Delphi, sem passar pelo driver de impressão do fabricante. Podemos citar, por exemplo, a impressão de etiquetas em impressoras térmicas ou ainda usar impressoras não-fiscais de 40 colunas que utilizam bobina. Um outro exemplo seria a impressão em impressoras matriciais em modo rascunho. Se você utilizar o driver do fabricante, o mesmo acabará imprimindo o que você deseja em modo gráfico – muuuiiitoo mais lento!

Normalmente o pessoal faz isso acessando diretamente a porta da impressora com um AssignFile ou AssignPrn. Segue abaixo um exemplo:

Ok! O código acima funciona até certo ponto. Os problemas começam a aparecer quando você necessita cuidar do estado do dispositivo. Imagine que você tenha que imprimir mutia coisa. O seu programa ficará preso até que a impressora libere-o. Ou ainda você terá que se preocupar em criar um mecanismo de seleção de portal – o código acima está fixo LPT1. Ou pior, o seu cliente compra uma impressora USB. Daí o seu mundo acabou, pois com o código acima não é possível imprimir. Você teria que fazer uma bela enjambra para acessar a porta USB como se fosse um compartilhamento de rede.

Mas então qual seria a alternativa para continuar tendo controle do que será enviado para a impressora sem ter que se preocupar com toda essa infra?

A alternativa seria acessar o Gerenciar de Impressões do Windows utilizando as funções da Unit WinSpool. Veja abaixo um código mostrando a estrutura básica para isso:

A título de ilustração eu criei duas variáves chamadas TextoUnicode e TextoAnsiString. É que o string do Delphi XE agora é Unicode e as funções do WinSpool esperam AnsiString. Obviamente no seu código original você pode fazer uma função mais simples pra tratar esta situação.

O código acima serviu de base para a correção de componente que eu estou dando manutenção. Para conhecer um pouco mais o projeto acesse https://github.com/cesarjr/RSPrint.

É isso aí!