11.4. Configuração Avançada de Impressora

Essa seção descreve filtros para formatos especiais de impressão de arquivos, páginas de cabeçaçlho, impressão através da rede, e restringir acesso ao uso da impressora.

11.4.1. Filtros

Através do LPD podemos acessar o protocolos de rede, filas, acesso de controle, e outros aspectos da impresão, a maioria dos trabalhos reais ocorre nos filters. Os filtros são programas que se comunicam com a impressora e manipulam as dependências do dispositivo e necessidades especiais. Na seção configuração simples da impressora, nós instalamos um filtro--an texto puro extremamente simples que deve funcionar na maioria das impressoras (seção Instalando o Filtro de Texto ).

Entretando, se quisermos tirar vantagens de conversão de formatos, relatório de uso da impressora, especificar uma configuração especial da impressora, entre outras coisas, devemos compreender como funcionam os filtros. Ultimamente a responsabidade do filtro é tratar desses aspectos. E a má notícia é que a maior parte do tempo você terá que providenciar os seus próprios filtros. A boa notícia é que muitos já esão disponíveis; e se não encontrar, você facilmente poderá escrevê-los.

Também, o FreeBSD vem com um /usr/libexec/lpr/lpf, que funciona com a maioria das impressoras que podem imprimir texto puro. (Ele manipula caraceteres de retorno, backspaces e tabulações no arquivo, e faz a contabilidade, mas isso é tudo que ele faz). Existem vários filtros e componentes de filtro na Coleção de Ports do FreeBSD.

Aqui está o que você irá encontrar nessa seção:

11.4.1.1. Como os Filtros Funcionam

Como mencionado antes, o filtro é um programa executável inicializado pelo LPD para manipular a parte denpendente de dispositivo para comunicação com a impressora.

Quando o LPD precisa imprimir um arquivo no job, ele inicializa o filtro. Ele configura a entrada padrão do filtro para o arquivo a ser impresso, a saída padrão para a impressora e a saída padrão de erro para o arquivo de log de erros (especificado na opção lf no arquivo /etc/printcap, ou /dev/console por padrão).

A escolha do filtro inicializado pelo LPD depende do argumento utilizado no arquivo /etc/printcap e qual foi o argumento que o usuário especificou no comando de linha lpr(1). Por exemplo, se o usuário digita o seguinte comando: lpr -t, o LPD irá inicializar o filtro troff, que é o argumento da opção tf para a impressora padrão. Se o usuário quiser imprimir um texto puro, ele deverá inicializar o filtro if (isso é muito comum, veja em Output Filters para maiores detalhes).

Existem tres tipos de filtros que você pode especificar no arquivo /etc/printcap:

  • O filtro de texto, erradamente chamado de filtro de entrada na documentação do LPD, ele manipula a impressão de texto puro, pense nele como um filtro padrão para o LPD, ele espera que todas as impressoras, por padrão, estejam habilitadas a imprimir texto puro, e ela tabs, em um ambiente onde tem estatísticas do uso da impressora, o filtro de texto também deve gerar a estatística sobre o que foi impresso, geralmente isto é feito contando o número de linhas impressas e comparando-as com o número de linhas que a impressora suporta. O filtro de texto é inicializado com a seguinte lista de argumentos:

    nome-do-filtro [-c] -wlargura -lcomprimento -iindent -n login -h host arquivo-estatistica

    onde

    -c

    É usado quando o job é enviado com o comando lpr -l

    largura

    É o valor da opção pw (largura da página) especificado no arquivo /etc/printcap, O padrão é 132

    comprimento

    É o valor da opção pl (comprimento da página), o padrão é 66

    indent

    É a quantidade de identação fornecido pelo comando lpr -i, o padrão é 0

    login

    É o nome da conta de usuário para pode imprimir o arquivo

    host

    É o nome do computador para onde a impressão será envida.

    arquivo_estatistica

    É o nome do arquivo onde será armazenada a estatística da impressão, este valor é atribuido à opção af.

  • Um filtro de conversão converte um fromato especifico do arquivo em outro que a impressora possa compreender e tranformar em páginas impresas. Por exemplo, o formato ditroff typesetting não pode ser impresso diretamento, mas você pode instalar um filtro conversor para o formato que a impressora possa imprimir corretamente. A seção Filtros Conversores mostra como fazê-los. Filtros de conversão que também necessite de estatísticas, você precisa habilitar a estatística na impressora. Filtros de conversão são inicializados com os seguintes argumentos:

    nome-do-filtro -x largura do pixel -y altura do pixel -n login -h host arquivo-estatistca

    Onde largura do pixel é o valor da opção px (valor padrão é 0) e altura do pixel é o valor da opção py (o valor padrão é 0).

  • O filtro de saída é usado somente se não existir um filtro de texto, ou se o cabeçalho das páginas estiver habilitado. Em minha experiência, filtros de saída são raramente utilizados. A seção Filtros de Saída mostra mais detalhes. Existem somente dois argumentos para os filtros de saída, são eles:

    nome do filtro -wlargura -lcomprimento

    os quais são identicos aos argumetos dos filtros de texto -w e -l.

Os filtros devem também sair com os seguintes status:

exit 0

Se o filtro obteve sucesso ao imprimir o arquivo.

exit 1

Se o filtro falhou ao imprimir o arquivo, mas aguarda o LPD para tentar imprimir outra vez. LPD irá reiniciar o filtro se ele sair com esse status.

exit 2

Se o filtro falhar na impressão do arquivo e não irá aguardar o LPD para tentar denovo. O LPD irá jogar fora o arquivo.

O filtro de texto que vem com a versão do FreeBSD, /usr/libexec/lpr/lpf, tira vantagens dos argumentos de largura e comprimento para determinar quando enviar um caracter de alimentação de folha (form feed) e como gerar estatísticas do uso da impressora. Ele usa o login, host, e argumentos do arquivo para gerar as estatísticas.

Se você deseja comprar filtros, veja se são compatíveis com o LPD. Se forem, eles devem suportar a lista de argumentos descrita acima. Se você planeja escrever seu próprio filtro para uso geral, eles também devem suportar a lista de argumentos e deve utilizar os códigos descritos acima.

11.4.1.2. Acomodando Texto Puro em Impressoras PostScript®

Se só você é o usuário do seu computador sua impressora suporta PostScript (ou outra linguagem), e você prometeu nunca enviar texto puro para a sua impressora e nunca usará as vantagens que vários programas que gostariam de enviar texto puro para a sua impressora, então você não precisa se preocupar com esta seção.

Mas, se você gostaria de enviar tanto PostScript e texto puro para a sua impresssora, então você está convidado a incrementar a configuração da impressora. Para fazer isso, nós temos que ter um filtro para detectar se o texto é texto puro ou PostScript. Todas as impressões em PostScript devem iniciar com %! (para outras linguagens de impressora, veja a documentação da sua impressora). Se estes dois primeiros caracteres aparecerem no arquivo de impressãom nós temos PostScript, e podemos passar o resto da impressão diretamente para a impressora. Se não temos os dois primeiros caracteres no arquivo de impressão, então o filtro deve convertê-lo em PostScript e imprimir o resultado.

Como nós faremos isso:

Se você possui uma impressora serial, o melhor caminho é instalar o lprps. O lprps é um filtro de impressora PostScript, o qual habilita a comunicação bi-direcional com a impressora. Ele atualiza o arquivo de status da impressora com informação recebida da impressora, então os usuários e administradores podem ver exatamente o estado da impressora (tais como ``toner baixo'' ou ``paper jam''). mas o mais importante, é incluir um programa chamado de psif, o qual detecta quando um job é em texto puro e então executa o comando textps (outro pragama que vem com o lprps) para convertê-lo em PostScript. Ele pode usar lprps para enviar um job para a impressora.

O lprps é parte da coleção de programas do FreeBSD (veja A Coleção de Programas). Você pode procurar, construir e instalar, por você mesmo. Depois da instalação do lprps, especifique o diretório para o programa psif que faz parte do lprps. Se você instalou o lprps através dos ports, use o seguinte na entrada referente a impressora serial PostScript configurada no arquivo /etc/printcap:

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

Você também deve especificar a opção rw; que informa ao LPD para abrir a comunicação com a impressora no modo leitura-escrita.

Se você tem uma impressora PostScript (e não utiliza o modo bi-direcional, como necessita o lprps), você pode utilizar o seguinte script como um filtro texto:

#!/bin/sh
#
#  psif - Print PostScript or plain text on a PostScript printer
#  Script version; NOT the version that comes with lprps
#  Installed in /usr/local/libexec/psif
#

IFS="" read -r first_line
first_two_chars=`expr "$first_line" : '\(..\)'`

if [ "$first_two_chars" = "%!" ]; then
    #
    #  PostScript job, print it.
    #
    echo "$first_line" && cat && printf "\004" && exit 0
    exit 2
