web-dev-qa-db-ja.com

印刷用に白黒ページから色を分離する

私の組織にはリースされたカラープリンターがあります。貸し手にはページごとの費用を支払いますが、カラーページの費用は白黒ページの費用よりはるかに高くなります。私たちのユーザーは正しいモードを選択することにかなり優れています。しかし、問題は、カラーページが数ページしかない大きなジョブを印刷したいときに発生します。彼らは、ジョブを手動で検索してカラーページを見つけて分離することを望んでおらず、経営陣は、カラーコストで何百もの白黒ページを印刷しないことを望んでいます。

たとえば、白黒ページの価格が1セント、カラーページの価格が8セントのプリンタを想像してみてください。ユーザーが200ページのドキュメントを印刷したいと考えています。ほとんどのページは黒のテキストですが、10ページのカラー図があります。ユーザーは図をカラーで印刷したいと考えていますが、それを行う唯一の方法は、ジョブ全体を「カラー」で印刷することです。費用は16ドルです。または、10色のページを手動で見つけて、80セントで別々に印刷します。ドキュメントの残りの部分を1.80ドル、合計2.60ドルで印刷するか、カラーページを完全に省略して、白黒ですべてを2ドルで印刷します。

印刷ジョブでカラーページを自動的に見つけて、それらのページをカラープリンターに送信し、残りのジョブを白黒プリンターに印刷できるソフトウェアはありますか?理想的なのは、ユーザーがジョブ全体をカラージョブとして印刷でき、ソフトウェアがそれをインターセプトし、カラーのページに基づいて切り刻み、各セグメントを適切なものに送信できるようにする、ある種の印刷フィルターです。プリンター。私は PaperCutNG を見つけました。これは私が望んでいることを正確に実行しますが、正直なところ、その1つの機能にお金をかける価値はありません。私は無料の解決策を見つけたいと思っていました。

私のプリントサーバーはWindows2003マシンであり、そこで実行されるソリューションが望ましいですが、必要に応じて別のOSに移行できます。クライアント側のソリューションも受け入れられます。

2
wfaulk

wfaulk、どうやってこれをやりましたか?

この機能は長い間機能してきました。

プリントドライバ自体で実行する必要があることです...オンザフライでモノラルとカラーを自動的に切り替えます。

あなたのメーカーがあなたにどんなオプションを与えるか、おそらく異なるドライバーをチェックする価値があります。

上に投稿したように、一部の印刷会計ソフトウェアはこれを実行し、料金を計算しますが、提供されているとおりに印刷ドライバーを使用しているだけです。

1
MartinC

チェックアウト PDFsam :(ご想像のとおり)PDFを分割およびマージするための無料のオープンソースユーティリティ。スクリプトを作成して、必要な処理を実行できる場合があります。

1
singingwolfboy

印刷ジョブでカラーページを自動的に見つけて、それらのページをカラープリンターに送信し、残りのジョブを白黒プリンターに印刷できるソフトウェアはありますか?

確かに、これで 商用ソリューション 。このビデオは、色が少ないときに白黒を強制するために単一のプリンターでそれを行う方法を示しています: https://www.youtube.com/watch?v=USogiHUqjTc

このビデオは、カラー印刷ジョブを別のプリンターに自動的に送信する方法を示しています: https://www.youtube.com/watch?v=Q7546WqTFq8

今、あなたの要求のために両方を組み合わせるのは簡単です。

  • 2つのチャネル(1つは白黒プリンター用、もう1つはカラープリンター用)でプロファイルを作成します。
  • チャネルごとに[ページ選択]を設定します。 b&wのチャネルの場合、b&wページのみを選択するように構成します(ヒント:さらにお金を節約し、色が少なすぎるページを選択して、b&wで印刷するように強制します;-))
  • カラープリンタの場合は、カラーページのみを選択するように設定します。

完了:-)ユーザーに白黒での印刷を強制するプロファイルがあるため、ここではPrint&Shareを多用しています。気の利いたソフトウェアで大きなROIがあると信じてください。

0
juFo

サーバー上に2台のプリンターを作成できます。 1つは黒のみを印刷し、もう1つは色を印刷するように設定されています。カラープリンタにセキュリティを追加して、承認されたユーザーのみがカラーデバイスに印刷できるようにすることもできます。ユーザーには2台として表示される1台のプリンター。また、これを使用して特定のページサイズを設定したり、両面印刷を強制したりしました。

