23

現在、別のアプリケーションからメッセージを受信し、そのメッセージの内容をフォーマットして、プリンターに送信するプロジェクトに取り組んでいます。選択するテクノロジは、C#Windowsサービスです。出力はレポートと呼ぶことができると思いますが、レポートエンジンは必要ありません。StringTemplateのような単純なテンプレートエンジン、またはHTMLを出力するXSLTでさえ問題ありません。私が抱えている問題は、サービスからこの種の出力を印刷するための無料の方法を見つけることです。動作するように見えるので、MicrosoftのRDLCを使用してプロトタイプを作成し、ローカルレポートにデータを入力してから、それをイメージとしてメモリストリームにレンダリングし、それを印刷します。それに関する問題は次のとおりです。

  • 複数ページの印刷は大きな頭痛の種になります。
  • それでも、PrintDocumentを使用してメモリストリームを印刷する必要があります。これは、Windowsサービスではサポートされていません(動作する可能性はありますが、プロトタイプではまだそれほど進んでいません)。
  • 出くわすデータが変更された場合、データセットとデータが逆シリアル化されるクラスを変更する必要があります。悪い悪い悪い。

誰かがこのようにリモートで何かをしなければならなかったのですか?何かアドバイス?ユーザー入力なしでHTMLを印刷することについての質問をすでに投稿しましたが、それに約3日を費やした後、少なくとも無料で利用できるツールでは、HTMLを印刷できないという結論に達しました。

すべての助けに感謝します。

編集:私たちは.NETFrameworkのバージョン2.0を使用しています。

4

11 に答える 11

16

信頼してください。サードパーティのコンポーネントを購入する場合と比較して、このソリューションの検索/開発に多くの費用がかかります。車輪の再発明をして、有料のソリューションを選択しないでください。

印刷は複雑な問題であり、これに対してより優れたフレームワークサポートが追加される日が来るのを楽しみにしています。

于 2008-08-11T19:20:29.707 に答える
10

Windowsサービスからの印刷は本当に苦痛です。それはうまくいくようです...時々...しかし最終的にそれは明確な理由なしに時々例外を壊したり投げたりします。それは本当に絶望的です。公式には、説明も代替ソリューションの提案もなしに、サポートされていません。

最近、私はこの問題に直面し、何度か試行と実験に失敗した後、ついに2つの実行可能な解決策を見つけました。

  • Win32 API(たとえば、C / C ++)を使用して独自の印刷DLLを作成し、P / Invokeを使用してサービスから使用します(正常に動作します)
  • 独自の印刷COM+コンポーネントを作成し、サービスから使用します。私は最近このソリューションを成功裏に選択しました(しかし、それはサードパーティのCOM +コンポーネントであり、自分で作成したものではありません)それも完全に正常に機能します。
于 2008-08-11T19:01:49.170 に答える
8

やりました。それはA *の痛みです。問題は、印刷には GDI エンジンが配置されている必要があることです。これは、通常、ログインしているときにのみ読み込まれるデスクトップが必要であることを意味します。サーバー上のサービスからこれを実行しようとしている場合は、通常はログインしていません。

したがって、最初は通常のサービス ユーザーとして実行することはできませんが、代わりに対話型ログイン権限を持つ実際のユーザーとして実行できます。次に、サービス レジストリ エントリを微調整する必要があります (現時点で方法を忘れてしまいましたが、本当に興味がある場合は、今夜実行できるコードを見つける必要があります)。最後に、あなたは祈らなければなりません。

あなたの最大の長期的な頭痛の種は、印刷ドライバーです。ログインしているユーザーなしでサービスとして実行している場合、一部のプリンター ドライバーは時々ダイアログを表示します。プリンターのトナーがなくなるとどうなりますか? それとも紙切れ?ドライバーは、決して表示されないダイアログをポップアップ表示し、誰もログインしていないため、プリンター キューを保持する場合があります。

于 2008-10-07T14:21:02.707 に答える
5

最初の質問に答えるために、これはデータによってはかなり簡単です。お客様が求めていることを正確に実行するさまざまなサービスベースのアプリケーションがあります。通常、受信ファイルを解析し、独自の Postscript または PCL をラップします。レイアウトがかなり単純な場合は、必要なフォント/印刷レイアップを提供するためにラップできる非常に基本的な PCL コードがいくつかあります (ここでオフラインでいくつかのガイダンスを提供できれば幸いです)。

印刷可能なファイルがあれば、共有されている UNC プリンターに送信したり、ローカルにインストールされたプリンターに直接送信したり、デバイスの IP (RAW または LPR タイプのデータ) に送信したりできます。