else
    #
    #  Plain text, convert it, then print it.
    #
    ( echo "$first_line"; cat ) | /usr/local/bin/textps && printf "\004" && exit 0
    exit 2
fi

No script acima, textps é um programa que instalamos separadamente para converter texto puro em PostScript. Você pode usar qualquer conversor de texto para PostScript que você desejar. A coleção de programas do FreeBSD (ports, veja em Coleção de Programas ) inclui um programa conversor de texto para PostScript com facilidades chamado a2ps que você deveria considerar.

11.4.1.3. Simulando PostScript em Impressoras Não PostScript

PostScript é de facto padrão para impressão de alta qualidade. PostScript é entretanto, um padrão caro. Ficamos gratos à Aladdin Enterprises que possui um programa chamado Ghostscript que pode trabalhar com a maioria dos arquivos PostScript e pode mostrar suas páginas em uma variedade de dispositivos, incluindo um grande número de impressoras não PostScript. Com a instalação do Ghostscript e usando filtros especiais de texto para a sua impressora, você pode fazer uma impressora não PostScript funcionar como uma impressora PostScript real.

Ghostscript está nos ports do FreeBSD, se você quiser instalar a partir de lá. Você pode buscar, compilar e instalar muito facilmente.

Para simular PostScript, nós temos um detector de filtro de texto para verificar se estamos imprimindo em um aquivo PostScript ou texto puro. Se for o caso de texto puro, então o filtro deverá repassar as informações diretamente para a impressora, caso contrário, ele deverá utilizar o Ghostscript antes para converter PostScript para o formato reconhecido pela a impressora.

Aqui tem um exemplo: o script a seguir é um filtro texto para uma impressora da Hewlett Packard, a Deskjet 500. Para outras impressoras, você deve substituir o argumento da opção -sDEVICE do comando gs (Ghostscript). Digitando gs -h você terá a lista dos dispositivos suportados pela versão instalada do Ghostscript.

#!/bin/sh
#
#  ifhp - Print Ghostscript-simulated PostScript on a DeskJet 500
#  Installed in /usr/local/libexec/ifhp

#
#  Treat LF as CR+LF:
#
printf "\033&k2G" || exit 2

#
#  Read first two characters of the file
#
IFS="" read -r first_line
first_two_chars=`expr "$first_line" : '\(..\)'`

if [ "$first_two_chars" = "%!" ]; then
    #
    #  It is PostScript; use Ghostscript to scan-convert and print it.
    #
    #  Note that PostScript files are actually interpreted programs,
    #  and those programs are allowed to write to stdout, which will
    #  mes up the printed output.  So, we redirect stdout to stderr
    #  and then make descriptor 3 go to stdout, and have Ghostscript
    #  write its output there.  Exercise for the clever reader:
    #  capture the stderr output from Ghostscript and mail it back to
    #  the user originating the print job.
    #
    exec 3>&1 1>&2
    /usr/local/bin/gs -dSAFER -dNOPAUSE -q -sDEVICE=djet500 \
        -sOutputFile=/dev/fd/3 - && exit 0
else
    #
    #  Plain text or HP/PCL, so just print it directly; print a form feed
    #  at the end to eject the last page.
    #
    echo "$first_line" && cat && printf "\033&l0H" && 
exit 0
fi

exit 2

Finalmente, você deve notificar o LPD do filtro através da opção if

:if=/usr/local/libexec/ifhp:

Feito isso, você poderá digitar lpr texto.puro e lpr qualquer-coisa.ps e ambos deverão ser impressos corretamente na impressora.

11.4.1.4. Filtros Conversores

Após ter completado a configuração descrita na seção Configuração Simples da Impressora , a primeira coisa que você provavelmente pensa é instalar filtros conversores para seus formatos favoritos de arquivo.

11.4.1.4.1. Porque Instalar Filtros Conversores?

Filtros conversores podem imprimir uma variedade de tipos de arquivo facilmente. Por exemplo, suponha que tenhamos que fazer um grande trabalho com o sistema TeX, e nós temos uma impressora PostScript. Cada vez que geramos um arquivo DVI através do TeX, nos não podemos imprimi-lo diretamente, pois precisamos convertê-lo em PostScript. A sequência de comandos será algo semelhante a:

% dvips seaweed-analysis.dvi
% lpr seaweed-analysis.ps

Instalando um filtro para converter os aquivos DVI em PostScript, poderíamos pular um passo a cada vez que tivessemos que imprimir. O LPD poderá realizar esse passo para nós.

% lpr -d seaweed-analysis.dvi

Nós informamos o LPD para converter o arquivo DVI através da opção -d. A seção Opções de Formatação e Conversão mostra uma lista de opções de conversão

Para cada opção de conversão que você deseja que sua impressora suporte, deve instalar um Filtro Conversor e especificar o diretório no arquivo /etc/printcap. Um filtro conversor é um filtro texto como foi definido na seção Configuração Simples de Impressora (veja a seção Instalando um Filtro de Texto ) Exceto pelo fato imprimir arquivos de texto puro, os filtros convertem os arquivos em um formato que a impressora pode entender.

11.4.1.4.2. Qual o Filtro Conversor Devo Instalar?

Você deve instalar o filtro conversor que você espera utilizar. Se você imprime uma grande quantidade de dados no formato DVI, então você deve ter um filtro para convertê-lo. Se você deseja imprimir saídas através de troff, então provavelmente você terá um filtro troff.

A seguinte tabela sumariza os filtros que o LPD pode trabalhar, e suas opções estão no arquivo /etc/printcap, e como devem ser chamados com o comando lpr:

Tipo de Arquivo Opção no /etc/printcap Opções do lpr
cifplot cf -c
DVI df -d
plot gf -g
ditroff nf -n
texto em FORTRAN rf -f
troff tf -f
raster vf -v
Texto Puro if none, -p, or -l

No nosso exemplo, usamos o comando lpr -d que significa dizer que precisamos da opção df dentro do arquivo /etc/printcap.

Apesar de algumas opiniões contrárias, formatos como o FORTRAN e plot são provavelmente obsoletos. No seu sítio, você pode dar novas opções de formatação para estes ou qualquer outra opção apenas instalando novos filtros ajustados para o seu uso. Por exemplo, suponhamos que seja necessário imprimir diretamente arquivos Printerleaf (arquivos vindos do do programa de pubicação Interleaf), mas você nunca irá imprimir arquivos de plot. Você poderá instalar um filtro para converter esse formato utilizando a opção gf e educar os seus usuários a utilizarem o comando lpr -g quando forem imprimir arquivos do tipo ``Printerleaf''.

11.4.1.4.3. Instalando Filtros Conversores

Uma vez que os filtros de conversão são programas instalados por fora da instalação padrão do FreeBSD, eles devem, provavelmente, ficar no diretório /usr/local. O diretório /usr/local/libexec é a localização mais indicada, pois são programas especializados que somente o LPD irá usar; usuários regulares do sistema, não deverão ter necessidade de executá-los.

Para habilitar um filtro conversor, especifique o diretório no qual ele se encontra, na opção específica do arquivo /etc/printcap.

No nosso exemplo iremos adicionar um filtro conversor DVI na impressora chamada bamboo. Aqui um exemplo de um arquivo /etc/printcap, com a nova opção df para a impressora bamboo.

#
#  /etc/printcap for host rose - added df filter for bamboo
#
rattan|line|diablo|lp|Diablo 630 Line Printer:\
        :sh:sd=/var/spool/lpd/rattan:\
        :lp=/dev/lpt0:\
        :if=/usr/local/libexec/if-simple:

bamboo|ps|PS|S|panasonic|Panasonic KX-P4455 PostScript v51.4:\
        :sh:sd=/var/spool/lpd/bamboo:\
        :lp=/dev/ttyd5:ms#-parenb cs8 clocal crtscts:rw:\
        :if=/usr/local/libexec/psif:\
        :df=/usr/local/libexec/psdf:

O filtro DVI é um script para o shell chamado de /usr/local/libexec/psdf. aqui está o script

#!/bin/sh
#
#  psdf - DVI to PostScript printer filter
#  Installed in /usr/local/libexec/psdf
#
# Invoked by lpd when user runs lpr -d
#
exec /usr/local/bin/dvips -f | /usr/local/libexec/lprps "$@"

Esse script executa dvips no modo de filtro (o argumento -f) na entrada padrão, na qual o job será impresso. Ele inicia o filtro PostScript da impressora lprps (veja a seção Acomodando Trabalhgos de Impressão em Texto Puro em Impressoras PostScript ) com os argumentos do LPD passado pelo script. O comando lprps será usado como argumento para a contabilidade de páginas impressas.

11.4.1.4.4. Mais Exemplos de Filtros Conversores

