web-dev-qa-db-ja.com

「後で印刷」ソフトウェア

時々、ラップトップで作業しているときに、後で印刷するためにいくつかのドキュメントをキューに入れたいと思うことがあります。

ただし、実際のプリンタキューはこのために設計されていません。彼らはすぐにドキュメントを印刷しようとし、私がネットワークに接続するとすぐにすべてが突然印刷を開始しますが、これは通常私がやりたいことではありません。さらに、キュー内のドキュメントの順序を変更したい場合がありますが、これは特に簡単ではありません。特に、一部のドキュメントが印刷を開始した後です。

また、印刷が失敗する場合があります。プリンターの用紙またはトナーがなくなったため、ドキュメントを別のプリンターに再印刷したい。これは例えば簡単ではありません。 CUPSまたはsystem-config-printer;通常は、戻ってPDFリーダーを再度開き、最初からやり直す必要があります。私が知っているPDFリーダーはどれも、後で印刷するドキュメントのリストを保持することはできませんが、これは私が知らないPDFリーダーの隠された機能かもしれません。

とにかく、ここで私ができることをしたいです:

  • 印刷するPDFのリストを指定します。
  • リスト全体を失うことなく、アプリケーションを閉じたり再起動したりできるように、そのリストをディスク上に保持します。
  • 実際にそれらのプリンターに接続せずに、事前に送信したいプリンターを指定します。
  • カラー、両面印刷、部数などの印刷オプションを指定します。
  • それらのプリンターの割り当てと印刷オプションを後で変更します。
  • ボタンを押すか、コマンドを実行して実際にドキュメントを印刷するまで待ちます。
  • 印刷が機能しない場合、または後で再印刷したい場合に備えて、既に印刷されたドキュメントのリストを別に保管してください。

シェルスクリプト、lpr、およびテキストファイル内のパスのリストを使用して何かをハッキングできることは知っていますが、この問題は既により堅牢でエレガントな方法で既に解決されていると感じることはできません。

ボーナスポイント:

  • 文書をPDFリーダーで開く必要はありません。閲覧するのではなく、印刷したいのですが、同じアプリケーションである必要はありません。
  • 複数のリスト。
  • Postscript、DjVu、およびその他のページ記述形式でも機能します。
  • ファイルマネージャーからドラッグアンドドロップします。

助言がありますか?

12

私がしていることは次のとおりです---それはあなたが尋ねたほど汎用的ではありませんが、ほとんど問題ありません。すべてのプリンターを定義してから、次の2つのスクリプトが必要です。

  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
    

それらをパス(たとえば~/bin)に入れ、chmod +xで実行可能にする必要があります。 警告:名前にスペースが含まれているプリンターはありません。その場合、スクリプトはテストされません(ただし、シェルスクリプトの第一人者がフラッシュ内のスクリプトを修正すると確信しています;-)...)

これで、次を発行できます。

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

そして、どこからでも印刷でき、プリンターは一時停止します。

printer from evince

あなたのキューを見ることができます:

[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

(知る限り、印刷キューは再起動後も持続します)。そして、印刷したい場合:

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

lprmを使用すると、必要に応じてジョブを削除できます。 lprコマンドライン経由でドキュメントをキューに登録します。異なる「リスト」が必要な場合、同じプリンターを異なる名前で何度も定義することを禁止しません。

各プリンターを手動で再開することもできます。プロンプトからcupsenable <printername>を実行するだけです。

このソリューションでできることはないと思いますが、事後に印刷オプションを変更することです---このためにドキュメントをデキューし、再エンキューする必要があります。

10
Rmano

私のパッケージ(恥知らずのプラグ)、 duplexpr はあなたが望むもののいくつかを行い、あなた自身のバージョンをロールするのに役立つかもしれないbash関数を含みます。 (bashでコーディングされているため、比較的簡単に変更できるはずです。できる限り支援します。)

非両面プリンターで両面印刷をエミュレートするように設計されており、独自のシンプルな印刷キュー管理を実装しています。 GUIとCLIの両方のインターフェースがあります。

現在のバージョンは両面印刷のみで、非両面プリンターでのみ動作しますが、新しいバージョンでは、両面ハードウェアを備えたプリンターを処理します。これは、本質的に、両面エミュレーションソフトウェアなしのプリンターおよびキュー管理のみです。 (プロジェクトなどを介して直接私に連絡したい場合に既に動作するスクリプトのアルファ版があります。)

システムは現在のデフォルトプリンターに印刷しますが、dplxおよびデュプレックススクリプトは追加の引数を受け入れます。これらの引数はlpに渡され、プリンターやその他のプロパティなど、lpが理解できるオプションを設定するために使用できます。

システムは現在、PDF、PostScript、およびプレーンテキストファイルを処理します。

notが行うことの1つは、withinAcroread。これらのファイルはlpでは機能せず、問題が何であるかを理解するために上流の人々の注意を引くことができませんでした。

個人的には、ほとんどのアプリケーションがサポートされている場合でも、ほとんどすべてを「オフライン」で印刷します(ほとんどのアプリケーションがサポートする[ファイルに印刷]オプションを使用)。それは私がやっていることに集中するのに役立ちます。その後、適切なブレークポイントに到達すると、ジョブのバッチを印刷します。

また、再生成せずに何かの別のコピーを印刷したい場合、印刷キューを持つことは本当に素晴らしいです。これは、紙詰まりやトナー切れなどのプリンタエラーに対処するために不可欠です。

1
Joe

この問題の完全な解決策はないようですが、オートコンプリートの追加の利便性を備えた、上記の Rmanoの答え に似た.bashrcに追加した関数を次に示します。

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