Linuxでの紙文書の便利なコピー

この記事では、単純なグラフィカルインターフェイスをbashスクリプトに固定する方法を示します。



先史時代



少なくとも一度は生涯で誰もがコピー文書に出くわしました。 コピー装置からMFPまで、さまざまなコピー装置が販売されており、スキャナー、プリンター、コピー機が1つの装置に統合されています。 スキャナーとプリンターがある場合は、コピープログラムを使用できます。 これらのプログラムには、多くのスキャナーモデルが付属しています。 自宅では、後者のオプションを使用することを好みました。 コピー装置はハーフトーンなしでコピーし、MFPはスペースを節約しますが、コンポーネントの1つ(通常はプリンター)が故障した場合、完全に廃棄する必要があり、スキャナーの品質はあまり良くありません。



多くのスキャナーモデルと同様に、EpsonコピーユーティリティプログラムはEpson Perfection photo 2480スキャナーに導入されましたが、その主な欠点はWindows専用のバージョンが入手可能であったことです。 Linuxで同様のプログラムを検索しても何も見つかりませんでした。

フォーラムの1つで、スクリプトを書くことをお勧めし、執筆の手伝いさえしました。 スクリプトは次のとおりです。



#! /bin/bash SCANNER=`sane-find-scanner -q | sed -e 's/.*at /snapscan:/'` #      TMPFILE="/tmp/scan.tiff" #     LOCKFILE="/tmp/copy.lock" #  #     #   ,       if ! lockfile-create --retry 2 -l $LOCKFILE; then exit fi scanimage --device-name $SCANNER --format tiff --mode Gray -x 210 -y 297 --resolution 300 --brightness -3 -p > $TMPFILE #.     man scanimage tiff2ps -z -w 8.27 -h 11.69 $TMPFILE | lp lockfile-remove -l $LOCKFILE #  
      
      







インターフェースを固定します



上記のスクリプトには大きな欠点がありました-コピーの数を指定することは不可能でした。 小さな変更の後、コマンドラインでコピーの数を示すことが可能になりましたが、これはコンソールに登りたくない私の家族には向いていませんでした。 インターフェースを使用してネイティブアプリケーションを作成することはできませんでした。 次に、ダイアログ、zenity、kdialogプログラムを使用して、bashスクリプトへのインターフェイスを固定できることがわかりました。 さて、zenity +を使用して書き換えを試みました。さまざまなエラー処理を追加しました。 インターフェースの追加は簡単ではありませんが、非常に簡単です! それが私から来たものです。



まず、変数とブロックを定義します。



 SCANNER=`sane-find-scanner -q | sed -e 's/.*at /snapscan:/'` #      DIALOG=zenity TMPFILE="/tmp/scan.tiff" #     LOCKFILE="/tmp/copy.lock" #  DLG_COUNT_TITLE=" " DLG_COUNT_TEXT="   " DLG_PROGRESS_TITLE=" " DLG_PROGRESS_TEXT="..." MSG_START_PROCESS="    $SCANNER" MSG_SCAN="" MSG_PRINT="   " MSG_COMPLETE="   ." MSG_ERROR_LOCK=":    ,        ." MSG_ERROR_SCAN=":   ,          ." MSG_ERROR_PRINT=":   ."
      
      







すべての変数を初期化した後、スクリプトはコピー数を要求します。 プログラムは結果をコンソールに返しますが、逆引用符を使用して(ロシア語の「」が配置されているが英語のレイアウトでは)、結果を変数COPY_COUNTに割り当てます。



 COPY_COUNT=`$DIALOG --scale\ --title="$DLG_COUNT_TITLE"\ --text="$DLG_COUNT_TEXT"\ --min-value=1\ --max-value=50\ --value=1\ --step=1`
      
      







Zenityは、変数$?に格納されているリターンコードを返します。これを確認する必要があります。 リターンコード:0-ユーザーが何かを指定/入力し、[OK]をクリックしました。 1-ユーザーが「キャンセル」をクリックした。 -1-エラーが発生しました。 リターンコード0でのみプログラムを続行することをお勧めします。 ユーザーが誤ってスクリプトを実行する可能性があり、キャンセルオプションが必要です。



 if [[ "$?" == "0" ]]; then #  fi
      
      