Uma vez que não existe um conjunto de passos para a instalação de filtros conversores, providenciaremos mais exempemplos. Use-os como guia para fazer os seus próprios filtros. Use-os diretamente se forem apropriados.

Esse exemplo de script é um filtro conversor raster (com arquivos GIF atualmente) para as impressoras Hewlett Packard LaserJet III-Si:

#!/bin/sh
#
#  hpvf - Convert GIF files into HP/PCL, then print
#  Installed in /usr/local/libexec/hpvf
                  
PATH=/usr/X11R6/bin:$PATH; export PATH
giftopnm | ppmtopgm | pgmtopbm | pbmtolj -resolution 300 \
    && exit 0 \
    || exit 2

Ele converte um arquivo GIF em um formato anymap portável, convertendo em um mapa de cinza portável, convertento em um formato bitmap portável, e então convertendo em dados compatível com PCL.

Um exemplo de arquivo /etc/printcap com uma entrada para uma impressora usando o filtro acima.

#
#  /etc/printcap for host orchid
#
teak|hp|laserjet|Hewlett Packard LaserJet 3Si:\
        :lp=/dev/lpt0:sh:sd=/var/spool/lpd/teak:mx#0:\
        :if=/usr/local/libexec/hpif:\
        :vf=/usr/local/libexec/hpvf:

O próximo script converte dados troff vindos de um sistema groff para uma impressora PostScript chamada bamboo:

#!/bin/sh
#
#  pstf - Convert groff's troff data into PS, then print.
#  Installed in /usr/local/libexec/pstf
#
exec grops | /usr/local/libexec/lprps "$@"

O script acima, faz uso novamente do comando lprps para manipular a comunicação com a impressora. Se a impressora estiver na porta paralela, nós devemos usar este script:

#!/bin/sh
#
#  pstf - Convert groff's troff data into PS, then print.
#  Installed in /usr/local/libexec/pstf
#
exec grops

Aqui está a entrada que precisamos adicionar no arquivo /etc/printcap para habilitar o filtro:

:tf=/usr/local/libexec/pstf:

Aqui está um filtro para texto em FORTRAN para qualquer impressora que imprima diretamente em texto puro. Nós iremos instalar isso para a impressora chamada teak:

#!/bin/sh
#
# hprf - FORTRAN text filter for LaserJet 3si:
# Installed in /usr/local/libexec/hprf
#

printf "\033&k2G" && fpr && printf "\033&l0H" &&
 exit 0
exit 2

E nós adicionamos esta linha no arquivo /etc/printcap para a impressora teak para habilitar esse filtro:

:rf=/usr/local/libexec/hprf:

Aqui é o fim desse exemplo complexo. Nós iremos adicionar o filtro DVI para a impressora LaserJet teak indroduzido recentemente. Primeiro, a parte mais fácil; atualize o arquivo /etc/printcap com a localização do filtro DVI:

:df=/usr/local/libexec/hpdf:

Agora, a parte mais difícil: fazendo o filtro. Para tanto, nós iremos necessitar de um programa conversor de DVI para LaserJet/PCL. A coleção de programas do FreeBSD (veja em A Coleção de Programas) possui um: dvi2xx, é o nome do pacote. Instalando esse pacote, teremos o programa necessário, dvilj2p, o qual converte DVI em arquivos LaserJet IIp, LaserJet III, e LaserJet 2000 compatíveis.

O comando dvilj2p deixa o filtro hpdf pouco complexo uma vez que o comando dvilj2p não pode ler da entrada padrão. Ele necessita trabalhar com o nome do arquivo. Isso é ruim, o nome do arquivo deve ter no final .dvi então usando o /dev/fd/0 para a entrada padrão seria problemático. Nós podemos contornar o problema linkando (simbolicamente) um nome temporário de arquivo (um que terminaria em .dvi) para o /dev/fd/0, forçando assim o dvilj2p ler da entrada padrão.

Outro ponto importante é que não podemos utilizar o diretório /tmp para um link temporário. Links simbólicos são propriedade do usuário e grupo bin. O filtro executa como o usuário daemon. E o filtro não conseguirá criar o link, mas também ele não estará apto quando de removê-lo quando terminar uma vez que o link pertence a um um usuário diferente.

Ao invés disso o filtro criará um link simbólico no diretório de trabalho corrente, que é o diretório de spooling (especificado na opção sd no arquivo /etc/printcap). Este é um lugar perfeito par os filtros realizarem o seu trabalho, especialmente porque na maioraia das vezes possui mais espaço do que o diretório /tmp.

Aqui, finalmente, o filtro:

#!/bin/sh
#
#  hpdf - Print DVI data on HP/PCL printer
#  Installed in /usr/local/libexec/hpdf

PATH=/usr/local/bin:$PATH; export PATH

#
#  Define a function to clean up our temporary files.  These exist
#  in the current directory, which will be the spooling directory
#  for the printer.
#
cleanup() {
   rm -f hpdf$$.dvi
}

#
#  Define a function to handle fatal errors: print the given message
#  and exit 2.  Exiting with 2 tells LPD to do not try to reprint the
#  job.
#
fatal() {
    echo "$@" 1>&2
    cleanup
    exit 2
}

#
#  If user removes the job, LPD will send SIGINT, so trap SIGINT
#  (and a few other signals) to clean up after ourselves.
#
trap cleanup 1 2 15 

#
#  Make sure we are not colliding with any existing files.
#
cleanup

#
#  Link the DVI input file to standard input (the file to print).
#
ln -s /dev/fd/0 hpdf$$.dvi || fatal "Cannot symlink /dev/fd/0"

#
#  Make LF = CR+LF
#
printf "\033&k2G" || fatal "Cannot initialize printer"

# 
#  Convert and print.  Return value from dvilj2p does not seem to be
#  reliable, so we ignore it.
#
dvilj2p -M1 -q -e- dfhp$$.dvi

#
#  Clean up and exit
#
cleanup
exit 0

11.4.1.4.5. Conversão Automática: Uma Alternativa aos Filtros de Conversão

Todos esses filtros de conversão completam o seu ambiente de impressão, mas a um custo de forçar seu usuário a especificar (no comando de linha lpr(1)) qual ele irá usar. Se seus usuários não estão familiarizados, ou não tiverem costume com literatura computacional , eles acharão isso muito chato. O que é ruim, entretanto, é a escolha de uma opção errada, que poderá gerar muitas páginas de lixo.

De preferência quando for instalar um filtro de conversão, você poderá tentar deixar como padrão um filtro texto, que detecte o tipo de arquivo e execute o filtro adequado para conversão. Ferramentas como file poderão ajuda-lo a resolver isto. Claro que você terá dificuldades em diferenciar entre alguns tipos de arquivos e é claro que você estará providenciando o filtro correto para convertê-los.

A Coleção de Programas do FreeBSD tem um filtro de texto capaz de realizar automaticamente a conversão definida chamadaapsfilter. Ele também pode detectar texto puro, PostScript e DVI, executar as conversões necessárias, e a seguir imprimir o resultado.

11.4.1.5. Filtros de Saída

O sistema de spooling LPD suporta um outro tipo de filtro que ainda não foi explorado: o filtro de saída. Um filtro de saída tem apenas o objetivo de imprimir texto puro, como outros filtros de texto, mas com muitas simplificações. Se você estiver utilizando um filtro de saída mas não um filtro texto, então:

  • O LPD inicia o filtro de saída apenas uma unica vez para o trabalho de impressão ao invez de uma vez para cada arquivo no trabalho de impressão.

  • O sistema LPD não faz nenhuma previsão para identificar o incício ou o final de arquivos dentro do trabalho de impressão para o filtro de saída.

  • O sistema LPD não repassa o nome do usuário ou a máquina para o filtro, então não conseque fazer a contabilização do uso. de fato, ele só utiliza dois argumentos:

    nome do filtro -wlargura -lcomprimento

    Onde largura é retirado da opção pw e o comprimento é retirado da opção pl referente a impressora utilizada

Não fique seduzido pela facilidade do uso dos filtros de saída. Se você gostaria de ter cada arquivo do trabalho de impressão iniciando em diferente páginas um filtro de saída não iria funcionar . Use um filtro de texto (também conhecido como filtro de entrada); veja a seção Instalando um Filtro Texto. Além disso, um filtro de saída é atualmente mais complexo porque ele examina um stream de bytes iniciamente enviado para ele com um flag especial e deve ser enviado sinais para ele prório em benefício do sistema LPD.

Entretanto, um filtro de saída é necessario se você quizer cabeçalho de pá e precisa enviar seguências de caracteres escape ou outro conjunto de caracteres inicialização para abilitar o cabeçalho das páginas. (mas isso é também fútil se você deseja carregar cabeçalhos de página para a contabilidade do usuário uma vez que o sistema LPD não fornece nenhuma informação do usuário ou do computador para o filtro de saída).

