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

[ASP.NET] サーバ側のプリンタでサーバ内のWordファイルを印刷したい

投稿者投稿内容
さぼさぼ
会議室デビュー日: 2006/09/15
投稿数: 5
投稿日時: 2006-09-15 18:55
初めて投稿いたします。
よろしくお願致します。

サーバー側にあるWordファイルを
サーバーにインストールされているAcrobatのプリンター
(印刷する事でPDFを作るプリンターで、
デフォルトで印刷されるように設定されています)
で印刷し、PDFに変換したいのですが、上手くいきません。

App_Code直下にprintPdf.vbを配置し、下記クラスを用意しました。

コード:

Public Class PrintPdf
 Public Function PrintPdf() As Boolean

  Dim prc_SysSt As New System.Diagnostics.ProcessStartInfo
  Dim prc_Proc As New System.Diagnostics.Process
  With prc_SysSt
   .FileName = "¥¥Server¥folder¥a.doc"
   .Verb = "print"
  End With

  Diagnostics.Process.Start(prc_SysSt)
  prc_Proc.WaitForExit(1000)
  prc_Proc.Kill()

 End Function
End Class

¥マークがなぜか増えるので全角で代用しました。
実際は半角になっています。




このクラスをWeb画面のボタンイベントで
インスタンスを作成し、実行しました。
結果はローカルのASP.NET開発サーバーでは上手くいきました。
ですが、Webサーバへ配置し、
ネットワーク越しに実行すると長い間実行状態になり、
止まってしまいます(スプールもされていません)。

どのようにすれば印刷できるようになるかわかりません。
権限も調べて見ましたが、違うようです。
元々、サーバ側のリソースを使う事はできないのかも知れませんが・・。

拙い文章ですが、お教えいただけると幸いです。
よろしくお願いいたします。
じゃんぬねっと
ぬし
会議室デビュー日: 2004/12/22
投稿数: 7811
お住まい・勤務地: 愛知県名古屋市
投稿日時: 2006-09-15 19:49
引用:

さぼさぼさんの書き込み (2006-09-15 18:55) より:

prc_Proc.WaitForExit(1000)
prc_Proc.Kill()


たったの 1 秒で Process を強制的に Kill してしまって良いのでしょうか。

_________________
C# と VB.NET の入門サイト
じゃんぬねっと日誌
さぼさぼ
会議室デビュー日: 2006/09/15
投稿数: 5
投稿日時: 2006-09-16 07:17
引用:

じゃんぬねっとさんの書き込み (2006-09-15 19:49) より:

たったの 1 秒で Process を強制的に Kill してしまって良いのでしょうか。



ご返答有難う御座います。
私の認識が間違っていると思いますが、
プリンターにキューを送った場合、その時点でOS側に処理が渡ってしまい、プログラム側
とは非同期になると思っていたのでProcessをKillするまで1秒で充分だと思っていました。

実際にソースを変更できるのが週明けになってしまいます。
申し訳ありません。
じゃんぬねっと
ぬし
会議室デビュー日: 2004/12/22
投稿数: 7811
お住まい・勤務地: 愛知県名古屋市
投稿日時: 2006-09-16 11:47
引用:

さぼさぼさんの書き込み (2006-09-15 18:55) より:

.Verb = "print"


ローカルで試されていますか?
この引数では、Microsoft Excel でも Open Office でも印刷されないと思いますよ。

細かいところですが、

引用:

Public Function PrintPdf() As Boolean


のわりに戻り値がないのも、ちょっと気になりました。

引用:

ProcessをKillするまで1秒で充分だと思っていました。


タイムアウトとして利用するにしては、かなり厳しい値だと思います。

_________________
C# と VB.NET の入門サイト
じゃんぬねっと日誌
さぼさぼ
会議室デビュー日: 2006/09/15
投稿数: 5
投稿日時: 2006-09-19 11:01
遅くなりまして申し訳ありません。
早速ですが、試した結果報告を兼ねて返信いたします。

引用:

じゃんぬねっとさんの書き込み (2006-09-16 11:47) より:
ローカルで試されていますか?
この引数では、Microsoft Excel でも Open Office でも印刷されないと思いますよ。


ローカルではASP.NET開発用サーバ
(Visual Studio2005の標準機能のローカル開発用サーバ)
を使って試しました。引数もそのままです。
Verbに"print"を渡しています。
結果は成功し、PDFファイルが作成されました。

引用:

細かいところですが、
Public Function PrintPdf() As Boolean
のわりに戻り値がないのも、ちょっと気になりました。


確かにありません。修正しました。
Try〜Catchで例外をハンドリングするようにします。
ご指摘ありがとうございます。
また、タイムアウトですが、10秒に設定致しました。
様子を見ながら調節するように致します。
(本当はこういうコーディングはいけないのかもしれませんね・・。)


現在の状況はやはりサーバー側で実行させるとスプールもされません。
恥ずかしながらどのように引数を渡せば印刷されるようになるのかも
わかっていません。調べてはいますが、少し時間がかかりそうです。
かるあ
ぬし
会議室デビュー日: 2003/11/16
投稿数: 1190
お住まい・勤務地: センガワ→ムサシノ
投稿日時: 2006-09-19 11:33
引用:

さぼさぼさんの書き込み (2006-09-19 11:01) より:

ローカルではASP.NET開発用サーバ
(Visual Studio2005の標準機能のローカル開発用サーバ)
を使って試しました。引数もそのままです。


との事なので、どのユーザに定義されたプリンタを使用しているか
という問題な気がします。

さぼさぼ
会議室デビュー日: 2006/09/15
投稿数: 5
投稿日時: 2006-09-19 14:32
引用:

かるあさんの書き込み (2006-09-19 11:33) より:
どのユーザに定義されたプリンタを使用しているか
という問題な気がします。



情報ありがとうございます。
サーバ側のプリンタのセキュリティにはEveryoneに
印刷できる権限が付与されています。

調べたところ、旧ASPのCreateObjectで
Excel.Application等を使う為にはローカル偽装をしなければ
ならないとありました。
もしかすると、OfficeやAcrobatがインストールされているだけの状態
では実行できないのかもしれません。
まったく明後日の方向に調べ物が進んでるような気もしていますが・・・。

現在もやはり出力するに至っていません。
頭がコンガラガッテいます・・。
さぼさぼ
会議室デビュー日: 2006/09/15
投稿数: 5
投稿日時: 2006-09-21 19:25
問題解決しておりませんが、実装方法を変えて多少進展しましたので
ご報告として書き込みいたします。

Wordを印刷する際、Processを使用せず、New Word.Applicationで
オブジェクトを作成して行う事としました。
(非推奨であるうえに、WordのオブジェクトはExcelほど
行儀がよくないようです)

IISの実行ユーザを適切な権限で偽装し、
Wordオブジェクトを参照設定にWord Object Libraryを追加し、
オブジェクトからPrintOutメソッドを実行し印刷が出力されました。

ただ、通常のプリンターからは印刷されるものの、
PDFへの変換印刷はできていません。
何かPDF用に特殊な処理があるのかもしれません。
また、サーバ側にプロセスが残る現象(印刷待ちの状態でQuitが
走るとサーバでダイアログが表示される為、制御処理が必要)等の
問題もあります。


アドバイスを下さった
じゃんぬねっと様
かるあ様
ありがとうございました!

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