quarta-feira, 30 de janeiro de 2008

Java - Como imprimir na Epson LX-300 via LPT1 - Parte 1

Introdução (e desabafo)
OK. Pessoal. Espero que isso valha alguma coisa porque me deu muita dor de cabeça. Pode parecer algo idiota para alguns, mas o problema é que varri essa tal de Internet, em inglês, português e alemão e não houve alma que conseguisse me dar uma resposta satisfatória. Então, após muitas horas de pesquisa e de juntar pedaços daqui e dali, eis o resultado.

Veja o código abaixo
//Inicio do código
import java.io.FileOutputStream;
import java.io.PrintStream;

public class Impressao {
public static void main(String[] args) {
FileOutputStream fos = null;
PrintStream ps = null;
try{
fos = new FileOutputStream("LPT1:");
} catch (Exception ex) {
}
try {
ps = new PrintStream(fos);
} catch (Exception exception) {
}
ps.print("Coloque aqui o que você quer imprimir");

}
}
//Fim do código

Caso a sua porta não seja a LPT1, basta passar outra como argumento.

Lista de Alguns Códigos ESC/P e Seus Usos
A idéia é enviar comandos do software da impressora (ESC/P) diretamente para a porta em uso, no nosso exemplo, a LPT1. Abaixo segue uma lista de alguns códigos bastante úteis.

Exemplo: ps.print("\u001B\u0043" + (char)36);
Resultado: Especifica o tamanho da página em linhas. Neste caso, a página possui 36 linhas. É possível especificar de 1 a 127 linhas por página.

Exemplo: ps.print("\u001B\u0032");
Resultado: Espaçamento de linha default: 1/6 de polegada. Existem outras opções de espaçamento de linhas.

Exemplo: ps.print("\u001B" + "\r");
Resultado: Retorna o carro da impressora.

Exemplo: ps.print("\u001B\u004A" + (char)200);
Resultado: Avanço vertical. Move a posição verticalmente n/216 polegadas. No exemplo acima, isso equivale a 200/216 = 0,9259, ou seja, 2,35cm.

Exemplo: ps.print("\u001B" + "E");
Resultado: Modo enfatizado (negrito);

Exemplo: ps.print("\u001B" + "F");
Resultado: Desativa o modo enfatizado.

Há uma arquivo com todos os códigos disponíveis em:
http://www.epson.co.uk/support/manuals/pdf/ESCP/Part_1.pdf
http://www.epson.co.uk/support/manuals/pdf/ESCP/Part_2.pdf

Com usar esta referência?
Nos links passados acima, você encontrará a referência dos códigos ESC/P para a impressora Epson LX-300, mas como usar este material. Veja um exemplo:

O que você encontrará na referência é algo assim:

ESC J Advance print position vertically
Format
ASCII ESC J n
Hex 1B 4A n
Decimal 27 74 n

Como usar?
- O código ASCII seria: ESC J n
- O código Hex seria: 1B 4A n
- O código decimal seria: 27 74 n

Eu usei o código Hexa. Veja o exemplo abaixo:

ps.print("\u001B\u004A" + (char)120);

Com a linha acima, haverá um avanço vertical do carro de 120/216 polegadas. No código acima:
ps = instância de PrintStream
print = método do objeto
\u001B = hexa para ESC
\u004A = hexa para J
(char)120 = o valor de 'n'.

Faça alguns testes. Espero que apreciem.

8 comentários:

Anônimo disse...

Consigo colocar isto num script, para fazer o browser imprimir texto na lpt1?

Anônimo disse...

cara funcionou direitinho aqui era tudo que eu tava atras e faz tempo, so que encontrei o problema que a porta da impressora fica ocupada mas tudo bem isso resolvo com o tempo valeu

chimarrao disse...

cara, maravilha de artigo! queria ter encontrado ele antes, teria me poupado muito tempo... vlw pessoal!

Unknown disse...

Te devo uma cerveja geladíssima! pode cobrar!

Gyowanny disse...

Rapaz,

ótimo artigo, show de bola!

Obrigado por compartilhar tal conhecimento, está sendo de extrema utilidade. Tenho um blog em inglês, então gostaria de saber se eu poderia traduzí-lo (caso ja nao o tenha feito)?

Abraços

Unknown disse...

Como posso alterar o espaçamento entre as linhas ? este eh o default \u001B\u0032...como faço para diminuir ?

Anônimo disse...

que gambiarra velho! Já ouviu falar em padrões de projeto?

Anônimo disse...

Belo Artigo !
Esta função funciona apenas para Aplicações Swing, para WEB temos que fazer uma APPLET.

Fiz uma para impressão no I9 e Chrome, segue link:
http://www.veloso.adm.br/DirectPrint.html