こんにちは。javascriptでできること、について教えて下さい。

pdfやhtmlを印刷したいと思います。
これを自動で印刷する、しかもキーボード操作なしで、アドレスをブラウザに入力してページに遷移しただけで印刷するjavascriptはできますか?IE8を想定しています。セキュリティの設定などはあらかじめ任意に設定できるものとします。

pdfは「pdfを表示するhtmlに自動印刷のjavascriptを記述したもの」で印刷して、
htmlは「htmlに自動印刷のjavascriptを記述したもの」で印刷する、
そのjavascriptについてお聞きしたいと思います。

●VBA IE操作 JavaScriptの挿入(promptとalertをつぶす)
http://ken3-info.blog.ocn.ne.jp/objie/2010/04/vba_ie_javascri.html

標準関数であるpromptやalertを上書きする処理ですが、これを応用してできるのではないかと思いましたが、知識が足りませんので皆様のお力をお借りしたいと思いました。

その他、追加事項をコメント欄に書きました。よろしくお願いします♪

回答の条件
  • 1人2回まで
  • 登録:
  • 終了:2010/11/04 00:47:52
※ 有料アンケート・ポイント付き質問機能は2023年2月28日に終了しました。

ベストアンサー

id:windofjuly No.1

回答回数2625ベストアンサー獲得回数1149

ポイント70pt

【1】ブラウザ外部の部分まで自動化はできません

ブラウザ内部から印刷の自動実行が実現出来てしまうと、

ブラウザクラッシャーどころの騒ぎではなくなってしまいます

(ページを開くだけで大量に自動プリントされたら大変ですよね)

  

ただし、HTMLであれば下記で印刷ダイアログが出るところまでは自動化できます

<body onload="self.print();">

関数として定義しておくならば下記のようになります

    <script type="text/javascript">
    <!--
        function autoPrint() {
            self.print();
        }
    //-->
    </script>
</head>
<body onload="autoPrint();">

 

【2】PDFプラグインの監視や制御は見当たりません

PDFはブラウザに組み込まれたプラグインが独自に非同期通信を行うため、

監視(完全に読み込まれたかどうかの判断など)も制御(印刷など)も用意されていないようです

 

【3】外部からであれば可能であるかもしれません

今回の質問と路線が逆(内から外ではなく、外から内)なので参考までとさせていただきますが、

VBAなどを使ってIE8やAdobeReaderを操作するという形でよければ可能かもしれません

(1)HTML

VBA+IEでWEBページが表示されるまで待ってからブラウザの印刷機能を使えば良いでしょう

印刷に関しては、こちらもken3さんが示してくださってますので検証は楽でしょう

http://ken3-info.blog.ocn.ne.jp/day/2009/06/qa_vba_ie_9a3d.html

(2)PDF

VBA+AdobeReaderで同様のことが可能なようですが、こちらは経験ありません

http://kb2.adobe.com/jp/cps/255/2556.html

Adobe Reader 7.0 と Adobe Reader 8.0 では DDE メッセージによるコントロールに加えて、

OLE オートメーションを利用して PDF 文書の閲覧や印刷を制御することが可能です。

古いものですが8.0の開発者向けガイドです

http://www.google.co.jp/url?sa=t&source=web&cd=1&ved=0CCoQFjAA&u...

id:ReoReo7

ちょうど回答オープンの日から所要があり出かけていたので、返答が遅くなりすみませんでした。

詳しい方法をありがとうございます。やはり印刷ダイアログまでで、あとは手動ですかね・・・。VBAアプリをクライアント側に導入すれば、所望の動作が可能ということですね。できれば、ブラウザのみで実装したいのですが、不可能ということであれば、検討してみたいと思います。

参考にさせて頂きます!

