9.5. LPD (Daemon de impressora de linha)
Anterior | Capítulo 9. Impressão | Próxima

## 9.5. LPD (Daemon de impressora de linha)

A impressão de um arquivo em segundo plano é chamada de spooling. Um spooler permite que o usuário continue com outros programas no computador sem ter de esperar que a impressora conclua lentamente o trabalho de impressão.

O FreeBSD inclui um spooler chamado lpd(8). Os trabalhos de impressão são enviados com o comando lpr(1).

### 9.5.1. Configuração inicial

Um diretório para armazenar trabalhos de impressão é criado, a propriedade é definida e as permissões são definidas para impedir que outros usuários visualizem o conteúdo desses arquivos:

    # mkdir -p /var/spool/lpd/lp
    # chown daemon:daemon /var/spool/lpd/lp
    # chmod 770 /var/spool/lpd/lp

As impressoras são definidas no `/etc/printcap`. Uma entrada para cada impressora inclui detalhes como um nome, a porta onde ela está conectada e várias outras configurações. Crie `/etc/printcap` com estes conteúdos:

    lp:\
    	:lp=/dev/unlpt0:\
    	:sh:\
    	:mx#0:\
    	:sd=/var/spool/lpd/lp:\
    	:lf=/var/log/lpd-errs:

| O nome desta impressora. O lpr(1) envia trabalhos de impressão para a impressora `lp`, a menos que outra impressora seja especificada com `-P`, portanto, a impressora padrão deve ser denominada `lp`.
| O dispositivo em que a impressora está conectada. Substitua esta linha pela apropriada para o tipo de conexão mostrado aqui.
Tipo de conexão | Entrada de Dispositivos no `/etc/printcap`
--- | ---
USB |
    :lp=/dev/unlpt0:\
Este é o dispositivo de impressora USB que não reseta. Se houver problemas, use o `ulpt0`, ele reseta a porta USB após cada uso.
Paralelo |
    :lp=/dev/lpt0:\
Rede | Para uma impressora que suporta o protocolo LPD:
    :lp=:rm=network-printer-name:rp=raw:\
Para impressoras que suportam impressão na porta 9100:
    :lp=9100@network-printer-name:\
Para ambos os tipos, substitua `network-printer-name` pelo nome de host DNS da impressora na rede.
Serial |
    :lp=/dev/cuau0:br=9600:pa=none:\
Esses valores são para uma impressora serial comum conectada a uma porta serial da placa-mãe. A taxa de transmissão é 9600 e nenhuma paridade é usada.
| Suprimir a impressão de uma página de cabeçalho no início de um trabalho de impressão.
| Não limite o tamanho máximo de um trabalho de impressão.
| O caminho para o diretório de spooling desta impressora. Cada impressora usa seu próprio diretório de spooling.
| O arquivo de log no qual os erros nesta impressora serão relatados.

Depois de criar o `/etc/printcap`, use chkprintcap(8) para testar se há erros:

    # chkprintcap

Corrija quaisquer problemas relatados antes de continuar.

Ative o lpd(8) no `/etc/rc.conf`:

    lpd_enable="YES"

Inicie o serviço:

    # service lpd start

### 9.5.2. Imprimindo com o lpr(1)

Os documentos são enviados para a impressora com o `lpr`. Um arquivo a ser impresso pode ser nomeado na linha de comando ou canalizado para o `lpr`. Esses dois comandos são equivalentes, enviando o conteúdo de `doc.txt` para a impressora padrão:

    % lpr doc.txt
    % cat doc.txt | lpr

Impressoras podem ser selecionadas com `-P`. Para imprimir em uma impressora chamada `laser`:

    % lpr -Plaser doc.txt

### 9.5.3. Filtros

Os exemplos mostrados até agora enviaram o conteúdo de um arquivo de texto diretamente para a impressora. Contanto que a impressora entenda o conteúdo desses arquivos, a saída será impressa corretamente.

Algumas impressoras não são capazes de imprimir texto simples, e o arquivo de entrada pode nem ser texto simples.

Filtros permitem que os arquivos sejam traduzidos ou processados. O uso típico é traduzir um tipo de entrada, como texto simples, em um formato que a impressora possa entender, como PostScript® ou PCL. Os filtros também podem ser usados ​​para fornecer recursos adicionais, como adicionar números de página ou destacar o código-fonte para facilitar a leitura.

Os filtros discutidos aqui são filtros de entrada ou filtros de texto. Esses filtros convertem o arquivo recebido em diferentes formatos. Use su(1) para se tornar `root` antes de criar os arquivos.

