3

pdf、tiff、jpeg、doc など、さまざまな形式の複数のファイルを受信するアプリケーションを構築しました。受信後、それらは、サーバーにローカルにインストールされているサードパーティの印刷ドライバーを使用して tiff ファイルに変換され、デフォルトのプリンター。これを行うには、コマンド ラインと引数を指定して System.Diagnostics.Process を開き、適切なアプリケーションでファイルを出力します。

新しいバージョンは Windows サービスである必要があり、これまでのところ、印刷部分を除いてすべて正常に動作しています。プロセスが開始されるたびに、例外が発生することはなく、すべてが正常に機能しているように見えますが、ファイルが出力されることはありません。タスク マネージャーを開くと、MS ペイントが実行されていることがわかりますが (jpeg ファイルの場合)、出力 tiff ファイルはありません。

補足として、お客様が別のサードパーティ製ツールを使用しているため、最終的なファイルは tiff ファイルである必要があり、それがサポートされている唯一の形式です。

どんな助けでも大歓迎です。セルジオ・ロメロ

使用しているコードは次のとおりです。

private const string PROCESS_COMMAND = "mspaint.exe";  
private const string PROCESS_ARGUMENTS = @"""{0}""";  

Process proc = new Process();  
ProcessStartInfo startInfo = new ProcessStartInfo();  
string error = string.Empty;  

startInfo.FileName = PROCESS_COMMAND;  
startInfo.Arguments = string.Format(PROCESS_ARGUMENTS, fileFullPath);  
startInfo.UseShellExecute = false;  
startInfo.RedirectStandardError = true;  

proc.EnableRaisingEvents = false;  
proc.StartInfo = startInfo;  

proc.Start();  

using(StreamReader errorReader = proc.StandardError)  
{  
    string standardError = string.Empty;  
    while((standardError = errorReader.ReadLine()) != null)  
    {  
        error += standardError + " ";  
    }  
}  
proc.WaitForExit();
4

5 に答える 5

3

最初に提案するのは、特定のユーザーのコンテキストでサービスを実行することです。次に、そのユーザーとしてサーバーにログインし、プリンターがインストールされていること、デフォルトとして設定されていることなどを確認します。

次に、MSペイントソリューションを捨てて、物事を単純化します。System.Drawing.Image.FromFile(YourImageFilePath)を使用して.NETに画像をロードし、PrintDocumentを使用して残りを行うことができます...

PrintDocumentオブジェクトを作成し、設定(使用するプリンター、マージンなど)を定義し、e.Graphics.DrawImage(YourTiffImageObject、New Rectangle(0、0、 e.MarginBounds.Width、e.MarginBounds.Height))を使用して、TIFF画像をページに描画します。最後に、PrintDocumentオブジェクトの.Printメソッドを呼び出すと、それがなくなります。

このように、.NETは印刷を処理します-ランダムなサードパーティアプリではありません。

一度に複数のページを処理する場合、いくつかのマイナーなコード変更があります(主に、SelectActiveFromを呼び出して複数ページのTIFFのページを変更し、最後のページを読むまでPrintPageイベントでe.HasMorePages = Trueを設定します)しかし、それはすべてかなり簡単で十分に文書化されています。

更新: 完全を期すために、他の人がすでに述べたことを追加する必要があると思います...一部のアプリケーションは、正しく機能するためにデスクトップアクセスを必要とする場合があります。MSペイントを使用する場合は、サービスのプロパティで[サービスにデスクトップとの対話を許可する]を有効にする必要がある場合があります。

于 2008-11-04T17:45:08.730 に答える
0

これをコンソール アプリから実行すると、MSPaint は開きますか? その場合、おそらくサービスがヘッドレスで実行されているためです。UI を表示する権限がありません。そのため、MSPaint は基本的に、エラーなしで UI を開くことができないため、保釈されます。

.NET から直接印刷しないのはなぜですか? これはサービスから実行できます。ただし、サービスで使用するように設計されていない System.Printing に関する警告がいくつかあります。理由はわかりません。今まで問題なくできていたのに…

于 2008-11-04T17:40:15.247 に答える
0

アプリを起動しようとするサービスに関して、あらゆる種類の問題に遭遇しました。多くの場合、それはセキュリティ/資格情報が使用されているか、アプリ (この場合は mspaint) が必要とする可能性があるため、「デスクトップとの対話をサービスに許可する」を有効にするようなものです。

そうは言っても、私はケビンに同意し、MSPaint を捨てて、.NET 内でネイティブに印刷するか、変換だけの問題であれば、.NET を使用して変換します。もう 1 つは、PDF などの .NET 内でネイティブにサポートされていない形式を処理するために、LibTIFF などのライブラリや Ghostscript などのライブラリを使用して、MSPaint よりももう少し洗練されたものを検討することです。

于 2008-11-04T18:52:47.037 に答える
0

MSPaint の部分についてはよくわかりませんが、アプリがサービスとしてではなくコンソール アプリとして機能する場合は、ユーザー アカウントが行うことを行う権限がサーバーにない可能性があります。

アクセス許可の問題を除外するために、サービスにログオンしてみてください。

于 2008-11-04T17:26:22.343 に答える
0

サービスのインストールに使用されたユーザーが適切な印刷権限および/またはファイルへのアクセス権を持っているかどうかを確認してください。イベント ログを使用することもお勧めします。

于 2008-11-04T17:34:48.190 に答える