スキャンおよび印刷プロセスは数秒から数分まで非常に「長い」ため、プロセスがどの段階で進行しているかを何らかの形で示す必要があります。 この場合、ユーザーはスキャンの段階でコピー処理を停止できる必要があります。 バーの進捗状況については、zenityには--progress



があり--progress



。 その結果、前のコードは次の形式を取ります。



 if [[ "$?" == "0" ]]; then ( #  ) | $DIALOG --progress \ --title="$DLG_PROGRESS_TITLE" \ --text="$DLG_PROGRESS_TEXT" \ --percentage=0 --auto-close fi
      
      







進行状況バーを移動するには、「有用なコード」コメントでマークされたブロックのエコーでパーセント値を表示する必要があります。たとえば、 echo 10



進行状況バーを10%に、 echo 100



から100%に設定します。 現在のプロセスのどの段階(スキャン、印刷、またはプログラムの終了)を示すには、テキストとしてエコーも使用する必要がありますが、メッセージの先頭にポンド記号を追加する必要があります。たとえば、エコー "#Scanning in progress"はプログレスバーにテキストを強制的に表示します。



そして最後に、スキャンおよび印刷コマンドを追加しています。



おわりに



その結果、非常にシンプルで直感的なインターフェイスと、エプソンのネイティブコピープログラムに劣らない機能を備えたプログラムが完成しました。



 #! /bin/bash SCANNER=`sane-find-scanner -q | sed -e 's/.*at /snapscan:/'` #      DIALOG=zenity TMPFILE="/tmp/scan.tiff" #     LOCKFILE="/tmp/copy.lock" #  DLG_COUNT_TITLE=" " DLG_COUNT_TEXT="   " DLG_PROGRESS_TITLE=" " DLG_PROGRESS_TEXT="..." MSG_START_PROCESS="    $SCANNER" MSG_SCAN="" MSG_PRINT="   " MSG_COMPLETE="   ." MSG_ERROR_LOCK=":    ,        ." MSG_ERROR_SCAN=":   ,          ." MSG_ERROR_PRINT=":   ." #     if ! lockfile-create --retry 2 -l $LOCKFILE; then $DIALOG --error --text "$MSG_ERROR_LOCK" exit fi COPY_COUNT=`$DIALOG --scale\ --title="$DLG_COUNT_TITLE"\ --text="$DLG_COUNT_TEXT"\ --min-value=1\ --max-value=50\ --value=1\ --step=1` if [[ "$?" == "0" ]]; then ( echo "# $MSG_START_PROCESS" echo "10" sleep 2 echo "# $MSG_SCAN" echo "25" #.     man scanimage scanimage --device-name $SCANNER\ --format tiff\ --mode Gray\ -x 210 -y 297 --resolution 300\ --brightness -3 > $TMPFILE if [ $? != 0 ]; then $DIALOG --error --text "$MSG_ERROR_SCAN" lockfile-remove -l $LOCKFILE exit fi echo "# $MSG_PRINT" echo "75" #     if [[ "$COPY_COUNT" == "1" ]]; then tiff2ps -z -w 8.27 -h 11.69 $TMPFILE | lp else tiff2ps -z -w 8.27 -h 11.69 $TMPFILE | lp -n $COPY_COUNT fi if [ $? != 0 ]; then $DIALOG --error --text "$MSG_ERROR_PRINT" lockfile-remove -l $LOCKFILE exit fi rm -f $TMPFILE echo "# $MSG_COMPLETE" echo "100" sleep 2 ) | $DIALOG --progress\ --title="$DLG_PROGRESS_TITLE"\ --text="$DLG_PROGRESS_TEXT"\ --percentage=0\ --auto-close || lockfile-remove -l $LOCKFILE fi lockfile-remove -l $LOCKFILE
      
      







私のスクリプトがお役に立てば幸いです。



All Articles