Oprogramowanie „Wydrukuj później”


12

Czasami, gdy pracuję na laptopie, chcę ustawić w kolejce kilka dokumentów do wydrukowania później, ponieważ nie jestem wtedy podłączony do drukarki.

Jednak rzeczywiste kolejki drukarek nie są do tego przeznaczone; natychmiast próbują wydrukować dokument i wszyscy nagle zaczynają drukować, jak tylko wejdę do sieci, co na ogół nie jest tym, co chcę zrobić. Co więcej, czasami chcę zmienić kolejność dokumentów w kolejce, co nie jest bardzo łatwe, szczególnie po rozpoczęciu drukowania niektórych z nich.

Ponadto czasami drukowanie kończy się niepowodzeniem, ponieważ np. W drukarce zabrakło papieru lub tonera i chcę ponownie wydrukować dokument na innej drukarce. Nie jest to proste w przypadku np. CUPSLub system-config-printer; Zazwyczaj muszę wrócić, ponownie otworzyć czytnik PDF i zacząć od nowa. Żaden z czytników PDF, które znam, nie pozwala przechowywać listy dokumentów do wydrukowania później, ale może to być ukryta funkcja czytnika PDF w miejscu, o którym nie wiem.

W każdym razie oto, co chcę być w stanie zrobić:

  • Podaj listę plików PDF, które chcę wydrukować.
  • Zachowaj tę listę na dysku, aby móc zamknąć aplikację lub uruchomić ponownie bez utraty całej listy.
  • Określ drukarki, do której chcę je wysłać z wyprzedzeniem, bez faktycznego połączenia z tymi drukarkami w tym czasie.
  • Określ opcje drukowania, takie jak kolor, dupleks i liczba kopii.
  • Zmień te przypisania drukarki i opcje drukowania później.
  • Poczekaj, aż naciśniesz przycisk lub uruchomię polecenie, aby faktycznie wydrukować dokument (y).
  • Zachowaj osobną listę dokumentów, które zostały już wydrukowane, na wypadek, gdyby drukowanie nie działało lub chcę je wydrukować później.

Wiem, że mogę zhakować coś razem ze skryptem powłoki lpri listą ścieżek w pliku tekstowym, ale nie mogę nie poczuć, że problem ten został już rozwiązany w bardziej solidny i elegancki sposób.

Punkty bonusowe:

  • Nie wymagaj, aby dokumenty były otwarte w czytniku plików PDF. Chcę je wydrukować, a nie przeglądać, i nie ma powodu, dla którego muszą być tą samą aplikacją.
  • Więcej niż jedna lista.
  • Działa również dla Postscript, DjVu i innych formatów opisu strony.
  • Przeciągnij i upuść z menedżerów plików.

Jakieś sugestie?


Rozpocznij nagrodę, jeśli masz wystarczającą reputację;)
AB

O ile widzę, wymagałoby to jedynie prostej modyfikacji kolejek drukarek, które są obecnie realizowane przez cups. Po prostu drukujesz w wybranej kolejce drukarki, ale wstrzymujesz zadania drukarki, dopóki nie zdecydujesz się ich „zwolnić”. Wystarczy przycisk „wstrzymany”. Czy coś mi umknęło?
Jos

@Jos Moja wersja system-config-printer-appletpozwala mi wstrzymywać i zwalniać zadania drukowania, a także przenosić je do innych drukarek, ale nie mogę zmienić kolejności zadań drukowania ani zmienić opcji drukowania po przesłaniu zadania. Do tego momentu ścieżka do oryginalnego dokumentu już dawno minęła.
Nathaniel M. Beaver

@AB Niestety nagrody wymagają 75 punktów internetowych, a ja jestem słabo 53-punktowy.
Nathaniel M. Beaver,

Odpowiedzi:


10

To, co robię, jest następujące - nie jest tak wszechstronne, jak prosiłeś, ale działa prawie w porządku. Musisz zdefiniować wszystkie drukarki, a następnie potrzebujesz tych dwóch skryptów:

  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
    

Musisz umieścić je na swojej ścieżce (na przykład ~/bin) i umożliwić ich wykonanie chmod +x. PRZESTROGA : Nie mam żadnej drukarki ze spacjami w nazwach. Skrypty nie są w tym przypadku testowane (ale jestem pewien, że jeden z guru naszego skryptu naprawi je błyskawicznie; -) ...)

Teraz możesz wydać:

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

Możesz drukować z dowolnego miejsca, drukarka zostanie wstrzymana:

drukarka z evince

