
Às vezes, quando estou trabalhando no meu laptop, quero colocar alguns documentos na fila para imprimir mais tarde, já que não estou conectado a uma impressora no momento.
Entretanto, as filas reais da impressora não foram projetadas para isso; eles imediatamente tentam imprimir o documento e, de repente, começam a imprimir assim que entro na rede, o que geralmente não é o que desejo fazer. Além disso, às vezes tenho vontade de alterar a ordem dos documentos na fila, o que não é muito fácil, principalmente depois de alguns deles terem começado a ser impressos.
Além disso, às vezes a impressão falha porque, por exemplo, a impressora fica sem papel ou toner e quero reimprimir o documento em uma impressora diferente. Isso não é simples com, por exemplo , CUPS
ou system-config-printer
; Geralmente tenho que voltar, reabrir o leitor de PDF e começar tudo de novo. Nenhum dos leitores de PDF que conheço permite manter uma lista de documentos para imprimir posteriormente, mas esse pode ser um recurso oculto de um leitor de PDF em algum lugar que eu não conheço.
De qualquer forma, aqui está o que eu quero poder fazer:
- Especifique uma lista de PDFs que desejo imprimir.
- Mantenha essa lista no disco para que eu possa fechar o aplicativo ou reinicializar sem perder a lista inteira.
- Especifique as impressoras para as quais desejo enviá-las com antecedência, sem estar realmente conectado a essas impressoras no momento.
- Especifique opções de impressão como cor, duplex e número de cópias.
- Altere essas atribuições de impressora e opções de impressão posteriormente.
- Espere até eu pressionar um botão ou executar um comando para imprimir o(s) documento(s).
- Mantenha uma lista separada dos documentos que já foram impressos, caso a impressão não funcione ou eu queira reimprimi-los posteriormente.
Eu sei que poderia hackear algo junto com um script de shell lpr
e uma lista de caminhos em um arquivo de texto, mas não posso deixar de sentir que esse problema já foi resolvido de uma forma mais robusta e elegante.
Pontos bônus:
- Não exija que os documentos sejam abertos em um leitor de PDF. Quero imprimi-los, não navegá-los, e não há razão para que sejam o mesmo aplicativo.
- Mais de uma lista.
- Também funciona para Postscript, DjVu e outros formatos de descrição de página.
- Arraste e solte nos gerenciadores de arquivos.
Alguma sugestão?
Responder1
O que eu faço é o seguinte --- não é tão versátil quanto você pediu, mas funciona quase bem. Você precisa ter todas as suas impressoras definidas e, em seguida, precisa destes dois scripts:
stop_printers
:#!/bin/bash -f # allp=(`cat /etc/printcap | tr "|" "\t" | cut -f 1 | grep -v "#"`) for i in ${allp[@]}; do echo -n Printer $i: cupsdisable "$i" echo " " paused. done
start_printers
:#!/bin/bash -f # allp=(`cat /etc/printcap | tr "|" "\t" | cut -f 1 | grep -v "#"`) for i in ${allp[@]}; do echo -n Printer $i: cupsenable "$i" echo " " restarted. done
Você tem que colocá-los em seu caminho (por exemplo ~/bin
) e torná-los executáveis com chmod +x
.EMBARGO: Não tenho nenhuma impressora com espaços no nome. Os scripts não são testados nesse caso (mas tenho certeza de que um dos gurus do nosso shell script irá consertar os scripts rapidamente ;-)...)
Agora você pode emitir:
[romano:~] % stop_printers
Printer PDF: paused.
Printer ColorDEA: paused.
Printer Deskjet_6980: paused.
Printer fotocop5: paused.
E você pode imprimir de onde quiser, a impressora ficará pausada:
Você pode ver sua fila:
[romano:~] % lpq -PDeskjet_6980
Deskjet_6980 is not ready
Rank Owner Job File(s) Total Size
1st romano 439 Bones_3+RG.pdf — Flesh depth 125952 bytes
(AFAIK, as filas de impressão são persistentes durante as reinicializações). E quando você quiser imprimir:
[romano:~] % start_printers
Printer PDF: restarted.
Printer ColorDEA: restarted.
Printer Deskjet_6980: restarted.
Printer fotocop5: restarted.
Usando lprm
você pode remover um trabalho se precisar; lpr
para enfileirar um documento via linha de comando, e se você quiser "listas" diferentes, ninguém proíbe definir a mesma impressora várias vezes com nomes diferentes.
Você também pode reiniciar cada impressora manualmente, bastando executar cupsenable <printername>
a partir do prompt.
O que não acho que você possa fazer com esta solução é alterar as opções de impressão após o fato --- você terá que retirar da fila e reenfileirar o documento para isso.
Responder2
Meu pacote (plug sem vergonha),duplexprfaz parte do que você deseja e inclui funções bash que podem ser úteis para lançar sua própria versão. (É codificado em bash, por isso deve ser relativamente fácil de modificar e ajudarei se puder.)
Ele foi projetado para emular a impressão duplex em impressoras não duplex e implementa seu próprio gerenciamento simples de fila de impressão. Possui interfaces GUI e CLI.
A versão atual imprime apenas em duplex e só funciona com impressoras não duplex, mas uma nova versão está em desenvolvimento que irá lidar com impressoras com hardware duplex, que essencialmente é apenas gerenciamento de impressoras e filas sem o software de emulação duplex. (Tenho disponível uma versão alfa de um script que já funciona caso alguém queira entrar em contato comigo diretamente através do projeto, etc.)
O sistema imprime na impressora padrão atual, mas os scripts dplx e duplex aceitam argumentos adicionais que são passados para lp e podem ser usados para definir quaisquer opções que lp entenda, como impressora e outras propriedades.
O sistema atualmente lida com arquivos PDF, PostScript e texto simples.
A única coisa que vainãofazer é imprimir arquivos que foram criados usando a opção Imprimir em arquivo dedentro deAcroread. Esses arquivos simplesmente não funcionam com o lp e nunca consegui chamar a atenção de nenhuma pessoa do upstream para descobrir quais são os problemas.
Pessoalmente, imprimo quase tudo "offline" (usando as opções Imprimir em arquivo suportadas pela maioria dos aplicativos), mesmo quando minhas impressoras estão disponíveis. Isso me ajuda a me concentrar no que estou fazendo. Mais tarde, quando alcanço um ponto de interrupção adequado, imprimo lotes de trabalhos.
Ter uma fila de impressão também é muito bom quando você deseja imprimir outra cópia de algo sem precisar regenerá-la e é essencial para lidar com erros da impressora, como atolamentos ou falta de toner.
Responder3
Não parece haver uma solução completa para este problema, mas aqui está uma função que adicionei ao meu .bashrc
que é semelhante aA resposta de Rmanoacima, com a conveniência adicional do preenchimento automático.
all-printers() {
if [ "$*" = "" ]
then
# Print usage."
printf "Usage:\n"
printf "all-printers start\n"
printf "all-printers stop\n"
return 1
elif ! [ "$1" = "stop" -o "$1" = "start" ]
then
printf "Unrecognized command: $1\n"
return 1
fi
cut -f 1 -d '|' /etc/printcap |
grep -v '^#' |
while read printer_name
do
if [ "$1" = "stop" ]
then
cupsdisable "$printer_name"
printf "$printer_name stopped.\n"
elif [ "$1" = "start" ]
then
cupsenable "$printer_name"
printf "$printer_name started.\n"
fi
done
}
complete -W 'stop start' all-printers