- PR -

ASP.NETでのIEの操作について

1
投稿者投稿内容
kirimaru
会議室デビュー日: 2007/11/23
投稿数: 4
投稿日時: 2007-11-23 22:31
ASP.NETで帳票を作成しています。
印刷ボタンを押すと、ブラウザにプレビューとしてPDFを表示し印刷ダイアログを出したいと思っています。プレビューのPDFは別のウィンドウにします。

PDFでの出力自体はできたのですが、印刷ダイアログ表示で躓いています。

Protected Sub btnPrint_Click(ByVal sender As Object, ByVal e As System.EventArgs)

Const OLECMDID_PRINT As Integer = 6
Const OLECMDEXECCOPT_DEFAULT As Integer = 0

Dim myUrl As String = hidden.Value
Dim ie As Object
ie = CreateObject("InternetExplorer.Application")
ie.visible = False
ie.Navigate(myUrl)
While ie.Busy
Thread.Sleep(1000)
End While
ie.ExecWB(OLECMDID_PRINT, OLECMDEXECCOPT_DEFAULT, 0, 0)
ie.visible = True
End Sub

色々でhiddenコントロールからPDF出力先のURLを拾っています。
上のコードで該当のボタンを押すと、PDFでの出力はちゃんと行われ、その後に『登録されていないドロップ先の登録を開示しています(HRESULTからの例外:0x80040100(DRAGDROP_E_NOTREGISTERED))』というIEのエラーメッセージが表示されてしまいます。

環境はOS:Vista IE7です。

お願いします。どうか助けてください(月曜日までにできないと会社くびになっちゃいます)。
れい
ぬし
会議室デビュー日: 2005/11/01
投稿数: 346
投稿日時: 2007-11-24 00:08
引用:

pa_pa_paさんの書き込み (2007-11-23 22:31) より:
ASP.NETで帳票を作成しています。
印刷ボタンを押すと、ブラウザにプレビューとしてPDFを表示し印刷ダイアログを出したいと思っています。プレビューのPDFは別のウィンドウにします。
PDFでの出力自体はできたのですが、印刷ダイアログ表示で躓いています。
Protected Sub btnPrint_Click(ByVal sender As Object, ByVal e As System.EventArgs)



そのPDFの表示はどうやってますか?
普通にサーバーにおいてるファイルをブラウザに表示させてるだけでしょうか。
それとももっと特殊なことをしてますか?

btnPrint_Clickはどこにあるコードですか?
サーバーのASP.Netですか?
クライアントになにかアプリケーションを入れてるのでしょうか?
kirimaru
会議室デビュー日: 2007/11/23
投稿数: 4
投稿日時: 2007-11-24 01:20
れいさんお返事ありがとうございます。

特殊な操作は行っておりませんが、ファイルを開くのではなくユーザーの指定した条件によって動的に作成する帳票をPDFに変換しています(市販のライブラリを利用していますのでPDFの変換はメソッド使っています)。

ユーザーのPCにはAcrobatReaderが入っていれば、PDFの閲覧自体は問題ありません。帳票は社内用ですので、利用者には予めAcrobatReaderをインストールしてもらっています。

btnPrint_ClickはサーバーのASP.Net(?)にあります。

先ほど投稿させていただいたコードなのですが、色々試してみたところ、新しいIEのインスタンスを作成した時点で、現在実行中のIEの処理が放棄されてしまっているようです。だからExecWBは実行されていません。しかもie.visible=falseとしているにもかかわらず、新しいIEが表示されてしまいます。なんかもうよく分からないです。

[ メッセージ編集済み 編集者: pa_pa_pa 編集日時 2007-11-24 01:23 ]
れい
ぬし
会議室デビュー日: 2005/11/01
投稿数: 346
投稿日時: 2007-11-24 01:49
引用:

pa_pa_paさんの書き込み (2007-11-24 01:20) より:
特殊な操作は行っておりませんが、ファイルを開くのではなくユーザーの指定した条件によって動的に作成する帳票をPDFに変換しています(市販のライブラリを利用していますのでPDFの変換はメソッド使っています)。


変換した結果をファイルに保存してそれを表示しているのですか?
それとも動的に生成した結果をどこにも保存せずに
OutputStream等で吐き出してるのでしょうか?

引用:

btnPrint_ClickはサーバーのASP.Net(?)にあります。



ですよね。なら
コード:
ie = CreateObject("InternetExplorer.Application") 


はサーバー上でIEオブジェクトを作成しようとしていることになります。
サーバー上でIEを作るのは難しそうですし、
作れたとしてもサーバー上で印刷されてしまいます。
クライアントで印刷したいならクライアントでIEを作らないとだめです。