Os filtros são especificados em `/etc/printcap` com o identificador `if=`. Para usar `/usr/local/libexec/lf2crlf` como um filtro, modifique o `/etc/printcap` assim:

    lp:\
    	:lp=/dev/unlpt0:\
    	:sh:\
    	:mx#0:\
    	:sd=/var/spool/lpd/lp:\
    	:if=/usr/local/libexec/lf2crlf:\
    	:lf=/var/log/lpd-errs:

| `if=` identifica o filtro de entrada que será usado no texto recebido.

### Dica:

Os caracteres backslash de continuação de linha no final das linhas nas entradas do `printcap` revelam que uma entrada para uma impressora é na verdade apenas uma linha longa com entradas delimitadas por dois pontos. O exemplo anterior pode ser reescrito como uma única linha menos legível:

    lp:lp=/dev/unlpt0:sh:mx#0:sd=/var/spool/lpd/lp:if=/usr/local/libexec/lf2crlf:lf=/var/log/lpd-errs:

#### 9.5.3.1. Impedindo degraus em impressoras de texto simples

Os arquivos de texto típicos do FreeBSD contêm apenas um único caractere de feed de linha no final de cada linha. Estas linhas vão ficar em “degraus” em uma impressora padrão:

    Um arquivo impresso parece
                        como os degraus de uma escada
                                                  espalhados pelo vento

Um filtro pode converter os caracteres de nova linha em retornos de carro e novas linhas. Os retornos de carro fazem a impressora retornar para a esquerda após cada linha. Crie o `/usr/local/libexec/lf2crlf` com este conteúdo:

    #!/bin/sh
    CR=$'\r'
    /usr/bin/sed -e "s/$/${CR}/g"

Defina as permissões e torne-o executável:

    # chmod 555 /usr/local/libexec/lf2crlf

Modifique o `/etc/printcap` para usar o novo filtro:

    :if=/usr/local/libexec/lf2crlf:\

Teste o filtro imprimindo o mesmo arquivo de texto simples. O procedimento fará com que cada linha comece no lado esquerdo da página.

#### 9.5.3.2. Texto simples chique em impressoras PostScript® com print/enscript

O GNU Enscript converte arquivos de texto simples em arquivos formatados como PostScript® para impressão em impressoras PostScript®. Ele adiciona números de página, quebra as linhas longas e fornece vários outros recursos para facilitar a leitura dos arquivos de texto impressos. Dependendo do tamanho do papel local, instale o print/enscript-letter ou o print/enscript-a4 da coleção Ports.

Crie o `/usr/local/libexec/enscript` com este conteúdo:

    #!/bin/sh
    /usr/local/bin/enscript -o -

Defina as permissões e torne-o executável:

    # chmod 555 /usr/local/libexec/enscript

Modifique o `/etc/printcap` para usar o novo filtro:

    :if=/usr/local/libexec/enscript:\

Teste o filtro imprimindo um arquivo de texto simples.

#### 9.5.3.3. Imprimindo PostScript® em impressoras PCL

Muitos programas produzem documentos PostScript®. No entanto, impressoras baratas geralmente só entendem texto simples ou PCL. Este filtro converte os arquivos PostScript® para o formato PCL antes de enviá-los para a impressora.

Instale o interpretador de PostScript® Ghostscript, print/ghostscript9, através da Coleção de Ports.

Crie o `/usr/local/libexec/ps2pcl` com este conteúdo:

    #!/bin/sh
    /usr/local/bin/gs -dSAFER -dNOPAUSE -dBATCH -q -sDEVICE=ljet4 -sOutputFile=- -

Defina as permissões e torne-o executável:

    # chmod 555 /usr/local/libexec/ps2pcl

A entrada PostScript® enviada para este script será processada e convertida em PCL antes de ser enviada para a impressora.

Modifique o `/etc/printcap` para usar este novo filtro de entrada:

    :if=/usr/local/libexec/ps2pcl:\

Teste o filtro enviando um pequeno programa PostScript® para ele:

    % printf "%%\!PS \n /Helvetica findfont 18 scalefont setfont \
    72 432 moveto (PostScript printing successful.) show showpage \004" | lpr

#### 9.5.3.4. Filtros Inteligentes

Um filtro que detecta o tipo de entrada e converte automaticamente para o formato correto da impressora pode ser muito conveniente. Os dois primeiros caracteres de um arquivo PostScript® são geralmente `%!`. Um filtro pode detectar esses dois caracteres. Os arquivos PostScript® podem ser enviados de forma inalterada para uma impressora PostScript®. Arquivos de texto podem ser convertidos para PostScript® com o Enscript como mostrado anteriormente. Crie o `/usr/local/libexec/psif` com este conteúdo:

    #!/bin/sh
    #
    #  psif - Print PostScript or plain text on a PostScript printer
    #
    IFS="" read -r first_line
    first_two_chars=`expr "$first_line" : '\(..\)'`

    case "$first_two_chars" in
    %!)
        # %! : PostScript job, print it.
        echo "$first_line" && cat && exit 0
        exit 2
        ;;
    *)
        # otherwise, format with enscript
        ( echo "$first_line"; cat ) | /usr/local/bin/enscript -o - && exit 0
        exit 2
        ;;
    esac