Para uma única impressora, o sistema LPD permite tanto filtros de saída e de texto ou de outro tipo. Na maioria dos casos o sistema LPD irá iniciar o filtro de saída para imprimir a página de cabeçalho ( veja a seção Páginas de Cabeçalho) somente. O sistema LPD então agurada o filtro de saída terminar pelo envio de uma sequência de dois bytes para o filtro: os caracterres ASCII 031 seguido pelo 001. Quando ofiltro ve esses dois bytes (031, 001), ele deve parar com um envio do sinal SIGSTOP para si mesmo. Quando o sistema LPD termina a execução de outros filtros, ele irá reinicializar o filtro de saída pelo envio do sinal SIGCONT para ele.

Se existir um filtro de saída mas não um filtro texto e o LPD estiver trabalhando em um trabalho de impressão de texto puro, o LPD utiliza o filtro de saída para realizar a tarefa de impressão. Como dito antes, o filtro de saída irá imprimir cada arquivo do trabalho de impressão na sequência sem o intervalo de alimentação de folha ou outro avanço de papel, e isso você provavelmente não deseja. Na maioria dos casos você necessitara de um filtro de texto.

O programa lpf, o qual nos introduzimos recentemente como um filtro texto, pode também ser executado como um filtro de saída. Se você necessitar de um filtro de saída rápido e sem muita qualidade, mas não quer ter o trabalho de escrever um detector de byte e um código para enviar sinais, tente o lpf. Você também pode colocar o lpf dentro de um script em shell para manipular os códigos de inicialização que a impressora pode necessitar.

11.4.1.6. lpf: Um Filtro de Texto

O programa /usr/libexec/lpr/lpf que vem com a distribuição do FreeBSD é um filtro de texto ( filtro de entrada )e pode identar a saída ( o trabalho de impressão enviado com o comando lpr -i), permitindo que caracteres literais possam ser enviados (trabalho de impressão enviado com o comando lpr -l), ajustar a posição de impressão para caracteres de retorno (backspace) e tabulações no trabalho de imressão, e fazer a contabilidade das páginas impressas. Também pode agir como um filtro de saída.

O comando lpf é adequado para a maioria dos ambientes de impressão. E ainda que não possua capacidade para enviar sequências de inicialização para as impressoras, isto é fácil ser escrito em script de shell para fazer as inicializações necessárias e então executar o lpf.

Para que o lpf faça a estatistica corretamente, ele necessita dos valores preencidos corretamente nas opções pw e pl no arquivo /etc/printcap. Ele utiliza esses valores para determinar como o texto poderá caber na página que quantas páginas estarão no trabalho de impressão do usuário. Para mais informações, veja a seção Estatisticas do Uso da Impressora .

11.4.2. Páginas de Cabeçalhos

Se você tiver muitos usuários, todos eles usuando várias impressoras, você provavelmente deverá considerar as páginas de cabeçalho como um mal necessário.

Páginas de Cabeçalho, também conhecida como banner ou burst pages identifica de quem é o trabalho de impressão depois dele ser impresso. Ela é geralmente impressa grande, com letras em negrito, e as vezes com bordas decorativas, para que em um pilha de impressão eles possam ser identificados e entregues ao usuário correto. As páginas de cabeçalho são impressas uma por trabalho de impressão e não uma por arquivo impresso.

O sistema LPD pode providenciar automaticamente páginas de cabeçalho para suas saídas se sua impressora puder imprimir texto puro. Se você tiver uma impressora PostScript, você necessitara de um programa externo para gerar essas páginas; veja a seção Páginas de Cabeçalho em Impressoras PostScript .

11.4.2.1. Habilitando Páginas de Cabeçalho

Na seção Configuração Simples da Impressora , nos desligamos a impressão das páginas de cabeçalho, através da opção sh ( que significa ``suppres header'') no arquivo /etc/printcap. Para habilitar a impressão, basta a remoção da opção sh.

Isso parece tão fácil, correto?

E você esta certo. Você deve ter providenciado um filtro de saída para enviar os dados de inicialização para a impressora. Aqui um está um exemplo de filtro de saída para uma impressora Hewlett Packard PCL-compatível:

#!/bin/sh
#
#  hpof - Output filter for Hewlett Packard PCL-compatible printers
#  Installed in /usr/local/libexec/hpof

printf "\033&k2G" || exit 2
exec /usr/libexec/lpr/lpf

especificando odiretório para o filtro de saída na opção of. veja na seção Filtros de Saída para maiores informações.

Aqui um exemplo do arquivo /etc/printcap para a impressora teak que foi introduzida recentemente; nos habilitamos a página de cabeçalho e adicionamos o filtro de saída descrito acima:

#
#  /etc/printcap for host orchid
#
teak|hp|laserjet|Hewlett Packard LaserJet 3Si:\
        :lp=/dev/lpt0:sd=/var/spool/lpd/teak:mx#0:\
        :if=/usr/local/libexec/hpif:\
        :vf=/usr/local/libexec/hpvf:\
        :of=/usr/local/libexec/hpof:

Agora, quando os usuários imprimirem os seus trabalhos para a impressora teak, eles terão uma página de cabeçalho para cada job impresso. Se os usuários querem perder tempo procurando os seus trabalhos de impressora, eles podem suprimir essas páginas com o comando lpr -h; veja a seção Opçãoes de Páginas de Cabeçalho para outras opções veja lpr(1) .

Nota: O LPD imprime o caracter de alimentação de página (form feed) logo apos a página de cabeçalho. Se sua impressora utiliza um caracter diferente ou sequencia de caracteres para ejetar uma página, especifique-o na opção ff no arquivo /etc/printcap.

11.4.2.2. Controlando Páginas de Cabeçalho

Uma vez habilidada a página de cabeçalho, o LPD irá produzir um longo cabeçalho, uma página completa com letras grandes identificando o usuário, máquina, e o trabalho de impressão. Aqui está um exemplo (kelly imprimiu um trabalho de impressãoi entitulado de outline a partir da máquina rose):

      k                   ll       ll
      k                    l        l
      k                    l        l
      k   k     eeee       l        l     y    y
      k  k     e    e      l        l     y    y
      k k      eeeeee      l        l     y    y
      kk k     e           l        l     y    y
      k   k    e    e      l        l     y   yy
      k    k    eeee      lll      lll     yyy y
                                               y
                                          y    y
                                           yyyy


                                   ll
                          t         l        i
                          t         l
       oooo    u    u   ttttt       l       ii     n nnn     eeee
      o    o   u    u     t         l        i     nn   n   e    e
      o    o   u    u     t         l        i     n    n   eeeeee
      o    o   u    u     t         l        i     n    n   e
      o    o   u   uu     t  t      l        i     n    n   e    e
       oooo     uuu u      tt      lll      iii    n    n    eeee









      r rrr     oooo     sss      eeee
      rr   r   o    o   s    s   e    e
      r        o    o    s      eeeeee
      r        o    o      s    e
      r        o    o   s    s   e    e
      r         oooo     sss      eeee







                                              Job:  outline
                                              Date: Sun Sep 17 11:04:58 1995

O LPD adiciona uma alimentação de página logo apos o texto ser impresso, então inicia em uma nova página o trabalho de impressão ( a menos que se tenha definido a opção sf (suprimir a alimentação de página) na impressora destinada no arquivo /etc/printcap).

Se você preferir, o LPD pode fazer uma página pequena; especificando a opção sb (short banner) no arquivo /etc/printcap. A página de cabeçalho irá parecer como esta:

rose:kelly  Job: outline  Date: Sun Sep 17 11:07:51 1995

Também poe padrão, o LPD imprime a página de cabeçalho primeiro, e então o trabalho de impressão. Para reverter isso, especifique a opção hl (header last) no arquivo /etc/printcap.

11.4.2.3. Estatísticas para Páginas de Cabeçalho

Usando o LPD para imprimir as páginas de cabeçalho, leva-nos a um paradigma, nos devemos contar as páginas de cabeçalho para fazer as estatística, ou devemos deix-la de fora.

Por que?

Por que o filtro de saída é somente um programa externo que terá controle quando a página de cabeçalho for impressa e não pode diferenciar isto do total para que possa fazer a estatística corretamente, e isso não é fornecido por qualquer usuário ou máquina ou qualquer arquivo de estatística, então ele não tem ideia para quem contabilizar o uso da impressora. E também não é justo ``adcionar uma página'' para o filtro texto ou qualquer outro filtro de conversão ( os quais têm informações sobre os usuários e máquinas) uma vez que os usuários podem suprimir as páginas de cabeçalho com o comando lpr -h. À eles então seriam atribuidos os custros ( estatísticas ) de páginas de cabeçalho que efetivamente não imprimiram. Basicamente, o lpr -h irá ser uma opção preferiad no ambito dos usuários, mas você não deverá incentivar o seu uso.