過去にこれを頻繁に使用したことがあり、Windows Server 2003を実行している場合は、正常に機能し、費用はかかりません。

0
Dave M

私たちのプリンターでは、白黒やカラーの代わりに「自動」を選択します。自動はカラー部分に対してのみ料金を請求し、次に白黒に対して異なる料金を請求します。他に何もする必要はありません。「自動」を選択するだけです。

0
user409248

さて、これを自分で実装する必要があるようです。これまでのところ、PostScript(またはPDF)ドキュメントの各ページの色または白黒を決定する大まかなPerlスクリプト(ghostscriptおよびnetpbmへの多くのシステムコールを使用)があります。

#!/usr/bin/Perl

use File::Temp qw/ tempfile tempdir /;

my $pages=0;

my $tempdir = tempdir(CLEANUP=>1);
my ($psfh, $psfn) = tempfile(SUFFIX=>'.ps', DIR=>$tempdir);

while (<>) {
        # Write to temporary file
        print $psfh $_;
        # Count Pages
        $pages++ if ( /\%\%Page:/ );
}

if ( $pages == 0 ) {
        # Not DSC-conforming; count manually; ugh
}

my ($pdffh, $pdffn) = tempfile(SUFFIX=>'.pdf', DIR=>$tempdir, OPEN=>0);

# Convert to PDF
#print("ps2pdf ... ");
system("ps2pdf $psfn $pdffn");
#print("done\n");

# Count PDF pages
my $pdfpages = `pdfinfo $pdffn | egrep -e '^Pages'`;
$pdfpages =~ m/(\d+)/;
$pdfpages = $1;
#print("$pdfpages pages\n");

# Note: 1-based array!!
my @colorhist;
for ( my $i = 1; $i<=$pdfpages; $i++) {
        print("Page $i\n");
        my @colors = `gs -q -dFirstPage=$i -dLastPage=$i -dNOPAUSE -dBATCH -sDEVICE=ppmraw -sOutputFile=- $pdffn | ppmhist -noheader`;
        foreach (@colors) {
                m/^\s*(\d+)\s+(\d+)\s+(\d+)\s+\d+\s+(\d+)\s*$/;
                my $color = (($1<<16) + ($2<<8) + $3);
                my $instances = $4;
                $colorhist[$i]{$color} = $instances;
                #print "$color $instances\n";
        }
}

my @colorbw;

for ( my $i = 1; $i<=$pdfpages; $i++ ) {
        my %pagehist = %{$colorhist[$i]};
        #print("page $i:\n");
        my $numcolors = 0;
        my $totinstances = 0;
        foreach $key (keys(%pagehist)) {
                #print "$key\n";
                #print "\t$key $pagehist{$key}\n";
                $numcolors++;
                $totinstances += $pagehist{$key};
                my $r = $key >> 16;
                my $g = ( $key - ($r << 16) ) >> 8;
                my $b = $key - ($r << 16) - ($g << 8);
                if ( ( abs($r - $g) > 32 ) || ( abs($r - $b) > 32 ) || ( abs($g - $b) > 32 ) ) {
                        $colorbw[$i] = 2;
                }
        }
        if ( $numcolors <= 2 ) {
                $colorbw[$i] = 1;
        }
        print "$i\n" if ($colorbw[$i] > 1);
}

すでに1つの最適化があり、ページに2色しかない場合は、いずれかの色が黒、白、または灰色に近くない場合でも、白黒としてマークされます。また、別の色の1ピクセルのようなものがあるページを破棄するフィルターを実装する必要があります。また、すべてのページで発生する色で物事をフィルターで除外するために、過度にcolor-yであるページのみをマークするフィルターを実装する必要があります。 (誰かがこれを使用する場合、少なくとも一部のページを白黒で印刷するつもりであると思います。)

その後、適切なキューを介してこれらの各セットの印刷を実装する必要があります。

言語を変更する必要がある場合でも、Ghostscriptとnetpbmのものをスクリプトに戻す方法を理解できれば幸いです。

0
wfaulk

あなたが言及したpapercutのようなサードパーティのプリントサーバーマネージャーを見つける必要があります。

他のいくつかのソリューションには、次のサーバーアプリケーションが含まれる可能性がありますが、それらの特異性にあなたが探しているものが含まれているかどうかはわかりません。

  • プリントマネージャープラス
  • プリンターピア
  • Netop PrintLimit Pro
  • Equitrack
0
p858snake