Defina as permissões e torne-o executável:

    # chmod 555 /usr/local/libexec/psif

Modifique o `/etc/printcap` para usar este novo filtro de entrada:

    :if=/usr/local/libexec/psif:\

Teste o filtro imprimindo PostScript® e arquivos de texto simples.

#### 9.5.3.5. Outros Filtros Inteligentes

Escrever um filtro que detecte muitos tipos diferentes de entrada e os formate corretamente é um desafio. O print/apsfilter da Coleção de Ports é um filtro “magico” inteligente que detecta dezenas de tipos de arquivos e os converte automaticamente para o PDL entendido pela impressora. Veja http://www.apsfilter.org para mais detalhes.

### 9.5.4. Múltiplas filas

As entradas no `/etc/printcap` são na verdade definições de filas. Pode haver mais de uma fila para uma única impressora. Quando combinadas com filtros, múltiplas filas fornecem aos usuários um maior controle sobre como seus trabalhos são impressos.

Por exemplo, considere uma impressora laser PostScript® em rede num escritório. A maioria dos usuários deseja imprimir texto simples, mas alguns usuários avançados querem poder imprimir diretamente os arquivos PostScript®. Duas entradas podem ser criadas para a mesma impressora no `/etc/printcap`:

    textprinter:\
    	:lp=9100@officelaser:\
    	:sh:\
    	:mx#0:\
    	:sd=/var/spool/lpd/textprinter:\
    	:if=/usr/local/libexec/enscript:\
    	:lf=/var/log/lpd-errs:

    psprinter:\
    	:lp=9100@officelaser:\
    	:sh:\
    	:mx#0:\
    	:sd=/var/spool/lpd/psprinter:\
    	:lf=/var/log/lpd-errs:

Os documentos enviados para a fila `textprinter` serão formatados pelo filtro `/usr/local/libexec/enscript` mostrado em um exemplo anterior. Usuários avançados podem imprimir arquivos PostScript® em `psprinter`, onde nenhuma filtragem é feita.

Esta técnica de múltiplas filas pode ser usada para fornecer acesso direto a todos os tipos de recursos da impressora. Uma impressora com um duplexador pode usar duas filas, uma para impressões em apenas um lado da folha e outra com um filtro que envia a seqüência de comandos para habilitar a impressão frente e verso e, em seguida, envia o arquivo recebido.

### 9.5.5. Monitoramento e controle de impressão

Vários utilitários estão disponíveis para monitorar trabalhos de impressão e verificar e controlar a operação da impressora.

#### 9.5.5.1. lpq(1)

O lpq(1) mostra o status das tarefas de impressão de um usuário. Trabalhos de impressão de outros usuários não são mostrados.

Mostra os trabalhos pendentes do usuário atual em uma única impressora:

    % lpq -Plp
    Rank   Owner      Job  Files                                 Total Size
    1st    jsmith     0    (standard input)                      12792 bytes

Mostra os trabalhos pendentes do usuário atual em todas as impressoras:

    % lpq -a
    lp:
    Rank   Owner      Job  Files                                 Total Size
    1st    jsmith     1    (standard input)                      27320 bytes

    laser:
    Rank   Owner      Job  Files                                 Total Size
    1st    jsmith     287  (standard input)                      22443 bytes

#### 9.5.5.2. lprm(1)

O lprm(1) é usado para remover trabalhos de impressão. Usuários normais só podem remover seus próprios trabalhos. O `root` pode remover qualquer um ou todos os trabalhos.

Remova todos os trabalhos pendentes de uma impressora:

    # lprm -Plp -
    dfA002smithy dequeued
    cfA002smithy dequeued
    dfA003smithy dequeued
    cfA003smithy dequeued
    dfA004smithy dequeued
    cfA004smithy dequeued

Remova um único trabalho de uma impressora. O lpq(1) é usado para encontrar o número do trabalho.

    % lpq
    Rank   Owner      Job  Files                                 Total Size
    1st    jsmith     5    (standard input)                      12188 bytes
    % lprm -Plp 5
    dfA005smithy dequeued
    cfA005smithy dequeued

#### 9.5.5.3. lpc(8)

O lpc(8) é usado para verificar e modificar o status da impressora. O `lpc` é seguido por um comando e um nome de impressora opcional. O parâmetro `all` pode ser usado em vez de um nome de impressora específico, e o comando será aplicado a todas as impressoras. Usuários normais podem visualizar o status com lpc(8). Somente o `class="username">root` pode usar comandos que modificam o status da impressora.

