Usando um script de shell como uma impressora virtual

10

Eu tenho um script de shell que pega um arquivo PDF como argumento e o imprime com opções específicas adicionais da impressora. Como posso adicionar esse script como uma impressora virtual que pode ser selecionada na GUI?

O shell script é um script dúplex manual que pega um arquivo PDF, imprime páginas pares, fornece um prompt do usuário usando o zenity, solicitando que o usuário vire as páginas e depois imprima as páginas ímpares.

Meu fluxo de trabalho atual é:

  1. Arquivo -> Imprimir -> Salvar no arquivo -> tmp.pdf
  2. my_duplex_script tmp.pdf
  3. rm tmp.pdf

Existe alguma maneira de fazê-lo como:

  1. Arquivo -> Imprimir -> my_script_as_virtual_printer

Nota: Este é no Linux mint 13 canela. Eu tentei, gnome-manual-duplexmas não funciona para mim.


A caixa de diálogo GUI a partir da qual eu posso imprimir em um arquivo PDF Caixa de diálogo de impressão GTK padrão

my_duplex_script

#!/bin/bash

lp_args=
while getopts o: opt
do
    case "$opt" in
        o)  lp_args="$lp_args -o $OPTARG" ;;
        \?) echo >&2 Invalid argument; exit 1 ;;
    esac
done
shift `expr $OPTIND - 1`

file=$1
page_count=$(pdfinfo "$file" | grep Pages | awk '{print $2}')
is_odd=`expr $page_count % 2`

if [ $is_odd -eq 1 ]
then
    #outputting blank
    echo | lp -s -t "$file"-blank
fi

#printing even reversed
lp -s -o page-set=even -o outputorder=reverse $lp_args -t "$file"-even "$file"

if zenity --question --text="Flip and reinsert the entire stack when printing has finished." --ok-label="Proceed" --cancel-label="Cancel"
then
    #printing odd reversed
    lp -s -o page-set=odd -o outputorder=reverse $lp_args -t "$file"-odd "$file"
else
    echo >&2 User abort
    exit 1
fi

exit 0
user80551
fonte

Respostas:

2

Eu nunca tentei isso, mas existe uma ferramenta chamada tea4cupsque parece que você poderia implementar uma pré-captura em seu script que faria a impressão. Você pode cancelar essa impressão e não ir para uma impressora real por meio de xícaras, permitindo que seu script faça a impressão.

excerto

As possibilidades são infinitas :

  • Envie o mesmo trabalho para várias impressoras ao mesmo tempo, o que não é possível com o CUPS.
  • Automatize o arquivamento em PDF de todos os trabalhos de impressão.
  • Proibir trabalhos de impressão duplicados (um exemplo simples é mostrado no arquivo de configuração de amostra)
  • Crie uma solução de contabilidade de impressão em 15 minutos (SIM, ISTO É REAL)
  • etc ...

Tea4cups fornece o seguinte facilita:

Tea4CUPS fornece três maneiras de iniciar comandos:

  • filtros: um filtro pode modificar os dados de entrada antes de serem enviados para a impressora ou disponibilizados para os ganchos pré e pós definidos abaixo. Atualmente, um único filtro pode ser definido por fila de impressão.
  • prehooks: é garantido que eles serão iniciados antes que o trabalho de impressão seja enviado para a impressora real. Qualquer pré-gravação que sai de -1 pode cancelar o trabalho de impressão. Qualquer número de pré-ganchos pode ser definido para uma fila de impressão específica.
  • posthooks: é garantido que eles serão iniciados após o envio do trabalho de impressão para a impressora real, a menos que o trabalho tenha sido cancelado anteriormente por um prehook. Qualquer número de posthooks pode ser definido para uma fila de impressão específica.
slm
fonte
2

Como posso adicionar esse script como uma impressora virtual que pode ser selecionada na GUI?

Para anunciar uma impressora virtual, basta editar o seu /etc/printcap. Isso não é muito fácil, porque a sintaxe do PRINTCAP precisa se acostumar.

Um exemplo de como fazer isso é mostrado aqui Serviço PDF com Samba :

# /etc/printcap
# PDF Service entry

lp|pdf|PDF Printer:\
        :lp=/dev/null:sh:\
        :sd=/var/spool/lpd/pdf:\
        :af=/var/spool/lpd/pdf/acct:\
        :mx#0:sh:\
        :if=/usr/bin/smbprint:

Aqui, o /usr/bin/smbprintscript é usado como um filtro de impressão. A impressora em si é /dev/null.

Talvez você precise instalar cups-bsd, mas geralmente é a configuração padrão.


fonte
Observe que esse printcapé o arquivo de configuração do BSD lpr ou lprNG, não do CUPS, que é o padrão de fato atualmente e é o padrão no Mint.
Gilles 'SO- stop be evil'
Portanto, mencionei o cups-bsdpacote, que também está disponível no Mint, por padrão, instalado e também bem suportado. cups-bsdnão é lprng! É apenas um invólucro, que fornece a funcionalidade da impressão BSD para copos, a fim de oferecer suporte a aplicativos usados lprpara impressão (por exemplo, xpdf).
0

Cheguei atrasado na festa, mas queria fazer a mesma coisa e não encontrei outra solução.

Vou escrever aqui como resolvi, talvez outros achem a solução útil.

  • fez um filtro para copos para pegar o arquivo a ser impresso
  • fez um back-end para imprimir o arquivo
  • fez um instalador agradável e fácil.

o código fonte está no github: https://github.com/dentys03/manual_duplex_linux

Ele deve funcionar em qualquer impressora HP. Facilmente adaptado para outras impressoras, eu acho.

Denis
fonte