TOP > AcroPDFLib.AxAcroPDF > printWithDialog
説明
印刷ダイアログを表示します。
ページの選択状態があれば、範囲印刷設定が印刷ダイアログに設定されます。
注)PDFドキュメントのセキュリティ設定で印刷不可の場合は当メソッドは無視されます。
形式
void PrintWithDialog();
戻り値
- 無し。
引数
- 無し。
サンプル:ExcelのVBA
- F8キーでステップ実行しながら動作確認する。
- 事前にPDFブラウザ用の参照設定をする。
- 以下はサンプルの一部で、サンプルExcel(A)をダウンロードすると詳しくわかる。
・・・・ 001 Private Sub cmdPrintWithDialog_Click()
002 '印刷ダイアログを表示します。ページの選択状態があれば、
003 '範囲印刷設定が印刷ダイアログに設定されます。
004 '注)PDFドキュメントのセキュリティ設定で印刷不可の場合は
005 ' 当メソッドは無視されます。
006 AcroPDF1.printWithDialog
007 End Sub
・・・・
Highlight:プログラミング言語のソースコードを構文で色分け (GUI編)
補足
- 特に無し。
動作確認環境
- WindowsXP Pro(+ SP3) +
Acrobat 8.1.2 Pro + Office 2003 + MicrosoftUpdate
< 戻る >
はじめまして。
現在、以下のようなイントラ上のシステムを開発しております。
『イントラ上のWEBページにある帳票印刷ボタンをクリックすると、IEの別ウィンドウが起動し、IEのAcrobatReaderプラグインで帳票PDFを表示し、かつAcrobatReaderプラグインの印刷ダイアログを自動表示させ、ユーザが印刷ダイアログのOKボタンをクリックし、帳票の印刷を行う。』
JavaScriptからIE内のAcrobatReaderの制御を行う際、わからない点が多く、こちらのサイトを参考にしながら、どうにか思うような動作が出来るようになってきたところです。
が、どうしても1つだけ解決できない問題が発生しており、困っています。
PrintWithDialogメソッドを使用すると、IEの別ウィンドウの他に空のAcrobatReader(アプリケーション)も一緒に起動されてしまうのです。
ダイアログが表示されないPrintAllメソッドやPrintPagesメソッドなども試してみましたが、どれも同様の動作となってしまいます。
この、空のAcrobatReaderの起動を抑止することは可能かどうか、ご存知でしたらお教え願いたくコメントいたしました。
開発環境は、以下の通りです。
・WindowsXP Professional SP3
・Internet Explorer 7
・Adobe Reader 8.1.3
また参考までに、別ウィンドウ表示用のHTML(JavaScript込み)を以下に示します。
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" >
<head>
<title>印刷用ページ</title>
<script type="text/javascript">
<!--
function SetPDF(){
document.PDF_OBJ.setShowToolbar(true);
document.PDF_OBJ.PrintWithDialog();
}
//-->
</script>
</head>
<body onLoad="SetPDF()">
<form>
<object id="PDF_OBJ" type="application/pdf" style="width:100%; height:100%" data="Print.pdf" >
</object>
</form>
</body>
</html>
以上になります。
お忙しいとは存じますが、ご返答頂ければ幸いです。
すいません。先ほどのコメントの際、名前を書き漏らしました…。
失礼致しました。
うるきちさん。初めまして。
コメント読ませて頂きました。
今までで最高難易度の質問です。(激汗
いい返事が出来るかは全く自信が有りませんが、しかし検討させて頂きます。
しばし、お時間を下さい。
うるきちさん。
イメージはこんな感じになるのでしょうか?
http://nnn2.com/test1/TestA3.html
xAcroPDFLib.AxAcroPDFオブジェクトでは、やはり無理があります。この空のアプリケーション表示の制御は現段階では見当が付かないです。
で、とりあえず裏技?です。
それとサーバーの環境を公開できる範囲で結構ですのでザックリと教えて下さい。
Q1)HTMLは動的に作成されるのか?
Q2)イントラ上、このシステム(PDF表示)の使用頻度は? 時間単位ぐらいで。感でも結構です。
Q3)サーバー上のシステム(CPU+HD)に余裕はありますか?
とりあえず、質問はココまでです。
管理人様
お世話になります。
早速お返事を頂き、ありがとうございます。
>イメージはこんな感じになるのでしょうか?
>http://nnn2.com/test1/TestA3.html
はい。こんな感じです。
やはり無理があるのですね。
とにかく、ご質問にお答え致します。
>それとサーバーの環境を公開できる範囲で結構ですのでザックリと教えて下さい。
>Q1)HTMLは動的に作成されるのか?
ASP.NET(言語はC#)にて動的に作成します。
サーバ環境は、
・Win2003 R2 Enterprise Edition SP2
・IIS 6.0
になります。
>Q2)イントラ上、このシステム(PDF表示)の使用頻度は? 時間単位ぐらいで。感でも結構です。
使用頻度については、ざっくりとしか分からないのですが、5分に1回くらいの頻度になると思われます。
>Q3)サーバー上のシステム(CPU+HD)に余裕はありますか?
サーバスペックに関しては、余裕ありです。
以上です。
回答に不足な点がございましたら、ご連絡下さい。
現在、提案前の動作確認中・・。
しかし、その前に追加質問です。
Q4) HTMLで表示された印刷ダイアログを表示するPDFはローカルに保存する事はあるのでしょうか?
無いのならば簡単に御提案出来ると思います。理由はPDFにAcrobatJavaScriptで「this.print(true);」メソッドを埋め込ましているからです。よってローカルに保存されると、PDFを表示する都度に印刷ダイアログが表示されてしまう。
ローカル保存が有るのならば追加ロジックで自分がサービーにいるかどうかの判断ロジックがAcrobatJavaScriptに必要になると予測しています。※AcrobatJavaScriptは熟知していない。
サーバー側で上記のAcrobatJavaScriptを埋め込んだ一時的なPDFで公開する仕組みです。原本PDFは更新せずに公開用PDFとして新しいPDFをサーバーで作成します。もちろん一定の条件でサーバー側でその一時PDFを削除する仕組みが必要になります。
この考え方はうるきちさんが描いているシステムに取り込めるのでしょうか?
お返事が遅くなってしまい、申し訳ありませんでした。
まずはご質問に対する回答です。
>Q4) HTMLで表示された印刷ダイアログを表示するPDFはローカルに保存する事はあるのでしょうか?
ローカルに保存することは、ありません。
>サーバー側で「this.print(true);」メソッドを埋め込んだ一時的なPDFで公開する仕組みです。
>原本PDFは更新せずに公開用PDFとして新しいPDFをサーバーで作成します。
>もちろん一定の条件でサーバー側でその一時PDFを削除する仕組みが必要になります。
>この考え方はうるきちさんが描いているシステムに取り込めるのでしょうか?
あらかじめPDFにJavaScriptを埋め込んでしまう、というやり方なんですね。
もともとの仕様が、
『公開用PDFをWebサーバ上で動的に作成(iTextSharpを使用)し、公開する』
というものなので、この考え方は全然問題ありません。
一時PDFファイルの削除の仕掛けも用意されています。
ただし、WebサーバにAcrobatをインストールすることはできないのですが、『AcrobatJavaScriptを埋め込む』という作業はAcrobatが無くてもできるのでしょうか?
(色々と調べてみたのですが、AcrobatJavaScriptを埋め込む方法がいまいちよくわかりませんでした…)
期待していた返事を頂きました。
>・・Acrobatをインストールすることはできない・・
この件はチョット横に置いといて・・。(汗
PDFに『AcrobatJavaScriptを埋め込む』機能は無いと思います。しかしシステムとしては作れます。以下が手順です。
1) DUMP.PDFを事前に用意します。空の1ページしかありません。しかし、JavaScriptの「this.print(true);」メソッドが組み込まれています。
2) 表示したいPDFの全頁をDUMP.PDFの1ページ目の最後に全部追加します。
3) DUMP.PDFの1ページ目だけ削除します。
4) DUMP.PDFをWEB用に公開PDFとします。
上記の操作をAcrobatを手動で操作して動作確認OKです。JavaScriptの情報は残ります。
と言う事はOLEでも簡単に出来るはずですが・・。実は逆にこのJavaScriptがOLE操作中に動作して駄目です。JavaScript部分の作りこみが必要です。OLE操作時はJavaScriptを動作させない。ロジックは出来ているがコーディングで苦労している。※だから、AcrobatJavaScriptは熟知していないって・・。
サーバーでAcrobatのOLEが使用出来ないのならは、「pdftk」という有名なGPLソフトを使えませんか? もちろんフリーです。
ただし、これも実行中にOLEと同じ問題が出たら厄介です。JavaScriptが動作する件です。
PDFのページの追加と削除が.NETで簡単に出来れば「pdftk」は不要です。.NETはほとんど経験が無いので判りません。※2000、2005、2008を持っていますが。(恥
あれ?
iTextSharpって、オープンソースですよね。「pdftk」もオープンソースだったはず。
iTextSharpにPDFのページ追加、ページ削除機能は無いですか?
ありそうな・・感じですが。
但し、操作中にPDFイベントが発生したら、これまたAcrobatJavaScriptの作りこみガ発生します。
サーバー環境下では印刷ダイアログは表示しない、と。
お返事、ありがとうございました。
PDFページの追加と削除が.Net上で行えるかどうか、しばらく格闘してみたいと思います。
で、その前に自分でもAcrobatを手動操作し動作イメージを見てみようと思っているのですが、
まず、手順1)の内容については確認することができました。
(この時点でファイルを保存し、開きなおしてみると、印刷ダイアログが表示されました!)
しかし、手順2)以降を実行してみたものの、JavaScriptが消えてしまいました(+_+)
ページ追加の方法が正しくないのでしょうか?
私が行った手順ページ追加の手順は以下の通りです。
①Acrobatのメニューから[文書]-[ページ]-[挿入]を実行
②「挿入するファイルの選択」ダイアログにて、挿入するファイルを選択
③「ページの挿入」ダイアログにて、場所:後、ページ:最終 を選択
※この状態でJavaScriptを設定しておいた1ページ目を削除すると、2ページ目にはJavaScriptの情報は残っていません。
話が少し長くなりますが・・。
通常のやり方では該当するJavaScriptが入ったPDFは作れません。
理由は後で。
まずは私が作った http://nnn2.com/test1/TestA3.html 内のPDFをローカルに保存して下さい。それでうるきちさんの上記操作をして見てください。印刷ダイアログは出ます。※多分。
ここから理由です。
AcrobatはPDF文書を開く時専用のイベント操作画面が用意されていません。そうゆうイベントは用意されていません(※本当は有るが)。理由は不明です。しかし作ることは簡単です。
以下にその手順を示します。
1) 数ページ程度の適当なPDFを用意します。
2) Acrobatで上記PDFを開きます。
3) メニューから、[アドバンスト(A)] -> [文書処理(D)] -> [文書レベル JavaScript編集(D)]を選択する。
4) 「JavaScript関数」と書かれたダイアログ画面が表示される。
5) スクリプト名に「AAA」と適当に入れる。
6) 「追加(A)」ボタンをクリックする。
7) JavaScriptエディッタ画面が表示されるので、
function AAA()
{
this.print(true);
}
と一行追加する。そして「OK」ボタンをクリックする。
8) 「JavaScript関数」画面の「閉じる(C)」ボタンをクリックする。
※ココからです。
9) メニューから、[アドバンスト(A)] -> [文書処理(D)] -> [全てのJavaScriptを編集(E)]を選択する。※選択が変わります。
10) JavaScriptエディッタ画面が表示されます。内容は↓
//-------------------------------------------------------------
//-----------------XMLタグは編集できません--------------------
//-------------------------------------------------------------
//<Document-Level>
//<ACRO_source>AAA</ACRO_source>
//<ACRO_script>
/*********** 所有者 : Document-Level:AAA ***********/
function AAA()
{
this.print(true);
}
//</ACRO_script>
//</Document-Level>
11) 上記を以下に変更(削除)します。
//-------------------------------------------------------------
//-----------------XMLタグは編集できません--------------------
//-------------------------------------------------------------
//<Document-Level>
//<ACRO_source>AAA</ACRO_source>
//<ACRO_script>
/*********** 所有者 : Document-Level:AAA ***********/
this.print(true);
//</ACRO_script>
//</Document-Level>
12) 編集したら「OK」ボタンをクリックします。
13) 直後に印刷ダイアログが表示されます。
キャンセルで閉じて下さい。
14) Acrobat上のPDFを保存して下さい。
AcrobatJavaScriptは「//<Document-Level>」等のダグを見ています。functionも同様です。そこでfunctionと書かれた部分だけ取り除きます。そうすると文書を開く時にここに書かれたJavaScriptが全て実行されます。文書を開く時のイベント扱いになります。
判らない事があれば質問下さい。
※AcrobatJavaScriptは不可!
http://www.adobe.com/jp/designcenter/acrobat/articles/acr6kbjavascrpt.html
↑のページを参考に、ページを開いたときのアクションを追加していたのですが、
このページのやり方だと、ファイル内の特定のページが開かれた時のアクションとなるようです。
(そのため、もともとJavaScriptを追加していたページを削除すると、JavaScriptの情報がファイル内から消えてしまっていたようです)
管理人様に教えて頂いたやり方でJavaScriptを追加すると、ファイル内の全ページで有効となるようですね。
あとは、iTextSharpにPDFのページ追加、ページ削除機能があれば話しが進みそうです。
で、ページ追加機能は見つけたのですが、削除が…。
仰られる通り、ありそうな感じがして仕方ないのですが。
引き続き、調査してみます。
おおっ!
少しずつですが道が見えてきた感じですね。
駄目なら「pdftk」が助けてくれるかも?
で、少ししたら出かけます。
ココが見れるのは、10時過ぎかな。
はい。おかげさまで少し前進できた気がします。
まだまだ峠は多そうですが^^;
どうぞ、お気になさらずお出かけ下さい。
管理人様
iTextSharpのページ削除機能を調査していたのですが、見つけることが出来ず、途方に暮れておりました。
で、ちょっと考え方を変えて、iTextSharpに、AcrobatJavaScriptをPDFに埋め込む機能が無いかどうか調べてみました。
すると、、、
iTextSharpのPdfWriterクラスに「AddJavaScript」、という読んで字の如くPDFにJavaScriptを追加するメソッドがありました。
これですと、印刷用PDF生成処理に1行追加するだけで、思っていたことを実現することができました。
当然、DUMP.PDFを用意する必要もありませんし、ページの削除も行う必要が無くなりました。
ということで、教えて頂いた『PDFにAcrobatJavaScriptを埋め込む』方法を、よりスマートな形で実装することができました。
今回は、不慣れなPDFの制御でとても苦戦しましたが、管理人様のおかげで何とか仕様通りのものを作ることができそうです。
本当にありがとうございました。
『今までで最高難易度の質問です』と言われたときは、私としても緊張してしまったのですが、結果として、AcrobatJavaScriptという今まで知らなかった知識を得ることができ、大変良い経験を積むことができました。
最後になりますが、今回の成果物として、iTextSharpにて印刷用PDFを生成する処理の概要を掲示したいと思います。
同じような問題で困っている方(が現れるかどうかは分かりませんが…)の助けになれば幸いです。
*************************************************************************
void CreatePrintPdf()
{
iTextSharp.text.Image image
= iTextSharp.text.Image.GetInstance(@"c:¥Report¥report.jpg");
image.SetAbsolutePosition(0f, 0f);
image.ScaleToFit(595f, 842f);
iTextSharp.text.Rectangle pageSize = PageSize.A4;
Document doc = new Document(pageSize);
PdfWriter writer
= PdfWriter.GetInstance(doc, new FileStream
(@"c:¥Temp¥print.pdf", FileMode.Create));
doc.Open();
writer.AddJavaScript("this.print(true);"); //←今回追加したメソッドです
doc.Add(image);
doc.Close();
}
*************************************************************************
ご丁寧に解説頂き、また長時間に渡り面倒を見て頂き、大変感謝しております。ありがとうございました。
またPDFに関して困ることがあったときは、ご質問させてください。
す、スゴイ!
問題点を「発想の転換」で回避する。
まさにエンジニアとして誇れる姿勢です。
技術力も感心しました。
そして、問題箇所のコードの記載を感謝します。
※これは本当にスゴイ!
うるきちさんが自サイトを持っていたら、こちらが質問をしたいぐらいです。
まだまだ問題点は出てくると思います。
それがシステム開発だから。
でも、仕事も程ほどにして、自分の時間も大事にして下さい。