Software "Imprima mais tarde"

12

Às vezes, quando estou trabalhando no meu laptop, quero enfileirar alguns documentos para imprimir mais tarde, pois não estou conectado a uma impressora no momento.

No entanto, 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 eu chego à rede, o que geralmente não é o que eu quero fazer. Além disso, às vezes eu quero alterar a ordem dos documentos na fila, o que não é muito fácil, principalmente quando alguns deles começam a imprimir.

Além disso, às vezes a impressão falha porque, por exemplo, a impressora fica sem papel ou toner, e desejo reimprimir o documento em uma impressora diferente. Isso não é direto com, por exemplo, CUPSou system-config-printer; Geralmente, preciso voltar, abrir novamente o leitor de PDF e começar de novo. Nenhum dos leitores de PDF que conheço permite que você mantenha 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.

Enfim, aqui está o que eu quero ser capaz de fazer:

  • Especifique uma lista de PDFs que quero imprimir.
  • Mantenha essa lista em disco para que eu possa fechar o aplicativo ou reiniciar sem perder a lista inteira.
  • Especifique as impressoras para as quais quero enviá-las antecipadamente sem estar realmente conectado a essas impressoras no momento.
  • Especifique opções de impressão como cores, frente e verso e número de cópias.
  • Altere as atribuições da impressora e as opções de impressão posteriormente.
  • Aguarde até eu pressionar um botão ou executar um comando para realmente imprimir o (s) documento (s).
  • Mantenha uma lista separada de documentos que já foram impressos, caso a impressão não funcione ou que eu queira reimprimi-los mais tarde.

Eu sei que poderia hackear algo junto com um script de shell lpre uma lista de caminhos em um arquivo de texto, mas não posso deixar de sentir que esse problema já foi resolvido de uma maneira 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 procurá-los, e não há motivo para que eles tenham o mesmo aplicativo.
  • Mais de uma lista.
  • Também trabalhe para Postscript, DjVu e outros formatos de descrição de página.
  • Arraste e solte dos gerenciadores de arquivos.

Alguma sugestão?

Nathaniel M. Beaver
fonte
Inicie uma recompensa se você tiver reputação suficiente;)
AB
Tanto quanto posso ver, isso exigiria apenas uma simples modificação das filas de impressoras, conforme implementada atualmente cups. Você simplesmente imprimiria na fila de impressora desejada, mas colocaria os trabalhos "em espera" até decidir "liberá-los". O botão "em espera" é tudo o que é necessário. Ou eu sinto falta de alguma coisa?
Jos
@Jos Minha versão system-config-printer-appletpermite reter e liberar trabalhos de impressão, além de movê-los para outras impressoras, mas não posso alterar a ordem dos trabalhos de impressão nem as opções de impressão após o envio do trabalho. Além disso, nesse ponto, o caminho para o documento original já está longe.
Nathaniel M. Beaver
@AB Infelizmente, as recompensas exigem 75 pontos de internet, e eu sou um ponteiro baixo de 53 pontos.
Nathaniel M. Beaver

Respostas:

10

O que 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, esses dois scripts:

  1. 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
    
  2. 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ê precisa colocá-los no seu caminho (por exemplo ~/bin) e torná-los executáveis ​​com chmod +x. CAVEAT : Não tenho impressora com espaços em seus nomes. Os scripts não são testados nesse caso (mas tenho certeza de que um dos gurus de nossos scripts de shell corrigirá 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 será pausada:

impressora de evince

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 nas reinicializações). E quando você deseja imprimir:

[romano:~] % start_printers         
Printer PDF:  restarted.
Printer ColorDEA:  restarted.
Printer Deskjet_6980:  restarted.
Printer fotocop5:  restarted.

Usando lprmvocê pode remover um trabalho, se necessário; lprpara enfileirar um documento por meio da 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, é apenas uma questão de executar a cupsenable <printername>partir do prompt.

O que eu acho que você não pode fazer com esta solução é alterar as opções de impressão após o fato - você precisará desenfileirar e re-enfileirar o documento para isso.

Rmano
fonte
2
+1 bom, no entanto, enquanto você pode ter suas razões, povoando sua matriz poderia ser mais simples, utilizando o delimitador apropriado na cutparte: cat /etc/printcap | cut -d "|" -f 1 | grep -v "#". Você economiza algum tempo de ciclo ao se livrar da tradução tr. Isso funciona, desde que você precise apenas do seu primeiro campo.
Cbhihe
1

Meu pacote (plugue descarado), duplexpr faz o que você deseja e inclui funções bash que podem ser úteis para rodar sua própria versão. (É codificado no bash, portanto, deve ser relativamente fácil de modificar e ajudarei, se puder.)

Ele foi projetado para emular a impressão dúplex em impressoras não duplex e implementa seu próprio gerenciamento simples de filas de impressão. Possui interfaces GUI e CLI.

A versão atual imprime apenas em frente e verso e funciona apenas com impressoras não-frente e verso, mas uma nova versão está sendo trabalhada para lidar com impressoras com hardware duplex, que basicamente é apenas gerenciamento de impressoras e filas sem o software de emulação duplex. (Eu tenho uma versão alfa disponível de um script que já funciona se alguém quiser 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 o lp e podem ser usados ​​para definir quaisquer opções que o lp entenda, como impressora e outras propriedades.

O sistema atualmente lida com arquivos PDF, PostScript e texto sem formatação.

A única coisa que isso não fará é imprimir arquivos criados usando a opção Imprimir em arquivo no Acroread. Esses arquivos simplesmente não funcionam com o lp e eu nunca consegui chamar a atenção de ninguém do upstream para descobrir quais são os problemas.

Pessoalmente, imprimo quase tudo "offline" (usando as opções Imprimir em arquivo compatíveis com a maioria dos aplicativos), mesmo quando minhas impressoras estão disponíveis. Isso me ajuda a me concentrar no que estou fazendo. Mais tarde, quando chego a 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 de impressora, como atolamentos ou falta de toner.

Joe
fonte
Esse é um pacote interessante, mas parece que ele tem algumas arestas agora e não tenho certeza se seria capaz de corrigi-lo se algo desse errado. A propósito, você já pensou em enviá-lo para o Github?
Nathaniel M. Beaver
@bariumbitmap - uso-o diariamente há mais de 10 anos (desde que o escrevi). É estável. Eu também tenho uma nova versão em desenvolvimento. Se você quebrá-lo ou precisar de recursos adicionais e estiver disposto a trabalhar comigo, eu o corrigirei. Ainda tenho que aprender o git, então faço um uso mínimo do github. O Sourceforge é muito conhecido.
Joe
0

Não parece haver uma solução completa para esse problema, mas aqui está uma função que eu adicionei à minha .bashrcque é semelhante à resposta de Rmano acima, 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
Nathaniel M. Beaver
fonte