18 de out de 2012

Faça seu próprio driver de impressora usb no Linux

Alguns programadores estão familiarizadas com o uso de impressoras usando a porta direta /dev/lp0 ou porta USB /dev/usb/lp0. Mas essa funcionalidade parecia que havia deixado de existir no Ubuntu 12.04. Na verdade ela apenas foi desabilitada por padrão.


Objetivo


Mas qual a finalidade de se usar a porta diretamente? Esse foi exatamente o motivo pelo qual essa opção foi desabilitada. Os drivers de impressão junto com o CUPS já estão suficientemente muito bons e dão conta de instalar e configurar impressoras apenas conectando-as.

Mas caso você tenha necessidade de escrever diretamente na impressora, seja por falta do driver ou se você é programador e quer usar a impressora a partir de sua aplicação, aqui é o lugar.

Impressora na porta paralela


Essa é a parte fácil. Caso você tenha uma impressora que se conecte na porta paralela,
como a Epson LX 300 (+/II), apenas abra um terminal e siga as instruções:

$ sudo su
# echo ola, mundo > /dev/lp0

Escrever como usuário comum


Note que precisamos logar como root (super usuário) para escrever diretamente na impressora. Mas podemos melhorar isso adicionando nosso usuário no grupo lp. Para isso suponha que o nome do usuário seja mad3linux. Abra um terminal e:

$ sudo su

Verifique em quais grupos você está:

# groups mad3linux

Para adicionar um usuário em um grupo, é necessário adicionar em todos os grupos anteriores e ao novo grupo. Para isso use os grupos listados no comando acima e faça:

# usermod -a -G mad3linux,adm,cdrom,sudo,sambashare,lpadmin,lp mad3linux

Neste exemplo eu mostrei alguns prováveis grupos ao qual um usuário administrador
faz parte. Note no final o grupo lp e depois o nome do usuário. A sintaxe genérica seria:

# usermod -a -G grupo1,grupo2,grupo3 usuario

Após isso já é possível imprimir diretamente com seu usuário. Saia do usuário root e tente imprimir novamente:

# exit
$ echo ola, mundo > /dev/lp0

Impressora na porta USB


Para habilitar a porta usb primeiro temos que modificar o arquivo /etc/modules. Este arquivo contém os nomes dos módulos do kernel que deverão ser carregados ao iniciar.

Você verá que o módulo lp já está habilitado. Agora basta adicionar mais uma linha com o módulo usblp. Ao final o arquivo deve estar dessa maneira:

# /etc/modules: kernel modules to load at boot time.
#
# This file contains the names of kernel modules that should be loaded
# at boot time, one per line. Lines beginning with "#" are ignored.

lp
usblp

É provável que seja necessário reiniciar já que os módulos são carregados no boot. Conecte uma impressora na porta USB e faça o teste para ver se aparece a porta:

$ ls /dev/usb/lp0

Esse comando retorna o caminho passado como parâmetro indicando que existe.

Adicione o grupo usblp


Para escrever diretamente temos que fazer o mesmo procedimento acima. Certifique-se antes se o grupo usblp existe. Para isso num terminal digite:

$ cat /etc/group | cut -d: -f1 | grep lp

Aparecerá todos os grupos que tenham lp. Caso o grupo usblp não apareça, adicione-o.

$ sudo su
# groupadd usblp

Depois adicione seu usuário ao grupo.

# usermod -a -G mad3linux,adm,cdrom,sudo,sambashare,lpadmin,lp,usblp mad3linux

Pronto. Já deve ser possível executar o comando abaixo:

$ echo ola, mundo > /dev/usb/lp0

Usando Java para escrever na impressora


Veja um exemplo simples de como escrever diretamente na impressora.

Projeto no Github - MAD3 printing

Você pode aplicar a mesma ideia em impressoras de etiquetas, por exemplo a Zebra TPL 2844. Ela utiliza uma série de comandos para criar texto puro, códigos de barra, QR codes, etc.

Faça testes, crie um driver, compartilhe e seja livre.