|
分類:[.NET 全般]
こんにちは
いつも拝見し参考にさせて頂いております。
早速なのですが、タイトル通りのご質問をさせていただきます。
現在業務用Webアプリケーションを作成しています。
その中の機能で、ユーザー毎にPDFファイルがサーバーに登録されていて、ある画面で一覧で表示されたユーザーを選択し、
「印刷」ボタンを押すと複数のPDFを開かずに直接印刷するような機能を作っています。
↑とてもわかりずらい説明で申し訳ないので簡単な図解を…。
========PDF一括印刷===============
|選|ユーザー名 |PDFファイル名 |
+--+---------+----------+
|□|ユーザーA|user_a.pdf|
|■|ユーザーB|user_b.pdf|
|□|ユーザーC|user_c.pdf|
|■|ユーザーD|user_d.pdf|
[印刷]
※上記■のユーザーのPDFファイルを印刷します。
==================================
現状、JavaScript(ActiveX)を使用して下記のように制御していますが、どうしても最後のPDFを印刷した後に空のAdobe Readerが
起動したままになってしまいます、印刷するたびにAdobe Readerを閉じなければならないとのことで、
下記方法がだめになってしまったので、なにかいい方法があればご教授していただきたいです。
あと開発環境と動作環境は下記のとおりです。
○開発環境
ASP.NET / C#
○動作環境
Windows2000 / IE6 / Adobe Reader 7
テストのために変なコメントありますがお許しください。無理やり処理させてる感もいっぱいです。
= C# ===============================================
protected void Print_Click(object sender, EventArgs e)
{
String FilePathList;
for (int i = 0; i < GridView_ReceiptManage.Rows.Count; i++)
{
if (((CheckBox)GridView_ReceiptManage.Rows[i].Cells[0].Controls[0]).Checked)
{
//JavaScriptでsplit処理させるため、最後に","を付与
FilePathList += @"\\サーバーパス\" + GridView_ReceiptManage.Rows[i].Cells[2].Text + ",";
}
}
//BodyにJavaScript埋め込み
Page.ClientScript.RegisterClientScriptBlock(Page.GetType(), String.Empty,
String.Format("<body onload=\"PrintPdfFile('{0}')\"></body>", FilePathList ));
}
====================================================
= JavaScript =======================================
function PrintPdfFile(FilePathList)
{
//複数PDF出力ファイルパスを配列に格納
var sList = FilePathList.split(",");
//最後の","分を引く
var iCnt = sList.length - 1;
//選択されたPDFファイル分回す
for (i=0; i < iCnt; i++)
{
var objFSO, objOpenedFile;
var strFile;
strFile = sList[i];
if(strFile == null || strFile == "")
break;
try
{
// ActiveXObjectを作成
objFSO = new ActiveXObject("WScript.Shell");
}
catch( e )
{
// ActiveXObject生成失敗
window.alert("ActiveXオブジェクトを生成できませんでした。IEのセキュリティー低くしてください。");
break;
}
try
{
//AdobReader起動(デフォルトプリンターに直印刷・新規インスタンスでOpen)
//,起動画面と同サイズで最前面に起動,プロセス終了待たずに次処理
objOpenedFile = objFSO.Run("ACRORD32.EXE /t /n " + strFile, 5, false);
//=====無理やり終了させる処理追加・・・。START=======================================================
var objCLOSE;
objCLOSE = new ActiveXObject("WScript.Shell");
//★パターン1【taskkill.exeでプロセス終了させてみる。】
//思ったらtaskkillはXPのみのコマンドだった・・・。だめじゃん
//objCLOSED = objCLOSE.Run("taskkill ACRORD32.EXE", 5, false);
//★パターン2【SendKeysメソッドで終了キーを送ってみる。】
// SendKeys メソッドを使用する
//アクロバットリーダーをアクティブにする
objCLOSE.AppActivate("ACRORD32.EXE");
//[Ctrl + Q]を押下処理で終了させてみる。
objCLOSE.SendKeys("^(Q)"); //うまく動きませんでした。
objCLOSE = null;
//=====無理やり終了させる処理追加・・・。END=================================================
objFSO = null;
}
catch( e )
{//WScript実行中エラー
window.alert("Adobe Readerの起動に失敗しました。");
break;
}
}
}
====================================================
長くなってしまい申し訳ありませんがよろしくお願いします。
|