ただし、PDF パスをたどる場合、最も簡単な方法は、直接 PDF 印刷をサポートするプリンターに PDF 出力を送信することです (現在、多くのプリンターがサポートしています)。この場合、PDF をデバイスに送信するだけで印刷できます。

もう 1 つのオプションは、必要に応じて無料のGhostscriptを起動し(いくつかの異なるバージョン、いくつかの GNU、いくつかの GPL などがあるため、ライセンスを確認してください)、組み込みの印刷機能を使用するか、単に Postscript に変換して送信することです。デバイス。私はサービス アプリで Ghostscript を何度も使用しましたが、基本的にコマンド ライン アプリをシェルアウトして実行し、変換を行うため、あまり好きではありません。そうは言っても、正常に失敗する傾向がある安定したアプリです

于 2008-10-07T14:08:40.157 に答える
4

サービスからの印刷は悪い考えです。ネットワークプリンタは「ユーザーごと」に接続されます。サービスを特定のユーザーとして実行するようにマークすることはできますが、セキュリティ慣行としては悪いと思います。ローカルプリンターに接続できるかもしれませんが、それでもこのルートに進む前に躊躇します。

最良のオプションは、サービスにデータを保存させ、ユーザーが起動したアプリケーションにデータをサービスに要求して印刷を実行させることです。または、データベースなど、データが保存される一般的な場所。

データを定期的に印刷する必要がある場合は、タスクスケジューラを使用してタスクイベントを設定します。サービスからプロセスを起動するには、ユーザー名とパスワードを知っている必要がありますが、これもセキュリティ上の問題です。

印刷自体については、サードパーティのツールを使用してレポートを生成するのが最も簡単です。

于 2008-08-11T22:08:57.963 に答える
1

これはあなたが探しているものではないかもしれませんが、私がこれをすばやく汚くする必要がある場合は、次のようにします。

  1. 別のWPFアプリケーションを作成します(組み込みのドキュメント処理を使用できるようにするため)
  2. サービスにデスクトップと対話する機能を提供します(これが機能するために、実際にデスクトップに何も表示したり、ログインしたりする必要はないことに注意してください)
  3. サービスにアプリケーションを実行させ、印刷するデータを提供します。

おそらく、これをジガーして、サービスから実行するWebブラウザーから印刷することもできます(ただし、完全なブラウザーを使用するのではなく、独自のシェルIEを構築することをお勧めします)。

より詳細な(これも無料の)ソリューションの場合、最善の策は、おそらく自分でドキュメントを手動でフォーマットすることです(GDI +を使用してレイアウトを行います)。これは面倒で、エラーが発生しやすく、時間がかかり、開発中に大量の紙を浪費しますが、プリンターに何を送るかを最も細かく制御することもできます。

于 2008-08-11T17:46:52.220 に答える
1

DevExpress の XtraReportsを使用して、サービスから問題なく印刷しています。それらのレポート モデルは Windows フォームのレポート モデルに似ているため、テキスト要素を動的に挿入してから印刷コマンドを発行できます。

于 2009-08-27T19:13:02.763 に答える
1

ポストスクリプトに出力できる場合、一部のプリンターは、特定のディレクトリに FTP で送信されたものをすべて印刷します。

これを使用して、私たちの大学が私たちに公開した印刷クレジットを回避しましたが、サービスが ps に出力する場合は、ps ファイルをプリンターに ftp するだけで済みます。

于 2008-10-07T14:26:15.283 に答える
0

PDF印刷についてのあなたの質問に答えて、私はエレガントな解決策を見つけられませんでした。私はAdobeに「シェル」していて、信頼性が低く、ユーザーは常にログインする必要がありました。この特定の問題を修正するために、処理するファイル(請求書)を、ネイティブの.NET印刷機能を使用して分割して印刷できる複数ページのTiffファイルとしてフォーマットするように要求しました。Adobeの立場は、「ユーザーにAdobe Readerでファイルを表示させ、[印刷]をクリックできるようにする」ことのようです。使い物にならない。

私はまだウェブサーバーから出力できる高品質のレポートを作成する良い方法を見つけたいと思っています...

于 2008-10-21T13:09:55.247 に答える
0

サードパーティのルートに行くと思います。XSL-> HTML-> PDF->プリンターフローが好きです...WinnovativeのHTMLからPDFは最初の部分では良さそうですが、良いPDF印刷ソリューションを見つけるのに苦労しています...何か提案はありますか?理想的には、ライセンスは、デプロイされたランタイムベースではなく、開発者ベースになります。

于 2008-08-11T20:38:25.293 に答える
0

Yann Trevin の回答によると、System.Drawing.Printing を使用した印刷は MS ではサポートされていません。ただし、新しい WPF ベースの System.Printing を使用できる場合があります (と思います) 。

于 2009-07-14T22:25:34.577 に答える