2010/11/04 00:40:44
  • id:ReoReo7
    追加事項:

    できればpdfやhtmlの種類によって、印刷するトレーも分けて指定したい。

    使用するのは

    ●DocuPrint 205 N3300012 富士ゼロックス
    http://www.amazon.co.jp/dp/product/B0002FGIOU

    で2台並べて合計4トレー、4パターンの印刷を可能にしたいです。
  • id:windofjuly
    うぃんど 2010/10/30 08:43:54
    補足
    【2】についてはもっともっと調べてみれば、
    もしかすれば「監視できる」という情報が見つかるかもしれませんが、
    【1】の制約のほうが強力なので、つっこんだ調査はしてません
  • id:a-kuma3
    http://www.meadroid.com/scriptx/freedep.asp

    ScriptX って ActiveX があるんですわ。
    印刷ダイアログをすっ飛ばしたり、トレーの指定とかが javascript からできる。

    でも、自分で使う分には良いけど、仕事で使うのは注意してね。
    最新のバージョンではどうか知らんけど、リソースリークをしたり、フリーズしたりする、ってのを聞いたことがあるから。

    PrintPDF とか BatchPrintPDF というようなメソッドもあって、PDF の印刷もできるんだけど、
    Acrobat Reader の V4 とか V5 じゃないと問題が出る、って書いてある。

    http://www.meadroid.com/scriptx/docs/printdoc.asp#PrintPDF

    ライセンスにも注意してね。
  • id:rouge_2008
    質問とは関係ありませんが失礼します。
    スパム投稿者がまた出没していますので、回答オープン前にご注意ください。
    id:hgijgbnfhfgは、質問と関係のないURLを投稿しています。

    http://q.hatena.ne.jp/1288418686#a1044738
    http://q.hatena.ne.jp/1288417880#a1044739
    http://q.hatena.ne.jp/1288446042#a1044714
  • id:nobnob3
    全然関係ないけどDropboxを使ってiphoneから印刷というのを思い出した
  • id:Silvanus
    素朴な疑問ですが、JavaScriptでないとダメなんですか?
    外部から操作するなら出来そうな気がするんですけど。
  • id:ReoReo7
    >windofjulyさん

    補足をありがとうございます。

    >a-kuma3さん

    ありがとうございます。
    「ScriptXを使えば、(フリーズやリソースリーク等のバグが出るかもしれないけど、ライセンスに注して使用すれば)可能」ということでしょうか。

    印刷はPDFだけじゃなくHTMLにも対応したいので、「PrintPDF とか BatchPrintPDFとかのメソッド」の利用はちょっと自分の中では保留です。ScriptXが熱いですね♪

    >rouge_2008さん
    ありがとうございます。あやうくオープンしそうになりました。

    >Silvanusさん
    そうですね、できるだけクライアントにはブラウザ以外のアプリを使わせたくないのですが、最悪VBA等マクロの導入やアプリインストールでも良いです。できるだけ簡便な導入で、できることは全てブラウザにやらせたいと思っています。
  • id:lkaitol
    回答しようと思ったら、よくよく見たらすっごく昔の記事でした。
    というオチ。il||li _| ̄|○ il||li

    Googleガジェットさ~~ん、ばーかーやーろー!www

    でも、しらべて出来たから、回答載せときます。
    以下、Python

    import win32com.client

    READYSTATE_COMPLITE = 4
    OLECMDEXECOPT_DONTPROMPTUSER = 2
    OLECMDID_PRINT = 6

    ie = win32com.client.Dispatch("InternetExplorer.Application")
    ie.Visible = True
    ie.Navigate("http://www.google.com")
    while ie.ReadyState != READYSTATE_COMPLITE:
        pass
    ie.ExecWB(OLECMDID_PRINT, OLECMDEXECOPT_DONTPROMPTUSER)

    このように、COMを使えばできます。

    ついでなので、JavaScript版もつくってみます。


    READYSTATE_COMPLITE = 4;
    OLECMDEXECOPT_DONTPROMPTUSER = 2;
    OLECMDID_PRINT = 6;

    var ie = WScript.CreateObject("InternetExplorer.Application");
    ie.Visible = true;
    ie.Navigate("http://www.google.com");
    while (ie.ReadyState != READYSTATE_COMPLITE);
        ;
    ie.ExecWB(OLECMDID_PRINT, OLECMDEXECOPT_DONTPROMPTUSER);


    できました。ヽ(´ー`)ノ
  • id:ReoReo7
    回答ありがとうございます。
    OLECMDID_PRINT, OLECMDEXECOPT_DONTPROMPTUSER
    なんてあったんですね!

    このモジュールは若干諦めたんですが、
    javascriptも知れて勉強になりました。


    何でもできるものなんですね。

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

回答リクエストを送信したユーザーはいません