Isso não é o sufuciente para cada filtro gerar sua própriapágina de cabeçalho ( entretanto estará apto a contabiliza-las). Se os usuários quizerem a opção de supressão de páginas de cabeçalho com o comando lpr -h, eles ainda teram e serão contabilizado uma vez que o LPD não tem conhecimento da -h para nenhum filtro.

Então, qual é a sua opção?

Você pode:

  • Aceitando o paradigma do LPD e liberando as páginas de cabeçalho.

  • Instalando alternativas ao LPD, tais como: LPRng. Seção Alternativas Ao Spooler Padrão diz mais sobre os programas que podem substituir o LPD.

  • Escrevendo um filtro de saída inteligente. Normalmente um filtro de saída não precisa de muita coisa a além de inicializar a impressora ou fazer algumas conversões de caracteres. Ele derá que se adaptar para páginas de cabeçalho ou para trabalhos de impressão em texto puro ( quando ele não for um filtro de texto (entrada)). Mas, se existir um filtro de texto para trabalhos de impressão em texto puro, então LPD irá iniciar o filtro de saída somente para a página de cabeçalho. E o filtro de saída poderá alanisar a página de cabeçalho que o LPD gerou para determinar qual usuário e máquina para poder contabiliza-la. O único problema com esse método é que o filtro de saída continua sem ter conhecimento do arquivo de estatística ( isso não é passado pela opção af), mas se você tem o conhecimento do arquivo de estatística, voce poderá coloca-lo direto no código do filtro de saída. Para facilitar o passo de análise, use a opção sh (página curta) do arquivo /etc/printcap. Então depois de tudo feito, os usuários irão apreciar o quão generoso o administrador do sistema é, liberando das estatísticas de utilização a paina de cabeçalho.

11.4.2.4. Páginas de Cabeçalho em Impressoras PostScript

Como descrito acima, o LPD pode gerar as páginas de cabeçalho em texto puro, funcional para a maioria das impressoras. Claro que as impressoras PostScript não podem imprimir diretamente texto puro, então a vantagem do LPD poder imprimir as páginas de cabeçalho torna-se imprestável--.

Uma maneira obvia de ter páginas de cabeçalho é gerar através de cada filtro de conversão e de filtros de texto, as páginas de cabeçalho. Os filtros devem usar os argumentos de nome de usuário e da máquina, para gerar uma página de cabeçalhjo otimizada. a desvantagem deste método é que o usuário sempre tera a página de cabeçalho mesmo que ele utilize o comando lpr -h para imprimir seus trabalhos de impressões.

Iremos explorar este método. O script abaixo manipula três argumentos ( nome do usuário (login), nome da máquina, e o nome do trabalho de impressão) e faz uma página simples de cabeçalho em PostScript:

#!/bin/sh
#
#  make-ps-header - make a PostScript header page on stdout
#  Installed in /usr/local/libexec/make-ps-header
#

#
#  These are PostScript units (72 to the inch).  Modify for A4 or
#  whatever size paper you are using:
#
page_width=612
page_height=792
border=72

#
#  Check arguments
#
if [ $# -ne 3 ]; then
    echo "Usage: `basename $0` <user> <host> <job>" 1>&2
    exit 1
fi

#
#  Save these, mostly for readability in the PostScript, below.
#
user=$1
host=$2
job=$3
date=`date`

#
#  Send the PostScript code to stdout.
#
exec cat <<EOF
%!PS

%
%  Make sure we do not interfere with user's job that will follow
%
save

%
%  Make a thick, unpleasant border around the edge of the paper.
%
$border $border moveto
$page_width $border 2 mul sub 0 rlineto
0 $page_height $border 2 mul sub rlineto
currentscreen 3 -1 roll pop 100 3 1 roll setscreen
$border 2 mul $page_width sub 0 rlineto closepath
0.8 setgray 10 setlinewidth stroke 0 setgray

%
%  Display user's login name, nice and large and prominent
%
/Helvetica-Bold findfont 64 scalefont setfont
$page_width ($user) stringwidth pop sub 2 div $page_height 200 sub moveto
($user) show

%
%  Now show the boring particulars
%
/Helvetica findfont 14 scalefont setfont
/y 200 def
[ (Job:) (Host:) (Date:) ] {
200 y moveto show /y y 18 sub def }
forall

/Helvetica-Bold findfont 14 scalefont setfont
/y 200 def
[ ($job) ($host) ($date) ] {
        270 y moveto show /y y 18 sub def
} forall

%
% That is it
%
restore
showpage
EOF

Agora, cada chamada aos filtros de conversão e aos filtros de texto, irá ser gerada uma página de cabeçalho e então será impresso o trabalho de impressão do usuário. Segue um exemplo de um filtro de conversão de DVI, mostrado anteriormente neste documento, modificado para poder imprimir a página de cabeçalho.

#!/bin/sh
#
#  psdf - DVI to PostScript printer filter
#  Installed in /usr/local/libexec/psdf
#
#  Invoked by lpd when user runs lpr -d
#
                
orig_args="$@"

fail() {
    echo "$@" 1>&2
    exit 2
}

while getopts "x:y:n:h:" option; do
    case $option in
        x|y)  ;; # Ignore
        n)    login=$OPTARG ;;
        h)    host=$OPTARG ;;
        *)    echo "LPD started `basename $0` wrong." 1>&2
              exit 2
              ;;
    esac
done

[ "$login" ] || fail "No login name"
[ "$host" ] || fail "No host name"

( /usr/local/libexec/make-ps-header $login $host "DVI File"
  /usr/local/bin/dvips -f ) | eval /usr/local/libexec/lprps $orig_args

Observe como o filtro faz a análise da lista de argumentos para que possa determinar os nomes de máquina e de usuário. A análise para os outros filtros de conversão é identica. O filtro de texto possui uma sutil diferença no conjunte de argumentos passados ( veja a seção Como os filtros funcionam ).

Como foi mencionado, o esquema acima é muito simples, desabilita a opção ``supressão da página de cabeçalho'' ( a opção -h ) para o comando lpr. Se os usuários quizerem econimizar árvores ( ou dinheiro, caso seja cobrada a impressão da páginas de cabeçalho). ele não poderam faze-lo, uma vez que os prórpios filtros se encarregam deste serviço.

Para permitir os usuários desligarem as páginas de cabeçalho, você deverá usar o truque mostrado na seção Contabilizando as Páginas de Cabeçalho : para escrever um filtro de saída que analise a página de cabeçalho gerada pelo LPD e produzir uma versão em PostScript. Se o usuário enviar o trabalho de impressão com o comando lpr -h, então o LPD não irá gerar a página de cabeçalho, e nada ira para o seu filtro de saída. Caso contrario, seu filtro de saída ira ler o texto que o LPD gerou e irá enviar a página de cabeçalho apropriada em código PostScript.

Se voce tiver uma impressora PostScript na porta serial, você pode utilizar o comando lprps, o qual vem com um filtro da saída, psof, Note que o psof não contabiliza as páginas de cabeçalho

11.4.3. Impressão em Rede

O FreeBSD suporta impressão via rede; enviando trabalhos de impressão para impressoras remotas. Impressão em rede geralmente nos conduz a duas coisas diferentes:

11.4.3.1. Impressoras Intaladas em um Computador Remoto

O sistema LPD foi construido com suporte para enviar trabalhos de impressão para outras máquinas na rede, rodando LPD ( ou um algo compatível com ele ). Essa caracteistica possibilita a instalação de impressoraqs em uma máquina que possa ser acessada por outras. Isso também funciona para impressora que possuem intefaces de rede capaz de compreender o protocolo LPD.

Para habilitar essa impressora remota, primeiro devemos instalar a impressora em uma máquina, que será o servidor de Impressão, usando os passos descritos na seção Simples Configuração de Impressora . Para configuração avançada veja a seção Configuração Avançada de Impressora . Tenha certeza que o teste de imoressão funcionou corretamente para esta impressora. Tenha certeza que o computador local tenha autorização para acessar a máquina remota e o serviço do LPD, veja a seção Restringindo os Trabalhos de Impressão para Máquinas Remotas ).

Se estiver utilizando uma impressora com interface de rede compatível com LPD, então servidor de imporessão será a propria impressora, e o nome da impressora será o nome que você configurou para a impressora. Veja a documentação que acompanha a sua impressora e/ou a interface de rede dela.

Dica: Se você esta utulizando uma Hewlett Packard Laserjet então o nome da impressora fará automaticamente a conversão do LF para o CRLF para você, e então você não necessitará do filtro de texto hpif para isso.

