web-dev-qa-db-ja.com

シェルスクリプトを仮想プリンターとして使用する

PDFファイルを引数として取り、追加のプリンター固有のオプションを使用して印刷するシェルスクリプトがあります。このスクリプトを、GUIから選択できる仮想プリンターとして追加するにはどうすればよいですか?

シェルスクリプトは、PDFファイルを受け取り、偶数ページを印刷し、ユーザーにページをめくるように求めるzenityを使用してプロンプトを表示し、奇数ページを印刷する手動の両面スクリプトです。

私の現在のワークフローは次のとおりです。

  1. ファイル->印刷->ファイルに保存-> tmp.pdf
  2. my_duplex_script tmp.pdf
  3. rm tmp.pdf

それを次のようにする方法はありますか?

  1. ファイル->印刷-> my_script_as_virtual_printer

注:これはLinux mint13シナモンにあります。私が試してみました gnome-manual-duplexしかし、それは私にはうまくいきません。


PDFファイルに出力できるGUIダイアログ Standard GTK print dialog

my_duplex_script

#!/bin/bash

lp_args=
while getopts o: opt
do
    case "$opt" in
        o)  lp_args="$lp_args -o $OPTARG" ;;
        \?) echo >&2 Invalid argument; exit 1 ;;
    esac
done
shift `expr $OPTIND - 1`

file=$1
page_count=$(pdfinfo "$file" | grep Pages | awk '{print $2}')
is_odd=`expr $page_count % 2`

if [ $is_odd -eq 1 ]
then
    #outputting blank
    echo | lp -s -t "$file"-blank
fi

#printing even reversed
lp -s -o page-set=even -o outputorder=reverse $lp_args -t "$file"-even "$file"

if zenity --question --text="Flip and reinsert the entire stack when printing has finished." --ok-label="Proceed" --cancel-label="Cancel"
then
    #printing odd reversed
    lp -s -o page-set=odd -o outputorder=reverse $lp_args -t "$file"-odd "$file"
else
    echo >&2 User abort
    exit 1
fi

exit 0
10
user80551

私はこれを試したことがありませんが、 tea4cups これは、印刷を行うスクリプトに事前フックを実装できるように思えます。その後、この印刷をキャンセルして、実際にはcupsを介して実際のプリンターに移動せず、スクリプトが代わりに印刷を実行できるようにすることができます。

抜粋

可能性は無限大 :

  • 同じジョブを複数のプリンターに同時に送信します。これはCUPSでは不可能です。
  • PDFすべての印刷ジョブのアーカイブを自動化します。
  • 重複する印刷ジョブを禁止します(簡単な例をサンプル構成ファイルに示します)
  • 15分で印刷会計ソリューションを作成します(はい、これIS FOR REAL)
  • 等...

Tea4cupsは、次の機能を提供します。

Tea4CUPSは、コマンドを起動する3つの方法を提供します。

  • フィルタ:フィルタは、入力データをプリンタに送信する前、または以下に定義するプリフックとポストフックで使用できるようにする前に変更できます。現在、印刷キューごとに1つのフィルターを定義できます。
  • プリフック:これらは、印刷ジョブが実際のプリンターに送信される前に起動されることが保証されています。 -1で終了するプレフックは、印刷ジョブをキャンセルできます。特定の印刷キューに対して任意の数の事前フックを定義できます。
  • ポストフック:ジョブがプリフックによって以前にキャンセルされていない限り、これらは印刷ジョブが実際のプリンターに送信された後に起動されることが保証されています。特定の印刷キューに対して、任意の数のポストフックを定義できます。
2
slm

このスクリプトをGUIから選択できる仮想プリンターとして追加するにはどうすればよいですか?

仮想プリンターを広告するには、/etc/printcapを編集するだけです。 [〜#〜] printcap [〜#〜] の構文に慣れる必要があるため、これは非常に簡単ではありません。

それを行う方法の例をここに示します Sambaを使用したPDFサービス

# /etc/printcap
# PDF Service entry

lp|pdf|PDF Printer:\
        :lp=/dev/null:sh:\
        :sd=/var/spool/lpd/pdf:\
        :af=/var/spool/lpd/pdf/acct:\
        :mx#0:sh:\
        :if=/usr/bin/smbprint:

ここでは、/usr/bin/smbprintスクリプトが印刷フィルターとして使用されています。プリンタ自体は/dev/nullです。

おそらくcups-bsdをインストールする必要がありますが、多くの場合、デフォルトの構成です。

2
user55518

パーティーに遅れましたが、同じことをしたかったので、他の解決策は見つかりませんでした。

私がそれをどのように解決したかをここに書きます、多分他の人が解決策が役立つと思うでしょう。

  • 印刷するファイルをキャッチするためのカップ用フィルターを作成しました
  • ファイルを印刷するためのバックエンドを作成しました
  • 素晴らしくて簡単なインストーラーを作りました。

ソースコードはgithubにあります: https://github.com/dentys03/manual_duplex_linux

すべてのHPプリンターで動作するはずです。他のプリンターにも簡単に適応できると思います。

0
Denis