@IT会議室は、ITエンジニアに特化した質問・回答コミュニティ「QA@IT」に生まれ変わりました。ぜひご利用ください。
- PR -

プリンタからの印刷結果を受け取りたい

1
投稿者投稿内容
さくら
ベテラン
会議室デビュー日: 2004/02/12
投稿数: 76
投稿日時: 2006-02-08 19:51
OS:WindowsXP Pro
アプリ:VB.NET 2003 Windowsアプリ

現在、VB.NET2003で開発したWindowsアプリを
動かしています。
このWinアプリからデータベース(Oracle10g)へ接続し、
取得してきた情報をExcelにセットして、
そのExcelシートを印刷するという処理を
1000回連続で行なっています。

このとき、セットする情報サイズに違いがあるからか
印刷指令を出した順に印刷されず、
順番が前後していたり、
最悪な場合は印刷が飛んでしまい
出力されないこともあります。

この状況を回避するために、
印刷指令をかけたもの(Excelシート)が
本当にプリンタから印刷されたかどうかを
プログラム側で知る方法を探しています。
でも、プログラム側としてみれば
印刷指令をかけた時点でお役御免となり、
あとはプリンタに任せた形になると思うので、
こんなことって実際にできるのでしょうか…??

プリンタはネットワークプリンタで、
この印刷処理をしている最中は他端末から
このプリンタに対して、一切印刷しないと
いうことは運用で可能です。

代替案でも何でも構いませんので
もし何かありましたらぜひ教えてください。
よろしくお願い致します。
甕星
ぬし
会議室デビュー日: 2003/03/07
投稿数: 1185
お住まい・勤務地: 湖の見える丘の上
投稿日時: 2006-02-08 22:18
引用:

さくらさんの書き込み (2006-02-08 19:51) より:
OS:WindowsXP Pro
このとき、セットする情報サイズに違いがあるからか
印刷指令を出した順に印刷されず、
順番が前後していたり、
最悪な場合は印刷が飛んでしまい
出力されないこともあります。


印刷処理の完了を待たずに、次々と印刷を行った場合順番が前後することは確かにあるでしょう。ですが、印刷されない、出力されないと言うことは考えられません。プリンタのジャムで印刷が一時停止することがあったとしても、問題が解決した時点から再開できるはずです。プリントスプーラが溢れて、印刷処理でエラーが発生したりしていませんか?あるいはプリンタドライバの不具合と考えた方がよいのでは?

引用:

この状況を回避するために、
印刷指令をかけたもの(Excelシート)が
本当にプリンタから印刷されたかどうかを
プログラム側で知る方法を探しています。
でも、プログラム側としてみれば
印刷指令をかけた時点でお役御免となり、
あとはプリンタに任せた形になると思うので、
こんなことって実際にできるのでしょうか…??


Windowsの提供しているインターフェースは双方向に通信するプリンタの事を意識していません。しがたがって、メーカー独自のAPIでも使わない限り、印刷が正常に完了したか否かを確実に判断する手段はありません。
ですが印刷の順番が変わってしまったり、あるいは印刷スプーラから正常にプリンタに対してデータが送られたか否かを知るだけならある程度は可能です。EnumJobs APIでスプーラにたまっている印刷要求や、そのステータスを取得する事が出来ます。一つずつ確実に印刷が終了するのを待って、次の印刷にかかることである程度は予防できるかもしれません。
じゃんぬねっと
ぬし
会議室デビュー日: 2004/12/22
投稿数: 7811
お住まい・勤務地: 愛知県名古屋市
投稿日時: 2006-02-08 23:06
引用:

さくらさんの書き込み (2006-02-08 19:51) より:

取得してきた情報をExcelにセットして、
そのExcelシートを印刷するという処理を
1000回連続で行なっています。


ちょww Excel 先生にそんな無茶をさせないでください。
ただでさえ、Excel は印書が下手なんですから...

引用:

このとき、セットする情報サイズに違いがあるからか
印刷指令を出した順に印刷されず、順番が前後していたり、


まあ非同期になっていれば、稀にそういったことはあるでしょうね。

引用:

最悪な場合は印刷が飛んでしまい
出力されないこともあります。


これ、Excel Book 相手だと確かにあります。
ドライバとの相性かもしれませんが、他のアプリケーションでは OK だったり。

引用:

この状況を回避するために、
印刷指令をかけたもの(Excelシート)が
本当にプリンタから印刷されたかどうかを
プログラム側で知る方法を探しています。


回避手段を誤ってるかもしれません。
制御というのは常に一方向であるのが望ましいです。

とはいうものの、ブロックなどしていたらパフォーマンスが落ちるので、
ちゃんとしたレポート ツールを使うのが近道だと思います。
これならば、何度再セットしても Excel のように Busy ったりしないです。

Job が 1 つでも構わないのであれば、出力イメージを固める方法もあるかな。

引用:

プリンタはネットワークプリンタで、この印刷処理をしている最中は他端末から
このプリンタに対して、一切印刷しないということは運用で可能です。


ユーザー運用対応ですか...
スプーリング用の DB に投げて運用したことを思い出しました... orz

_________________
C# と VB.NET の入門サイト
じゃんぬねっと日誌
かつのり
ぬし
会議室デビュー日: 2004/03/18
投稿数: 2015
お住まい・勤務地: 札幌
投稿日時: 2006-02-08 23:24
甕星さんもおっしゃるような感じですが
以前に実装したことがあります。
Win32APIで印刷ジョブを監視して、
パラレルで動作しないようにするモノでしたが・・・

自身のプログラムが独自に印刷するのであれば、
印刷ジョブのIDがわかるので制御が簡単ですが、
例えばVBA等でシートをドンドン印刷していく場合、
エクセルの機能で印刷されるため、
列挙したジョブの印刷名(?)から
該当のジョブを推測するしか方法がありません。

もし、別プロセスから同じ名前のジョブが発生した場合に、
誤作動を起こす可能性があるんですね。
この辺を注意する必要があります。

後はジョブが開始・終了というライフサイクルが完了するまで、
監視・待機を繰り返せば大丈夫です。

私が作ったのはブラウザからActiveXでPDFを連続印刷するものでしたが、
原理的には同じような気がします。

#Win32APIは詳しくないので、ウソを言ってたらゴメンナサイ・・・
さくら
ベテラン
会議室デビュー日: 2004/02/12
投稿数: 76
投稿日時: 2006-02-13 10:25
お返事ありがとうございます。

ユーザーが印字内容(最初に書く季節の挨拶など)を
容易に変えれるようにして欲しいとの要望から
Excelでの印刷にしたのですが…。

Win32APIでのジョブ監視の方向で考えてみたいと思います。
自身のプログラムから印刷命令は実行していますので
印刷ジョブIDの制御は出来るかなと思っております。

また他の案でも結構ですので、何かありましたら
ぜひ教えてください。
ありがとうございました。
1

スキルアップ/キャリアアップ(JOB@IT)