Możesz zobaczyć swoją kolejkę:

[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, kolejki wydruku są trwałe po ponownym uruchomieniu). A kiedy chcesz wydrukować:

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

Za pomocą lprmmożesz usunąć pracę, jeśli potrzebujesz; lprdo kolejkowania dokumentu za pomocą wiersza poleceń, a jeśli chcesz mieć różne „listy”, nikt nie zabrania definiowania tej samej drukarki kilka razy pod różnymi nazwami.

Możesz także wznowić każdą drukarkę ręcznie, to tylko kwestia uruchomienia cupsenable <printername>z monitu.

To, co nie sądzę, że możesz zrobić z tym rozwiązaniem, to zmiana opcji drukowania po fakcie --- będziesz musiał usunąć kolejkę z kolejki i ponownie zakolejkować dokument w tym celu.


2
+1 dobry, jednak jednocześnie może mieć swoje powody, wypełniania swoją tablicę mogłoby być prostsze przy użyciu odpowiedniego separatora cutczęści: cat /etc/printcap | cut -d "|" -f 1 | grep -v "#". Oszczędź sobie trochę czasu cyklu, pozbywając się tłumaczenia tr. Działa to pod warunkiem, że potrzebujesz tylko pierwszego pola.
Cbhihe,

1

Mój pakiet (bezwstydna wtyczka), duplexpr robi to, co chcesz i zawiera funkcje bash, które mogą być przydatne w tworzeniu własnej wersji. (Jest zakodowany w bashu, więc jego modyfikacja powinna być stosunkowo łatwa i pomogę, jeśli będę mógł).

Został zaprojektowany do emulacji drukowania dwustronnego na drukarkach innych niż dupleks i implementuje własne proste zarządzanie kolejką wydruku. Ma zarówno interfejs GUI, jak i CLI.

Obecna wersja drukuje tylko w trybie dupleks i działa tylko z drukarkami bez dupleksu, ale działa nowa wersja, która będzie obsługiwać drukarki ze sprzętem do drukowania dwustronnego, co w zasadzie jest tylko zarządzaniem drukarką i kolejką bez oprogramowania do emulacji dupleksu. (Mam dostępną wersję alfa skryptu, który już działa, jeśli ktoś chce się ze mną skontaktować bezpośrednio przez projekt itp.)

System drukuje na bieżącej domyślnej drukarce, ale skrypty dplx i duplex akceptują dodatkowe argumenty przekazywane do lp i mogą być używane do ustawiania dowolnych opcji, które lp rozumie, takich jak drukarka i inne właściwości.

System obsługuje obecnie pliki PDF, PostScript i zwykły tekst.

Jedyne, czego nie zrobi, to wydrukuj pliki utworzone za pomocą opcji Drukuj do pliku z poziomu Acroread. Te pliki po prostu nie działają z lp i nigdy nie byłem w stanie zwrócić uwagi któregokolwiek z wcześniejszych użytkowników, aby dowiedzieć się, jakie są problemy.

Osobiście drukuję prawie wszystko „offline” (korzystając z opcji Drukuj do pliku, które obsługują większość aplikacji), nawet jeśli moje drukarki są dostępne. Pomaga mi skoncentrować się na tym, co robię. Później, kiedy osiągnę odpowiedni punkt przerwania, drukuję partie zadań.

Posiadanie kolejki wydruku jest również bardzo miłe, gdy chcesz wydrukować kolejną kopię czegoś bez konieczności jej ponownego generowania i jest to niezbędne w przypadku błędów drukarki, takich jak zacięcia lub brak toneru.


To interesujący pakiet, ale wygląda na to, że ma teraz kilka szorstkich krawędzi i nie jestem pewien, czy będę w stanie go naprawić, jeśli coś pójdzie nie tak. Nawiasem mówiąc, czy zastanawiałeś się nad przesłaniem go do Github?
Nathaniel M. Beaver,

@bariumbitmap - używam go codziennie od ponad 10 lat (odkąd go napisałem). Jest stabilny. Mam też nową wersję w fazie rozwoju. Jeśli go zepsujesz lub potrzebujesz dodatkowych funkcji i zechcesz ze mną współpracować, naprawię to. Muszę się jeszcze nauczyć git, więc używam github w minimalnym stopniu. Sourceforge jest bardzo dobrze znany.
Joe,

0

Wydaje się, że nie ma kompletnego rozwiązania tego problemu, ale oto dodana do mnie funkcja .bashrcpodobna do powyższej odpowiedzi Rmano , z dodatkową wygodą autouzupełniania.

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
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.