web-dev-qa-db-ja.com

javascript埋め込みタグからPDFを印刷

PDFファイルがあり、Javascriptで印刷しようとしています。この埋め込みトリックを試しました: 埋め込みPDFのサイレント印刷 ただし、印刷関数は次のようになりません。利用可能で、常に未定義です。

私はこのコードでIframeトリックを試しました:

function printPDF() {
if(document.getElementById("pdfDocument").contentWindow.document.readyState === "complete") {   
    document.getElementById("pdfDocument").focus();
    document.getElementById("pdfDocument").contentWindow.print();
} else {
    setInterval(printPDF(), 1000);
}
}

(pdfDocumentはiframeのIDです)これは印刷ダイアログをポップアップしますが、空白のページを印刷します。埋め込みタグの動作方法が気に入っています。しかし、なぜ印刷機能が利用できなくなるのでしょうか。

このテーマに関する投稿のほとんどはかなり古いものです。それを行うための最良のHTML5/jQueryの方法は何ですか? (またはこの時点では通常のJS)

編集:

埋め込みタグのJSコードは次のとおりです。

function printPDF() {
alert(document.getElementById("pdfDocument").print);
//Wait until PDF is ready to print    
 if (typeof document.getElementById("pdfDocument").print == 'undefined') {
     setTimeout(function(){printPDF();}, 1000);
 } else {
     var x = document.getElementById("pdfDocument");
     x.print();
 }
}

これは毎秒「未定義」を変更し続けます。印刷オプションは使用できません。何か案は?

13
mmaceachran

私は一週間かそこら前にこの質問に賞金をかけました、そしてそれは期限切れになりました。これを見つけるかもしれない将来の誰かのためにたくさんの研究の後に私がここで学んだことを投稿するつもりです。

PDFは、ブラウザ、ブラウザのバージョン、ブラウザの構成、およびオペレーティングシステムに基づいて異なる方法で表示されます。変数はたくさんあるので、ここで最も一般的な状況について説明します。

  • すべてのブラウザーで、Javascriptを介してprint()メソッドを呼び出すことができず、PdfActionsしか使用できませんでした。 OPENACTIONはprintを呼び出します。これらをiTextを使用してPDFに埋め込みました。

  • ChromeはAdobeのビューアを使用します。このビューアは、print()メソッドへのアクセスを許可しませんが、PDFに埋め込まれたPdfActionを実行します。したがって、「OpenAction」をPDFに埋め込み、それらのアクションを参照するアプリケーションから開くたびにPDF呼び出しprintを実行することができます。

  • Firefox(特定のバージョンより上、ただし最近のすべてのバージョン)は、WindowsのAdobeビューアを使用します。AdobeビューアはPdfActionsも認識します。ただし、OSXでは、Adobeビューアのサポートが失われ、Firefoxビューア(pdf.js)で焼き付けられたものに切り替わります。これはPdfActionsをサポートしていません。

  • IE:IEではあまりテストしていません。 FirefoxがOSXで動作しなくなった後、JavascriptからPDFを印刷することをあきらめたことが主な理由です(私にとっては必須です)。

私のPDFは私が管理するサーバーによって生成されていたので、サーバーでサービスを変更し、PDF generationが使用するのと同じマークアップに基づいてPNGを生成するgetPNGサービスを追加することになりました。 。ブラウザは、私が知っていたPDFよりもはるかに優れた画像を処理しますが、コードの他の場所で使用されているため、PDF生成サービスを再利用できることを望んでいました。

それは質問に答えませんが、それは私が持っているすべての情報です。将来これを見つける可能性のある人への私の提案:ditch PDFこの場合は可能であれば、もっと簡単にしてください。それ以外の場合は、Javascriptを介してprint()を呼び出す方法を知っている場合は、この質問を更新してくださいOSXのFFプレビューPDFビューア。

-フィル

13
philhan

Javascriptでは、これができるかどうかわかりません。ただし、PDFファイルへのスクリプトインジェクションを使用して実現できます。私の理解が正しければ、これはグーグルがしていることです。

例えば。

  1. URLを開きます: https://drive.google.com/viewerng/viewer?url=http://www.energy.umich.edu/sites/default/files/pdf-sample.pdf
  2. 次に、印刷アイコンをクリックします。
  3. ご覧のとおり、PDFに印刷コマンドが挿入された新しいウィンドウが開きます。 PDFが読み込まれると、組み込みの印刷コマンドがトリガーされます。ページを更新するたびに、印刷がトリガーされるのを確認できます。これは、印刷動作​​がドキュメントの読み込みイベントに関連付けられていることを意味します。

ITextSharpを使用して、上記の動作をシミュレートできます。

2
Rama Kathare

(外部アプリケーションを埋め込む代わりに)ブラウザーでPDF全体をレンダリングする方法があります。これにより、PDFに関するブラウザーAPIへのフルアクセスが可能になります。

これはJavaScriptでのMozillaのpdf実装です: https://github.com/mozilla/pdf.js/
そしてこれがショーケースです: http://mozilla.github.io/pdf.js/web/viewer.html (右上の印刷ボタンに注意してください)。

仕組みの詳細については、こちらのビューアコードを確認してください: https://github.com/mozilla/pdf.js/blob/master/web/viewer.js

マイナス面—単に埋め込むよりもはるかに難しいでしょう。
プラス面では、実際に機能します。

2
Arseny Smoogly

Chromeで実行できます:

var toolbar = document.querySelector('#toolbar');
toolbar.shadowRoot.querySelector('#print').click();
0
stomy