Mostrar o status de todas as impressoras:

    % lpc status all
    lp:
    	queuing is enabled
    	printing is enabled
    	1 entry in spool area
    	printer idle
    laser:
    	queuing is enabled
    	printing is enabled
    	1 entry in spool area
    	waiting for laser to come up

Impedindo que uma impressora aceite novos trabalhos e fazendo com que ela comece a aceitar novos trabalhos novamente:

    # lpc disable lp
    lp:
    	queuing disabled
    # lpc enable lp
    lp:
    	queuing enabled

Pare de imprimir, mas continue aceitando novos trabalhos. Em seguida, comece a imprimir novamente:

    # lpc stop lp
    lp:
    	printing disabled
    # lpc start lp
    lp:
    	printing enabled
    	daemon started

Reinicie uma impressora após alguma condição de erro:

    # lpc restart lp
    lp:
    	no daemon to abort
    	printing enabled
    	daemon restarted

Desative a fila de impressão e desative a impressão, com uma mensagem para explicar o problema aos usuários:

    # lpc down lp Repair parts will arrive on Monday
    lp:
    	printer and queuing disabled
    	status message is now: Repair parts will arrive on Monday

Reative uma impressora que esteja inativa:

    # lpc up lp
    lp:
    	printing enabled
    	daemon started

Veja lpc(8) para mais comandos e opções.

### 9.5.6. Impressoras Compartilhadas

As impressoras costumam ser compartilhadas por vários usuários em empresas e escolas. Recursos adicionais são fornecidos para tornar as impressoras compartilhadas mais convenientes.

#### 9.5.6.1. Aliases

O nome da impressora é definido na primeira linha da entrada em `/etc/printcap`. Nomes adicionais, ou aliases, podem ser adicionados após esse nome. Os aliases são separados do nome e um do outro por barras verticais:

    lp|repairsprinter|salesprinter:\

Os aliases podem ser usados ​​no lugar do nome da impressora. Por exemplo, os usuários do departamento de vendas imprimem em sua impressora com

    % lpr -Psalesprinter sales-report.txt

Usuários do departamento de Reparos podem imprimir na sua impressora com

    % lpr -Prepairsprinter repairs-report.txt

Todos os documentos são impressos nessa única impressora. Quando o departamento de vendas cresce o suficiente para precisar de sua própria impressora, o alias pode ser removido da entrada da impressora compartilhada e usado como o nome de uma nova impressora. Os usuários nos dois departamentos continuam usando os mesmos comandos, mas os documentos de vendas são enviados para a nova impressora.

#### 9.5.6.2. Páginas de cabeçalho

Pode ser difícil para os usuários localizarem seus documentos na pilha de páginas produzidas por uma impressora compartilhada ocupada. Páginas de cabeçalho foram criadas para resolver este problema. Uma página de cabeçalho com o nome de usuário e o nome do documento é impressa antes de cada trabalho de impressão. Estas páginas são por vezes chamadas de páginas banner ou separadoras.

A ativação das páginas de cabeçalho é diferente, dependendo se a impressora está conectada diretamente ao computador com um cabo USB, paralelo ou serial, ou se está conectada remotamente por uma rede.

As páginas de cabeçalho em impressoras conectadas diretamente são ativadas removendo-se a linha `:sh:\` (Suprimir Cabeçalho) da entrada no `/etc/printcap`. Essas páginas de cabeçalho usam apenas caracteres de feed de linha para novas linhas. Algumas impressoras precisarão do filtro `/usr/share/examples/printing/hpif` para evitar imprimir o texto em escada. O filtro configura impressoras PCL para imprimir retornos de carro e alimentações de linha quando um feed de linha é recebido.

As páginas de cabeçalho das impressoras de rede devem ser configuradas na própria impressora. Entradas de página de cabeçalho no `/etc/printcap` são ignoradas. As configurações geralmente estão disponíveis no painel frontal da impressora ou em uma página da web de configuração acessível com um navegador da web.

### 9.5.7. Referências

Arquivos de exemplo:`/usr/share/examples/printing/`.

O Manual do Spooler de Impressora de Linha do 4.3BSD, `/usr/share/doc/smm/07.lpd/paper.ascii.gz`.

Páginas de manual: printcap(5), lpd(8), lpr(1), lpc(8), lprm(1), lpq(1).

Anterior | Acima | Próxima
9.4. Impressão Direta | Principal | 9.6. Outros sistemas de impressão

All FreeBSD documents are available for download at https://download.freebsd.org/ftp/doc/

Questions that are not answered by the documentation may be sent to <freebsd-questions@FreeBSD.org>.
Send questions about this document to <freebsd-doc@FreeBSD.org>.