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


10

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

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

私の現在のワークフローは:

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

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

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

注:これはLinuxのmint 13シナモンです。試しましたgnome-manual-duplexがうまくいきません。


PDFファイルに印刷できるGUIダイアログ 標準GTK印刷ダイアログ

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

回答:


2

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

抜粋

可能性は無限大 :

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

Tea4cupsは以下を容易にします。

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

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

2

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

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

これを行う方法の例は、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が、多くの場合はデフォルトの設定です。


printcapは、BSD lprまたはlprNGの構成ファイルであり、現在の事実上の標準であり、Mintの標準であるCUPSの構成ファイルではないことに注意してください。
Gilles「SO-邪悪なことをやめなさい」

したがって、私はcups-bsdパッケージがMintでも利用可能であることを述べました。このパッケージはデフォルトでインストールされ、十分にサポートされています。cups-bsdlprngではありません!印刷に使用するアプリケーションlpr(つまり、xpdf)をサポートするために、CupsにBSD印刷の機能を提供するのは単なるラッパーです。

0

パーティーに遅れたが、私は同じことをしたかったので、他の解決策を見つけられなかった。

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

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

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

どのHPプリンターでも機能するはずです。他のプリンターにも簡単に適応できると思います。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.