web-dev-qa-db-fra.com

Logiciel "Imprimez-le plus tard"

Parfois, lorsque je travaille sur mon ordinateur portable, je souhaite mettre en file d'attente quelques documents à imprimer ultérieurement, car je ne suis pas connecté à une imprimante à ce moment-là.

Cependant, les files d'attente d'impression réelles ne sont pas conçues pour cela. ils essaient immédiatement d'imprimer le document et soudain, ils commencent à imprimer dès que je suis connecté au réseau, ce qui n'est généralement pas ce que je veux faire. De plus, je souhaite parfois modifier l’ordre des documents dans la file d’attente, ce qui n’est pas très facile, en particulier une fois que certains d’entre eux ont commencé à imprimer.

De plus, parfois, l’impression échoue parce que, par exemple, l'imprimante manque de papier ou de toner et je souhaite réimprimer le document sur une autre imprimante. Ce n'est pas simple avec par exemple CUPS ou system-config-printer; Je dois généralement revenir en arrière, rouvrir le lecteur PDF et recommencer. Aucun des PDF lecteurs que je connais ne vous a laissé conserver une liste de documents à imprimer ultérieurement, mais il peut s'agir d'une fonctionnalité cachée d'un PDF lecteur quelque part que je ne connais pas.

Quoi qu'il en soit, voici ce que je veux pouvoir faire:

  • Spécifiez une liste de fichiers PDF que je veux imprimer.
  • Conservez cette liste sur le disque pour pouvoir fermer l'application ou redémarrer sans perdre la totalité de la liste.
  • Spécifiez la ou les imprimantes auxquelles je souhaite les envoyer à l'avance sans être réellement connecté à ces imprimantes à ce moment-là.
  • Spécifiez les options d'impression telles que la couleur, le recto verso et le nombre de copies.
  • Modifiez ces affectations d'imprimante et options d'impression ultérieurement.
  • Attendez d’appuyer sur un bouton ou d’exécuter une commande pour imprimer le (s) document (s).
  • Conservez une liste séparée des documents déjà imprimés, au cas où l’impression ne fonctionnerait pas ou si je souhaite les réimprimer ultérieurement.

Je sais que je pourrais pirater quelque chose avec un script Shell, lpr et une liste de chemins dans un fichier texte, mais je ne peux m'empêcher de penser que ce problème a déjà été résolu de manière plus robuste et élégante.

Points bonus:

  • N'exigez pas que les documents soient ouverts dans un PDF lecteur. Je veux les imprimer, pas les parcourir, et il n’ya aucune raison pour qu’ils aient la même application.
  • Plus d'une liste.
  • Travaille également pour Postscript, DjVu et d’autres formats de description de page.
  • Glisser-déposer depuis les gestionnaires de fichiers.

Aucune suggestion?

12
Nathaniel M. Beaver

Ce que je fais est la suivante - ce n’est pas aussi polyvalent que vous l’avez demandé, mais cela fonctionne presque bien. Vous devez définir toutes vos imprimantes, puis vous avez besoin de ces deux 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
    

Vous devez les mettre dans votre chemin (par exemple ~/bin) et les rendre exécutables avec chmod +x. CAVEAT: Je n'ai aucune imprimante avec des espaces dans leurs noms. Les scripts ne sont pas testés dans ce cas (mais je suis sûr que l'un des gourous de notre script Shell corrigera les scripts en un clin d'œil; -) ...)

Maintenant, vous pouvez émettre:

[romano:~] % stop_printers
Printer PDF:  paused.
Printer ColorDEA:  paused.
Printer Deskjet_6980:  paused.
Printer fotocop5:  paused.

Et vous pouvez imprimer où vous voulez, l’imprimante sera suspendue:

printer from evince

Vous pouvez voir votre file d'attente:

[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

(Autant que je sache, les files d'attente d'impression sont persistantes lors des redémarrages). Et quand vous voulez imprimer:

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

En utilisant lprm, vous pouvez supprimer un travail si vous en avez besoin. lpr pour mettre un document en file d'attente via la ligne de commande, et si vous voulez des "listes" différentes, personne ne vous interdit de définir plusieurs fois la même imprimante avec des noms différents.

Vous pouvez également reprendre chaque imprimante manuellement, il suffit simplement d’exécuter cupsenable <printername> à partir de l’invite.

Ce que je ne pense pas que vous puissiez faire avec cette solution, c’est de changer les options d’impression après coup - vous devrez retirer de la file d’attente et remettre le document en file d'attente pour cela.

10
Rmano

Mon paquetage (plug éhonté), duplexpr fait une partie de ce que vous voulez et inclut des fonctions bash qui peuvent être utiles pour lancer votre propre version. (Il est codé en bash, il devrait donc être relativement facile à modifier et je vous aiderai si je peux.)

Il est conçu pour émuler l'impression recto verso sur des imprimantes non-duplex et implémente sa propre gestion simple des files d'attente d'impression. Il a à la fois une interface graphique et une interface graphique.

La version actuelle n'imprime qu'en duplex et ne fonctionne qu'avec des imprimantes non-duplex, mais une nouvelle version est en cours de traitement. Elle traitera les imprimantes avec du matériel en duplex, qui consiste essentiellement en une gestion des imprimantes et des files d'attente sans le logiciel d'émulation en duplex. (J'ai une version alpha disponible d'un script qui fonctionne déjà si quelqu'un veut me contacter directement via le projet, etc.)

Le système imprime sur l’imprimante par défaut actuelle, mais les scripts dplx et duplex acceptent des arguments supplémentaires qui sont passés à lp et peuvent être utilisés pour définir les options comprises par lp, telles que l’imprimante et d’autres propriétés.

Le système gère actuellement les fichiers PDF, PostScript et texte brut.

La seule chose qu’il ne fera pas sera d’imprimer les fichiers créés à l’aide de l’option Imprimer dans un fichier depuis dans Acroread. Ces fichiers ne fonctionnent tout simplement pas avec lp et je n’ai jamais pu attirer l’attention de personnes en amont pour savoir quels sont les problèmes.

Personnellement, j'imprime quasiment tout "hors ligne" (à l'aide des options Imprimer dans un fichier prises en charge par la plupart des applications), même lorsque mes imprimantes sont disponibles. Cela m'aide à me concentrer sur ce que je fais. Plus tard, lorsque j'atteins un point d'arrêt approprié, j'imprime des lots de travaux.

Avoir une file d'attente d'impression est également très agréable lorsque vous souhaitez imprimer une autre copie de quelque chose sans avoir à la régénérer. Elle est essentielle pour traiter les erreurs d'impression telles que les bourrages ou le manque de toner.

1
Joe

Il ne semble pas exister de solution complète à ce problème, mais voici une fonction que j'ai ajoutée à mon .bashrc et qui est similaire à réponse de Rmano ci-dessus, avec la commodité supplémentaire de la saisie semi-automatique.

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
Nathaniel M. Beaver