Então, em outros servidores que você quizer ter acesso, deverá adicionar uma entrada no arquivo /etc/printcap como segue:

  1. Nomeia a entrada como quiser. Por simplicidade, você usará o mesmo nome/apelido que estiver no servidor da impressra.

  2. Deixe a opção lp em branco, faça isso explicitamente (:lp=:).

  3. Crie um diretório de spool e especifique a sua localização com a opção sd. O LPD irá armazenar os trabalhos de impressão lá antes de entregar ao servidor de impressão

  4. Coloque o nome do servidor da impressora na opção rm.

  5. Coloque o nome a impressora que está no servidor de impressão não opção rp

Feito isso, você não precisará de filtros de entrada, dimesionamento de páginas, ou outra coisa qualquer no arquivo /etc/printcap.

Aqui está um exemplo. O servidor rose possui duas imopressoras, bamboo e rattan. Nos iremos permitir que os usuários da máquina orchid possa imprimir nessas impressoras. Aqui está o arquivo /etc/printcap para a máquina orchid (veja a seção anteriro Habilitando Páginas de Cabeçalho ). Ele já possui a entrada para a impressora teak; nos iremos adicionar a entrada para as duas impressoras no servidor rose:

#
#  /etc/printcap for host orchid - added (remote) printers on rose
#

#
#  teak is local; it is connected directly to orchid:
#
teak|hp|laserjet|Hewlett Packard LaserJet 3Si:\
        :lp=/dev/lpt0:sd=/var/spool/lpd/teak:mx#0:\
        :if=/usr/local/libexec/ifhp:\
        :vf=/usr/local/libexec/vfhp:\
        :of=/usr/local/libexec/ofhp:

#
#  rattan is connected to rose; send jobs for rattan to rose:
#
rattan|line|diablo|lp|Diablo 630 Line Printer:\
        :lp=:rm=rose:rp=rattan:sd=/var/spool/lpd/rattan:

#
#  bamboo is connected to rose as well:
#
bamboo|ps|PS|S|panasonic|Panasonic KX-P4455 PostScript v51.4:\
        :lp=:rm=rose:rp=bamboo:sd=/var/spool/lpd/bamboo:

Então, nos apenas criamos o diretório de spool na máquina orchid:

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

Agora, os usuários na máquina orchid podem imprimir para as impressoras rattan e bamboo. Se, por exemplo, o usuário na máquina orchid digitar:

% lpr -P bamboo -d sushi-review.dvi
O siatema LPD na máquina orchid irá copiar o trabalho de impressão do diretório de spool /var/spool/lpd/bamboo e irá notar que é uma impressão em DVI. Tão logo o servidor rose tiver espaço no diretório de spool da impressora bamboo os dois sistemas LPDs irão transferir o arquivo para o servidor rose. O arquivo ficará aguardando na fila do servidor rose até ser finalmente impresso. Ele então irá converter do formato DVI para PostScript deste que a impressora bamboo consiga interpretar PostScript

11.4.3.2. Impressoras com Interfaces de Rede Data Stream

Geralmente, quando você compra uma interface de rede para a sua impressora, você pode ter duas versões: uma que emula um spooler ( a versão mais cara), ou uma que permita que você envie dados para ela como se você estivesse utilizando uma porta paralela ou serial ( a versão mais barata). Essa seção mostra como você irá utilizar essa versão mais barata. Para a versão mais cara, veja a seção anterior Impressoras Instaladas em uma Máquina Remota .

O formato do arquivo /etc/printcap permite que você especifique qual a interface, seria ou paralela, a ser usada e ( se você estiver usando uma interface serial), qual a taxa de transferencia ( baud rate), Se está usando controle de fluxo, expansão de tabulação, conversão de novas linhas, e mais. Mas existe um meio de especificar a conexão com a impressora que e ouvir sobre TCP/IP ou outra porta da rede.

Para enviar dados para uma impressora na rede, você deverá desenvolver um programa de comunicação que possa ser chamado pelo filtro de texto e/ou de conversão. Aqui está um exemplo: O script netprint pega todos os dados da entrada padrão e envia para a impressora de rede. Nos especificamos o nome da máquina onde a impressora está conectada como o primeiro argumento e o número da porta para a conexão como o segundo argumento para o netprint. Note que esse suporte é de uma única direção ( Impressoras para o FreeBSD ); muitas impressoras de rede suportam comunicação bidirecional, você pode ter vantagem em utilizar essa comunicação para obter status da impressora, fazer contabilidade, etc.

#!/usr/bin/perl
#
#  netprint - Text filter for printer attached to network
#  Installed in /usr/local/libexec/netprint
#
$#ARGV eq 1 || die "Usage: $0 <printer-hostname> <port-number>";

$printer_host = $ARGV[0];
$printer_port = $ARGV[1];

require 'sys/socket.ph';

($ignore, $ignore, $protocol) = getprotobyname('tcp');
($ignore, $ignore, $ignore, $ignore, $address)
    = gethostbyname($printer_host);

$sockaddr = pack('S n a4 x8', &AF_INET, $printer_port, $address);

socket(PRINTER, &PF_INET, &SOCK_STREAM, $protocol)
    || die "Can't create TCP/IP stream socket: $!";
connect(PRINTER, $sockaddr) || die "Can't contact $printer_host: $!";
while (<STDIN>) { print PRINTER; }
exit 0;

Nos podemos utilizar este script em vários filtros. Supondo que temos uma impressora Diablo 750-N conectada à rede. A impressora aceita dados para impressão na porta de número 5100. O nome da máquina é scrivener. Aqui está um filtro de texto para a impressora.

#!/bin/sh
#
#  diablo-if-net - Text filter for Diablo printer `scrivener' listening
#  on port 5100.   Installed in /usr/local/libexec/diablo-if-net
#
exec /usr/libexec/lpr/lpf "$@" | /usr/local/libexec/netprint scrivener 5100

11.4.4. Restingindo o Uso da Impressora

Essa seção dá informações de como restringir o uso da impressora. O sistema LPD permite que você controle quem pode acessar a impressor localmente ( direto na máquina) ou remotamente, eles podem imprimir multiplas cópias, tão grandes quando se queira os trabalhos de impressão, tão grandes que podem ser as filas de impressão.

11.4.4.1. Restringindo Multiplas Cópias

O sistema LPD faz isso com facilidade para os usuários poderem imprimir multiplas cópias de um arquivo. Os usuários podem imprimir trabalhos de impressão com o comando lpr -#5, por exemplo e ter cinco cópias de um mesmo arquivo em um trabalho de impresão. Isso será um boa ideia se estiver habilidado.

Se você perceber que isso pode causar um desgaste desnecessário da impressora, você poderá desabilitar a opção -# para lpr(1) apenas adicionando a opção sc no arquivo /etc/printcap. Quando os usuários utilizarem o comando com a opção -# para imprimir seus trabalhos de imopressão, ele verá:

lpr: multiple copies are not allowed

Note que se vocè tem configurado o acesso a impressora remota ( veja a seção Impressora Instaladas em Máquinas Remotas ), você necessitará da opção sc no arquivo /etc/printcap da máquina remota, caso contrário, os usuários poderiam enviar trabalhos de impressão com multiplas cópias, usando uma outra máquina na rede.

Aqui tem um exemplo. Esse é um arquivo /etc/printcap para a máquina rose. A impressora rattan parruda, que aguenta multiplas cópias, mas a impressora à laser bamboo é um pouco mais delicada ,que não, então será desabilidada a multiplas cópias, adicionando a opção sc :

#
#  /etc/printcap for host rose - restrict multiple copies on bamboo
#
rattan|line|diablo|lp|Diablo 630 Line Printer:\
        :sh:sd=/var/spool/lpd/rattan:\
        :lp=/dev/lpt0:\
        :if=/usr/local/libexec/if-simple:

bamboo|ps|PS|S|panasonic|Panasonic KX-P4455 PostScript v51.4:\
        :sh:sd=/var/spool/lpd/bamboo:sc:\
        :lp=/dev/ttyd5:ms#-parenb cs8 clocal crtscts:rw:\
        :if=/usr/local/libexec/psif:\
        :df=/usr/local/libexec/psdf:

Agora, nós necessitaremos de adicionar a opção sc no arquivo /etc/printcap na máquina orchid para dessabilitar as cópias multiplas para a impressora teak):

#
#  /etc/printcap for host orchid - no multiple copies for local
#  printer teak or remote printer bamboo
teak|hp|laserjet|Hewlett Packard LaserJet 3Si:\
        :lp=/dev/lpt0:sd=/var/spool/lpd/teak:mx#0:sc:\
        :if=/usr/local/libexec/ifhp:\
        :vf=/usr/local/libexec/vfhp:\
        :of=/usr/local/libexec/ofhp:

rattan|line|diablo|lp|Diablo 630 Line Printer:\
        :lp=:rm=rose:rp=rattan:sd=/var/spool/lpd/rattan:

bamboo|ps|PS|S|panasonic|Panasonic KX-P4455 PostScript v51.4:\
        :lp=:rm=rose:rp=bamboo:sd=/var/spool/lpd/bamboo:sc:

