Questão Software "Imprimir mais tarde"


À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 de impressoras reais não são projetadas para isso; eles imediatamente tentam imprimir o documento, e todos de repente começam a imprimir assim que eu entro na 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, especialmente quando alguns deles começaram a imprimir.

Além disso, às vezes, a impressão falha porque, por exemplo, a impressora fica sem papel ou toner e quero reimprimir o documento para uma impressora diferente. Isto não é simples com, e. CUPS ou system-config-printer; Eu geralmente tenho que voltar, abrir o leitor de PDF e começar tudo de novo. Nenhum dos leitores de PDF que conheço permite que você mantenha uma lista de documentos para imprimir mais tarde, mas isso 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 desejo imprimir.
  • Mantenha essa lista no disco para que eu possa fechar o aplicativo ou reiniciar sem perder a lista inteira.
  • Especifique as impressoras para as quais desejo enviá-las antecipadamente, 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 as atribuições da impressora e imprima as opções posteriormente.
  • Espere até 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 eu queira reimprimi-los mais tarde.

Eu sei que eu 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 achar 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. Eu quero imprimi-los, não procurá-los, e não há razão para que eles tenham que ser 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?


12
2017-07-14 07:51


origem


Comece uma recompensa se tiver reputação suficiente;) - A.B.
Tanto quanto eu posso ver, isso exigiria apenas uma simples modificação das filas da impressora como atualmente implementadas por cups. Você pode simplesmente imprimir na fila de impressão desejada, mas colocar os trabalhos da impressora "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 de system-config-printer-applet permite-me manter e liberar trabalhos de impressão, bem como movê-los para outras impressoras, mas não posso alterar a ordem dos trabalhos de impressão ou alterar as opções de impressão depois de enviar o trabalho. Além disso, nesse ponto, o caminho para o documento original desapareceu há muito tempo. - Nathaniel M. Beaver
@ A.B. Infelizmente recompensas requerem 75 pontos de internet, e eu sou um humilde ponteiro de 53. - Nathaniel M. Beaver


Respostas:


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, você precisa desses 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ê tem que colocá-los em seu caminho (por exemplo ~/bin) e torná-los executáveis ​​com chmod +x. EMBARGO: Eu não tenho nenhuma impressora com espaços em seus nomes. Os scripts não são testados nesse caso (mas tenho certeza de que um dos gurus do nosso script de shell corrigirá os scripts em um flash; -) ...)

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:

printer from 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ê 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 retomar cada impressora manualmente, é só uma questão de executar cupsenable <printername> a partir do prompt.

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


10
2017-07-14 09:06



+ 1 bom, no entanto, enquanto você pode ter suas razões, preenchendo seu array poderia ser mais simples, usando o delimitador adequado no cut parte: cat /etc/printcap | cut -d "|" -f 1 | grep -v "#" . Você economiza tempo de ciclo livrando-se da tradução tr. Isso funciona desde que você só precise do seu primeiro campo. - Cbhihe


Meu pacote (plug sem vergonha), duplexpr faz o que você quer e inclui funções bash que podem ser úteis para rolar sua própria versão. (Está codificado no bash, então deve ser relativamente fácil de modificar e eu vou ajudar se puder.)

Ele foi projetado para emular a impressão duplex em impressoras não duplex e implementa seu próprio gerenciamento de fila de impressão simples. Tem interfaces de gui e cli.

A versão atual só imprime em duplex e só funciona com impressoras não duplex, mas uma nova versão está em andamento, que irá lidar com impressoras com hardware duplex, que essencialmente é apenas o gerenciamento de impressoras e filas sem o software de emulação duplex. (Eu tenho uma versão alpha disponível de um script que já funciona se alguém quiser me contatar 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 arquivos de texto simples.

A única coisa que vai não fazer é imprimir arquivos que foram criados usando a opção Imprimir para arquivo de dentro Acroread. Esses arquivos simplesmente não funcionam com lp e eu nunca fui capaz de chamar a atenção de qualquer um dos caras do upstream para descobrir quais são os problemas.

Pessoalmente, imprimo quase tudo "offline" (usando as opções Imprimir para arquivo que a maioria dos aplicativos suporta), mesmo quando as 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 tarefas.

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 impressão, como congestionamentos ou falta de toner.


1
2017-07-15 23:15



Esse é um pacote interessante, mas parece que tem algumas arestas no momento, e não tenho certeza se conseguiria consertá-lo se algo desse errado. A propósito, você já pensou em enviá-lo para o Github? - Nathaniel M. Beaver
@bariumbitmap - Eu tenho usado diariamente por mais de 10 anos (desde que eu o escrevi pela primeira vez). Está estável. Eu também tenho uma nova versão em desenvolvimento. Se você quebrar ou precisar de recursos adicionais e estiver disposto a trabalhar comigo, eu vou consertar. Eu ainda tenho que aprender o git, então faço uso mínimo do github. O Sourceforge é muito bem conhecido. - Joe


Não parece haver uma solução completa para este problema, mas aqui está uma função que eu adicionei ao meu .bashrc que é semelhante a Resposta de Rmano acima, com a conveniência adicional de autocomplete.

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

0
2017-08-12 01:13