引用:

なんかもうよく分からないです。


初めから全部わかるのは無理です。
また、基礎を飛ばしてしまうとわからなくなることもたくさんあります。
仕組みをよく考え、どう動いているのか順番に考えましょう。

どうしたら出来るのか、ちょっと考えてみました。

私はIEの制御も殆どしたことないですし
JavaScriptも殆ど知りませんし、
AcrobatReaderは扱ったことないのでよくわかりません。

ですので、以下はただの予想です。鵜呑みにしないでください。

印刷するためには
・IEから印刷
・IEに埋め込まれたAcrobatから印刷
の2通りあると思います。

Acrobatはpdfを開いてるだけです。
pdfにコマンドを埋め込まないといけませんが、
開いたら突然印刷が始まるpdfは無いと思いますので、後者は無理です。
IEから印刷ならjavascriptのprintで印刷できそうです。

手元のIE7で試したら2者は同じ結果になりましたが、
前は同じにならなかったような気がします。
同じにならないならもうダメですね。

で、同じになるなら、前者でOKですが、
javascriptはhtmlとかに埋め込まないと実行できません。
なので、フレームで区切ったり、もう一つ窓を立ち上げるscriptを組み、
そちらにpdfを表示して、元の窓からprintしてやったらできそうな気がします。

他の窓にたいしてprintが許されてるか、調べないといけませんが。

甚だ無責任な回答ですが、参考になれば。

#というか、プリントくらいボタン一つなのでユーザーにやってもらえばいいと思う。
かつのり
ぬし
会議室デビュー日: 2004/03/18
投稿数: 2015
お住まい・勤務地: 札幌
投稿日時: 2007-11-24 09:40
この手の挙動を制御したい場合は、
通常PDFの専用ビューアをユーザにインストールさせる必要があります。

引用:

btnPrint_ClickはサーバーのASP.Net(?)にあります。

先ほど投稿させていただいたコードなのですが、色々試してみたところ、新しいIEのインスタンスを作成した時点で、現在実行中のIEの処理が放棄されてしまっているようです。だからExecWBは実行されていません。しかもie.visible=falseとしているにもかかわらず、新しいIEが表示されてしまいます。なんかもうよく分からないです。


クライアントとサーバが同じPCで動いているから、
IEの制御でどうにかなりそうな雰囲気が出ていますが、PCが違えば無理です。

引用:

お願いします。どうか助けてください(月曜日までにできないと会社くびになっちゃいます)。


会社に仕様が無茶であると認識しているひとはいないんですか・・・?
momotchi
常連さん
会議室デビュー日: 2004/01/16
投稿数: 28
お住まい・勤務地: 宮城県
投稿日時: 2007-11-24 11:05
引用:

お願いします。どうか助けてください(月曜日までにできないと会社くびになっちゃいます)。


・・・うぅ。
コード:

<object id="pdf" classid="clsid:CA8A9780-280D-11CF-A24D-444553540000"
width="90%"
height="90%" >
<param id="src" name="src" value="PDF.pdf" />
</object>


ボタン押したらpdfを作成しobjectタグをどうにかして吐き出して(Response.Writeとか)<param id="src" name="src" value="PDF.pdf" /> のvalueを変更してonloadで
コード:

<script type="text/javascript" >
function print() {
var obj = document.all("pdf");
obj.PrintAll();
}
</script>
<body onload="print()">


印刷。てな感じで出来ないですかね?


[ メッセージ編集済み 編集者: momotchi 編集日時 2007-11-24 11:08 ]
kirimaru
会議室デビュー日: 2007/11/23
投稿数: 4
投稿日時: 2007-11-24 19:59
皆様!!

ありがとうございます。お返事が遅くなり本当にすみません。

なんかサーバーサイドとクライアントサイドの処理を全然理解していないのが問題のようですね。ご指摘いただいて投稿したコードがダメな理由が、なんとなく・・・、分かりました。こんな馬鹿な私にお付き合いいただいて、とても嬉しい感じです。

ええとですね。

momotchi様にご提示いただいたコードなんですが、なんかできました!わーいわーい。どーせ私なんかにゃムリだよ・・・とグダグダ色々やっていたら、とてもドキドキさせてくれるAcrobatReaderの印刷ダイアログが表示されました。わーいわーい。わーいわーい。
(まだ全然整理できていないんですけ)。

あと、なんかIISのインストールが巧くいかなくて実際の環境で試せていないのですが、なんか心がいっぺんに軽くなりました。

本当にありがとうございます。首が繋がった感じです。わーいわーいわーい。

また質問させていただくこともあるかもしれませんが、その際にもどうぞ皆様よろしくお願いします。感謝!!
1

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