Usando a opção sc, nos podemos prever o uso do comando lpr -#, mas isso não prevê usuários utilizando lpr(1) várias vezes, ou de enviar o mesmo arquivo várias vezes em um único trabalho de impressão, como segue:

% lpr forsale.sign forsale.sign forsale.sign forsale.sign forsale.sign

Existem várias maneiras de se prever esse abuso ( incluisive ignorando ele) que você pode explorar livremente.

11.4.4.2. Restringindo o Acesso as Impressoras

Você pode controlar quem pode imprimir em qual impressora utilizando o mecanismo de grupos do UNIX® e a opção rg no /etc/printcap. Apenas colocando os usuários que você quer que tenham acesso a impressora diferentes grupos, e então definindo na opção rg o grupo desejado.

Os usuários fora do grupo ( inmcluindo o root) irão receber a seguinte mensagem: ``lpr: Not a member of the restricted group'' Se eles tentarem imprimir em uma impressora controlada.

Como a opção sc ( suprime multiplas cópias), você precisasrá de especificar a opção rg na máquina remota (servidor) para ter também o acesso à impressora, veja a seção Impressoras Instaladas em Servidores Remotos ).

Por exemplo, nós iremos permitir o acesso de todos a impressora rattan, mas somente os usuários do grupo artists poderão utilizar a impressora bamboo. Novamente o arquivo /etc/printcap é semelhante ao da máquina rose:

#
#  /etc/printcap for host rose - restricted group for bamboo
#
rattan|line|diablo|lp|Diablo 630 Line Printer:\
        :sh:sd=/var/spool/lpd/rattan:\
        :lp=/dev/lpt0:\
        :if=/usr/local/libexec/if-simple:

bamboo|ps|PS|S|panasonic|Panasonic KX-P4455 PostScript v51.4:\
        :sh:sd=/var/spool/lpd/bamboo:sc:rg=artists:\
        :lp=/dev/ttyd5:ms#-parenb cs8 clocal crtscts:rw:\
        :if=/usr/local/libexec/psif:\
        :df=/usr/local/libexec/psdf:

Permita-nos mostrar um outro exemplo do arquivo /etc/printcap (para a máquina orchid) sozinha. Claro, qualquer um na máquina orchid pode imprimir para a impressora bamboo. Neste caso, nos deveremos permitir acesso à apenas de alguns usuários na máquina orchid, de qualquer maneira, nos estamos controlondo o acesso a impressora.

Nota: Só podemos restringir apenas um grupo por impressora



11.4.4.3. Controlando o Tamanho do Arquivos Enviados

Se você possui muitos usuários acessando a sua impressora, você provavelmente necessitará de limitar o tamanho máximo dos arquivos enviados para a impressora. Além de que, o espaço livre em disco é limitado, você deverá prever o envio de vários trabalhos de impressão simultaneos, que poderão consumir uma grande quantidade de espaço em disco.

O sistema LPD permite que você limite o tamanho máximo de um trabalho de impressão através da opção mx. A unidade padrão é em blocos de BUFSIZ, que são 1024 bytes. Se você colocar o valor como zero para esta opção, você não estará limitando o tamanho do arquivo, entretanto se você não especificar valor, o padrão será utilizado, que é de : 1000 blocos.

Nota: O limite é aplicado para os arquivos dentro de um trabalho de impressão, e não ao tamanho total do trabalho de impressão

O sistema LPD não irá recusar o arquivo que estiver acima do limite imposto por você. Ele colocara na fila de impressão apenas a quantidade de bytes até o limite. O resto será descartado. Será esse o comportamento correto.

Iremos utilizar outro exemplo de limites para as impressoras rattan e bamboo. Uma vez que arquivos artísticos em PostScript tentem a ser muito grande, nós iremos limitar-los a 5 megabytes. Nós iremos deixar sem limite a impressora de texto puro (matricial):

#
#  /etc/printcap for host rose
#

#
#  No limit on job size:
#
rattan|line|diablo|lp|Diablo 630 Line Printer:\
        :sh:mx#0:sd=/var/spool/lpd/rattan:\
        :lp=/dev/lpt0:\
        :if=/usr/local/libexec/if-simple:

#
#  Limit of five megabytes:
#
bamboo|ps|PS|S|panasonic|Panasonic KX-P4455 PostScript v51.4:\
        :sh:sd=/var/spool/lpd/bamboo:sc:rg=artists:mx#5000:\
        :lp=/dev/ttyd5:ms#-parenb cs8 clocal crtscts:rw:\
        :if=/usr/local/libexec/psif:\
        :df=/usr/local/libexec/psdf:

Relembrando, os limites são aplicados somente aos usuários locais. Se você permite acesso remoto, usuários remotos não terão este limite. Você deverá especificar na opção mx no arquivo remoto /etc/printcap. Veja a seção Impressoras Instaladas em Servidores Remotas para mais detalhes.

Existem outros meios especializados para limitar o tamanho dos trabalhos de impressão de impressão remota; veja a seção Restrigindo Impressão Remota .

11.4.4.4. Restringindo a Impressão Remota

O sistema de spooling LPD possui vários meios de restringir o acesso dos trabalhos de impressão enviados de uma máquina remota:

Restrição à Máquina

Você pode controlar de qual máquina remota o servidor local LPD aceitará pedidos de impressão com a ajuda dos arquivos /etc/hosts.equiv e /etc/hosts.lpd. O LPD verifica esses arquivos para saber se o pedido foi feito por uma das máquinas listada em um dos arquivos. Se não estiver em nenhum deles o LPD recusará o pedido

O formato desses arquivos e muito simples: o nome da máquina remota, um por linha. Note que o arquivo /etc/hosts.equiv é também utilizado pelo protocolo ruserok(3), e afeta programas como rsh(1) e rcp(1), então, seja cuidadoso.

Por exemplo, aqui está um arquivo /etc/hosts.lpd para a máquina rose:

orchid
violet
madrigal.fishbaum.de

Isso significa que a máquina rose irá aceitar pedidos das máquinas orchid, violet, e madrigal.fishbaum.de. Se qualquer outra máquina tentar acessar o LPD na máquina rose, esse trabalho de impressão será rejeitado.

Restrição de Tamanho

Você pode controlar o quanto de espaco livre é necessário n sistema de arquivo aonde o diretório de spooling está. Crie um arquivo chamado de minfree dentro do diretório do spooling para a impressora local. Insira no arquivo o número representando quantos blocos ( 512 bytes ) de espaço livre deve ter o disco para que o trabalho de impressão remoto seja aceito.

Isso permite que vovê garanta que o seu sistema de arquivos não fique lotado pelos seus usuários remotos. Você também pode usar isso para dar uma certa prioridade aos usuários locais: Eles estão aptos a enviar grandes trabalhos de impressão mesmo que o limite fique abaixo do especificado no arquivo minfree.

Por exemplo, vamos adicionar um arquivo minfree para a impressora bamboo. Nós examinaremos o arquivo /etc/printcap para encontrar o diretório de spooling para essa impressora; aqui está a entrada:

bamboo|ps|PS|S|panasonic|Panasonic KX-P4455 PostScript v51.4:\
        :sh:sd=/var/spool/lpd/bamboo:sc:rg=artists:mx#5000:\
        :lp=/dev/ttyd5:ms#-parenb cs8 clocal crtscts:rw:mx#5000:\
        :if=/usr/local/libexec/psif:\
        :df=/usr/local/libexec/psdf:

O diretório de spooling é dado na opção sd. Nós iremos criar uma reserva de 3 megabytes ( que são 6144 blocos do disco ) para o LPD poder aceitar pedidos de trabalhos de impressão remotos:

# echo 6144 > /var/spool/lpd/bamboo/minfree
             
Restrições de Usuários

Para que você possa controlar qual o usuário remoto pode acesar a impressora local, voce deve utilizar a opção rs do arquivo /etc/printcap. Quando a opação rs é utilizada localmente, o LPD irá somente aceitar os trabalhos de impressão das máquinas remotas se o usuároi que o tiver enviando, também tiver conta com o mesmo login na máquina local. Caso contrário, o LPD irá recusar o trabalho de impressão.

Esssa opção é particularmente poderosa para o ambiente onde existam, por exemplo, diferentes departamendos compartilhando a rede, e alguns usuários trascendem os limites departamentais. Dando a eles contas em seus sistemas, eles também poderam imprimir nas impressoras desses departamentos. Se você quizer que apenas a utilização desses usuários sejam restritas a utilização das impressoras, você deve utilizar contas do tipo ``token'', sem diretório de usuário e com um shell sem utilização como /usr/bin/false.

11.4.5. Contabilizando o Uso da Impressora

Então, você precisa contabilizar as impressões. Por que não? Afinal papel e tinta custam dinheiro. E também o custo de manutenção da impressora com as partes móveis que podem quebrar. Você deve examinar suas impressoras, use um padrão e uma taxa de manutenção que deve conter o custo de uma página ( ou por metro, por pés, ou qualquer outra coisa ). Agora como você irá inicializar a contabilidade para as impressões?

Bem, a má notícia é que o sistema de spooling LPD não provê muita ajuda nesse departamento. A contabilidade é altamente dependente da maneira de como a impressora é utilizadda, o formato que é impresso, como você necessita que a impressora seja contabilizada.

Para implantar a contabilidade, você deve modificar o filtro para texto puro ( para contabilizar trabalhos de impressão em texto puro) e os filtros de conversão ( para contabilizar outros formatos de impressão), para contar as páginas ou as requisições para a impressora das páginas impressas. Você não deve utilizar filtros simples, pos eles não fornecem dados para a contabilidade. Veja a seção Filtros.

Geralmente, existe duas maneiras para realizar a contabilidade:

O sistema de spool LPD suporta ambos os métodos facilmente: deste que você providencie os filtros ( na maioria das vezes ), você também deve providenciar o código para a contabilidade. Mas existe o lado bom: você terá uma enorme flexibilidade em seus métodos de contabilidade. Por exemplo, você escolhe como irá fazer a contabilidade, periodicamente ou em determinado tempo. Você escolhe qual a informação que irá armazenar: nome do usuário, nome da máquina, tipo do trabalho de impressão, páginas impressas, metragem quadrada do papel utilizado, quanto tempo a impressora foi utilizada para a impressão em muito mais. E você só terá que modificar o filtro para armazenar essas informações.

11.4.5.1. Uma Comtabilidade Rápida e Rasteira

O FreeBSD vem com dos programas que podem ajuda-lo com uma contabilidade simples e periodica. Eles são filtros texto (lpf), descrito na seção lpf: um Filtro Texto, e pac(8), um programa para recolher e totalizar as entradas do arquivo de contabilidade das impressoras.

Como mencionado na seção sobre filtros (Filtros), O LPD inicia os filtros de texto e de conversão com o nome do arquivo de contabilidade para ser utilizado na linha de comando do filtro. Os filtros podem usar esse argumento para saber onde escrever os dados da contabilidade. O nome desse arquivo deve ser colocado na opção af no arquivo /etc/printcap, e se não estiver especificado com o diretório absoluto, será utilizado de forma relativa ao diretório de spooling.

O LPD inicia o lpf com a largura e o comprimento da página como os argumentos ( da opçãões pw e pl). O lpf usa esses argumentos para determinar quanto de papel será utiizado. Depois do envio do arquivo para impressora, ele então escreve a entrada da contabilidade para o arquivo de contabilidade. Uma entrada seria semelhante a essa:

2.00 rose:andy
3.00 rose:kelly
3.00 orchid:mary
5.00 orchid:mary
2.00 orchid:zhang

Você deve usar arquivos de contabilidade separados para cada impressora, como lpf não tem lógica de bloqueio interna, e dois acessos via lpf pode comrromper os dados das entradas concorrentes. O meio mais fácil de separar os arquivos de contabilidade é utilizando a opcao af=acct no arquivo /etc/printcap. Então, cada arquivo de contabilidade irá ficar no diretório de spooling da impressora desejada, com o nome de acct.

Quando você estiver pronto para cobrar dos usuários pelas impressõess, execute o programa pac(8). Para cadas impressora que você desejar coletar os dados, voê deverá ir ao seu diretório de spooling e então executar o programa pac. Você terá um relatório dos custos, semelhante à:

  Login               pages/feet   runs    price
orchid:kelly                5.00    1   $  0.10
orchid:mary                31.00    3   $  0.62
orchid:zhang                9.00    1   $  0.18
rose:andy                   2.00    1   $  0.04
rose:kelly                177.00  104   $  3.54
rose:mary                  87.00   32   $  1.74
rose:root                  26.00   12   $  0.52

total                     337.00  154   $  6.74


Esses são os argumentos para o comando pac(8):

-PImpressora

Onde Impressora será a impressora ser avaliada. Essa opção funciona somente se existir o caminho absoluto na opção af no arquivo /etc/printcap.

-c

Ordena a saída pelo custo ao invés da ordem alfabética dos nomes dos usuários.

-m

Ignora o nome damáquinano arquivo de contabilidade. Com essa opção, o usuário smith na máquina alpha é o mesmo usuário smith na máquina gamma. Sem isso serão diferentes.

-ppreço

Computa o uso com o preço em dolar por página ou por pés, ao invés do preço estipulado na opção pc no arquivo /etc/printcap, or 3 centavos ( o valor padrão). Você pode especificar o preço como um número de ponto flutuante.

-r

Ordena de modo reverso.

-s

Cria um arquivo com o resumo da estatística e trunca o arquivo de contabilidade.

nome ...

Imprime as informações de contabilidade de um dado usuário com o nome names somente.

No resumo padrão que o comando pac(8) gera, você vê o número de páginas impressas por cada usuário de várias máquinas. Se, no seu sítio, as máquinas não são importantes ( porque os usuários podem usar qualquer uma delas), então execute o comando pac -m, para gerar a seguinte saída:

  Login               pages/feet   runs    price
andy                        2.00    1   $  0.04
kelly                     182.00  105   $  3.64
mary                      118.00   35   $  2.36
root                       26.00   12   $  0.52
zhang                       9.00    1   $  0.18

total                     337.00  154   $  6.74

Para computar o custo em dolar, o comando pac(8) usa a opção pc do arquivo /etc/printcap (padrão é 200, ou 2 centavos por página). Especifique, em centenas de centavos, o preço por página ou por pés se você possuir esse tipo de impressão. Você pode sobreescrever este valor quando você executa o comando pac(8) com a opção -p. A unidade para esta opção é o dollar e não a centena de centavos. Por exemplo:

# pac -p1.50
Faz o custo de cada página ter 1,50 dolares. Você pode realmente ter um lucro usando essa opção.

Finalmente, executando o comando pac -s, você economizará informacões no resumo da contabilidade armazenado em arquivo, o qual terá o mesmo nome que o arquivo de estatística da imprssora, mas com um sufixo acrescido ao nome (_sum). Ele então trunca o arquivo de estatísticas. Quando você executa o comando pac(8) novamente, ele re-le o resumo do arquivo de resumo para inicial a totalização, então adiciona as informações no arquivo normal de estatísticas.

11.4.5.2. Como Contar Páginas Impressas?

De modo a apurar mesmo uma contagem pouco precisa, você deve ser capaz de determinar quanto papel um trabalho usa. Este é um dos problemas essenciais da contabilidade em relação à impressão.

Para trabalhos ou jobs de texto simples o problema não é muito difícil: você conta quantas linhas têm no trabalho e compara isso com quantas linhas por página sua impressora suporta. Não se esqueça de levar em consideração backspaces no arquivo que provoquem sobrescrita de linhas e linhas longas que se transformam em uma ou mais linhas adicionais.

O filtro de texto lpf (cuja introdução pode ser vista em lpf: Um Filtro de Texto) leva em consideração estas coisas quando faz a contagem. Se você estiver escrevendo um filtro de texto que precise realizar contabilidade pode querer examinar o código fonte do lpf.

E como você lida com outros formatos?

Bem, para conversões de DVI para LaserJet ou DVI para PostScript você pode fazer com que seu filtro trate a saída do comando dvilj ou dvips e verifique quantas páginas foram convertidas. Você deve conseguir fazer isso também com outros formatos e programas de conversão.

Esses métodos, porém, não resolvem o problema de que a impressora pode não imprimir todas essas páginas. Por exemplo, o papel pode prender, a tinta acabar ou a impressora explodir, e o usuário ainda seria cobrado pelas páginas.

Então, o que você pode fazer?

Existe somente um meio correto para fazer uma contabilidade precisa. Deixe a impressora dizer para você quanto de papel ela usou, e a conecte via porta serial ou a uma conexão de rede. Quase todas as impressoras PostScript suportam essa manipulação. Outras marcas e modelos também podem, por exemplo, impressoras de rede Imagen Laser. Modifique os filtros para essas impressoras para pegar a utilização das páginas após a impressão de cada trabalho, para então poder armazenar as informações da contabilidade baseado apenas neste valor. Não existe contagem de linha e nem exame de erros no arquivo.

Claro, você pode ser generoso e deixar as impressões gratuitas.

Este, e outros documentos, podem ser obtidos em ftp://ftp.FreeBSD.org/pub/FreeBSD/doc/.

Para perguntas sobre FreeBSD, leia a documentação antes de contatar <questions@FreeBSD.org>.
Para perguntas sobre esta documentação, envie e-mail para <doc@FreeBSD.org>.