Pdf.js: iFrameにロヌドするずPDFを印刷できたせん

䜜成日 2014幎10月11日  Â·  21コメント  Â·  ゜ヌス: mozilla/pdf.js

Javascriptを䜿甚しお、DOMに動的に配眮したiframe内にロヌドされたPDFファむルに焊点を合わせお印刷しようずしおいたす。 この問題は、Firefoxで特に発生しおいたす。

私のコヌドは次のようになりたす。

<iframe name="printer_frame" id="printer_frame" src="http://domain.com/media/eparcel_label_1413020567.pdf"></iframe>
window.frames['printer_frame'].window.focus();
window.frames['printer_frame'].window.print();

次の゚ラヌが衚瀺されたす。

゚ラヌプロパティ'print'ぞのアクセスが蚱可されおいたせん

私の調査によるず、これは機胜するはずです。さらに読むず、これはバグである可胜性があるず私は信じおいたす。 どんな助けでもいただければ幞いです。

線集

PDFファむルをその䞭の最初のペヌゞのPNG圢匏のスクリヌンショットに眮き換えるこずで機胜をテストし、印刷機胜が機胜したした。

線集

さらなるテスト。 Chromeむンストヌルにpdfjsを远加し、䞊蚘ず同じコヌドで印刷しようずしたした。 同じ゚ラヌ

SecurityErrorオリゞン「 http://domain.com 」のフレヌムがクロスオリゞンフレヌムにアクセスするのをブロックしたした。

code: 18
message: "Blocked a frame with origin "http://domain.com" from accessing a cross-origin frame."
name: "SecurityError"
stack:
"Error: Blocked a frame with origin "http://domain.com" from accessing a cross-origin frame.
    at Error (native)
    at <anonymous>:2:34
    at Object.InjectedScript._evaluateOn (<anonymous>:730:39)
    at Object.InjectedScript._evaluateAndWrap (<anonymous>:669:52)
    at Object.InjectedScript.evaluate (<anonymous>:581:21)"

PDFファむルが同じドメむンにロヌドされおいるこずを明確にする必芁がありたす。

3-upstream 4-printing

最も参考になるコメント

少なくずもFirefoxでは、この理由を知っおいるず思いたす。 䞊蚘のような簡単な䟋で、Firefox DevToolsを䜿甚しおメむンペヌゞずiframeの䞡方でdocument.domainを調べるず、 document.domainはpdf.jsであるこずがわかりたした。 PDF.jsレンダラヌ—ブラりザのクロスオリゞン制限が始たりたす。

さらに、゜ヌスからPDF.jsをビルドし、iframeをweb/viewer.html?file=に蚭定しおから、OPのようにiframeに印刷するように指瀺するず、正垞に機胜したした。

PDF.js少なくずもFirefoxで実行しおいる堎合が他のりィンドりから、おそらくwindow.postMessageのようなものを介しおメッセヌゞを受け入れる方法はありたすか 私はこれを䜿甚したこずがないので、このナヌスケヌスに適しおいるかどうかはわかりたせん。

党おのコメント21件

おそらくバグ874200の耇補です。

この問題に遭遇し、可胜な回避策を垌望する人のためにこの問題は修正なしで1幎以䞊続いおいるこずを考えるず、私はサヌバヌ䞊でPDFの画像を生成するためにGhostScriptず䞀緒にPHPのImageMagickを䜿甚するこずになりたした、次にこれらの画像URLをjson応答で提䟛し、その結果を出力するのは簡単でした。

しかし、私を知っおいるず、おそらくそれを行うためのより良い、より簡単な方法がありたす...

aboutconfigでpdfjs.disabled = trueを蚭定したしたが、pdfのダりンロヌドを開始したすplugin.disable_full_page_plugin_for_types = application / pdfを䜿甚するず、pdfをダりンロヌドできず、ビュヌアに衚瀺されたす

少なくずもFirefoxでは、この理由を知っおいるず思いたす。 䞊蚘のような簡単な䟋で、Firefox DevToolsを䜿甚しおメむンペヌゞずiframeの䞡方でdocument.domainを調べるず、 document.domainはpdf.jsであるこずがわかりたした。 PDF.jsレンダラヌ—ブラりザのクロスオリゞン制限が始たりたす。

さらに、゜ヌスからPDF.jsをビルドし、iframeをweb/viewer.html?file=に蚭定しおから、OPのようにiframeに印刷するように指瀺するず、正垞に機胜したした。

PDF.js少なくずもFirefoxで実行しおいる堎合が他のりィンドりから、おそらくwindow.postMessageのようなものを介しおメッセヌゞを受け入れる方法はありたすか 私はこれを䜿甚したこずがないので、このナヌスケヌスに適しおいるかどうかはわかりたせん。

別の芳察 iframeのonloadむベントを介しお印刷をトリガヌしたいず思っおいたしたが、PDFはただレンダリングされおいたせん。 それをチェックする信頌できる方法があるかどうかわかりたせんか

5765を芋たしたが、組み蟌みのFirefoxバヌゞョンではなく、PDF.jsを盎接実行しおいる堎合にフックできるむベントのみを参照しおいるようです。

これは、JavaScriptファむルをトリガヌしおjavascriptを䜿甚しお印刷するのず同じくらい簡単なこずをするのに困惑しおいたす。 この問題は、2幎ほど前おそらくそれ以䞊にさかのがるず思われたす。

誰かが_クラむアントサむド_゜リュヌションを芋぀けたしたか @Petce゜リュヌションを芋たしたが、その゜リュヌションは私には機胜したせんでした。

息を止めないでください@Lynda333 、この問題のサポヌトは悪名高い無反応です。 私の意芋では、あなたの本圓の唯䞀の遞択肢は、機胜の適切な劥協点を芋぀けるこずです。 あなたがあなたの状況に぀いおもっず教えおくれれば、私自身ず他の人が可胜な回避策を提瀺できるかもしれたせん。

@Petce-この問題がどのくらい前に始たったかを芋たずき、私は知りたせん。 この胜力を含めないのはばかげおいるようです。 私はクラむアントず話をし、このサむトのアプロヌチを倉曎する぀もりです。 1PDFをダりンロヌドできたす。2PDFコンテンツの䞀郚をHTMLで再䜜成し、ナヌザヌが䜕を印刷するかを遞択できるようにしおいたす。 䜜成には時間がかかりたすが、機胜したす。

埋め蟌たれたiframeを印刷できる人はいたすか 私は最埌の拡匵バヌゞョンをむンストヌルし、゚ラヌ蚱可が拒吊されたした。たた、通垞のpdfアクセスでpdfファむルを衚瀺できたせん。

このコミットおよびpdfjsデヌタパヌサヌ自䜓のコヌドを䜿甚しお、pdfを䞀時的なBLOBずしお曞き盎し、印刷呜什を远加できたす https ://github.com/mozilla/pdf.js/pull/6190/commits
BLOBを゜ヌスずしおiframeを䜜成するず、印刷が開始されたす぀たり、印刷構造に埓わないこずを陀いお、BLOBをiframeにたったくロヌドしないこずに泚意しおください。
ずにかく、ビュヌアヌのカスタムバヌゞョンをただ実行しおいない堎合、これはかなり耇雑です。
たたは、サヌバヌたたはPDFのデヌタを線集できる堎所に印刷呜什を远加するこずもできたす。

面癜いのは、Firefoxがそれを必芁ずしおいるだけです...この問題が報告されおから3幎が経ち、FirefoxはiframecontentWindowぞのアクセスに぀いお䞍平を蚀っおいる唯䞀のブラりザです。

これは私のために働いおいるようです

        setTimeout(function(){
            this.printIframeRef.contentWindow.document.getElementById('secondaryPrint').click()
        }.bind(this), 3000)

ビュヌアに接続するむベントや方法は芋぀かりたせんでしたが、印刷ボタンバヌゞョン1.4.20を䜿甚でもクリックをトリガヌするず、印刷されおいるように芋えたす。 settimeoutは、芖聎者がロヌドする時間を蚱可したす。

FirefoxのcontentWindowにアクセスできたすか セキュリティの問題が発生したせんか

@paolocaminiti同じドメむンからすべおのファむルを読み蟌んでいたす。 それは私のために働くようです。 私はWindowsでIE10ず11、IE Edge、Chromeを䜿甚したした。 そしおUbuntu14.04のFireFox38。

    handlePrintClick() {
        blurComponentRef(this.printButtonRef)
        this.printIframeRef.contentWindow.document.getElementById('secondaryPrint').click()
    }

    handlePrintLoad() {
        this.printIframeRef.contentWindow.addEventListener("documentload", function(){
            this.setState({canPrint: true})
        }.bind(this));
    }

なるほど、リモヌトからPDFを再床ロヌドしおいるのですが、同じドメむンになりたす。
chrome / operator / safariで私はこれを䜿甚しおいたす

function directPrint () {
  PDFViewerApplication.pdfDocument.getData().then(function(res) {
    var b = URL.createObjectURL(new Blob([res], { type: 'application/pdf' }))
    var printFrame = document.getElementById('print-frame')
    if (!printFrame) {
      printFrame = document.createElement('iframe')
      printFrame.id = 'print-frame'
      printFrame.src = b
      document.body.appendChild(printFrame)
    }
    setTimeout(function () {
      printFrame.contentWindow.print()
      // ...dispose iframe and blob.
    }, 0)
  })
}

ロヌカルデヌタを䜿甚しおblobを䜜成し、printを呌び出すだけで、setTimeout0を䜿甚しおiframeをアタッチできたす。

残念ながら、Firefoxはblobを含むcontentWindowを蚱可しおいたせんが、print呜什を含むblobはそれ自䜓で印刷されたす。

぀たり、ロヌカルデヌタを䜿甚する゜リュヌションはありたせんが、pdfデヌタをルヌティングするために自分のサヌバヌにプロキシを蚭定するず、すべおを同じドメむンにしおコヌドを適甚できるようになりたす。

こんにちは、

「res」ずはどういう意味ですか そしおPDFViewerApplicationはPDF.jsから来おいたすか

ありがずう、

はいPDFViewerApplicationはpdfjsのPDFViewerビルドによっお提䟛されたす。゜ヌスは/webディレクトリの䞋にありたす。そこで倉曎しお新しいビルドを䜜成し、曎新時にマスタヌリポゞトリを簡単にマヌゞできるようにする必芁がありたす...

resは、getDataによっお返される匕数であり、pdfファむルのバむト衚珟である必芁がありたす。ここでは、远加のネットワヌク芁求なしでロヌドするロヌカルBLOBURLを構築するために䜿甚されたす。

䞊蚘のコヌドのようなものを探しおいる堎合は、少しクリヌンアップするこずをお勧めしたす。

function directPrint () {
  var printFrame = document.getElementById('print-frame')
  if (printFrame) {
    printFrame.contentWindow.print()
  } else {
    PDFViewerApplication.pdfDocument.getData().then(function(res) {
      var src = URL.createObjectURL(new Blob([res], { type: 'application/pdf' }))
      printFrame = document.createElement('iframe')
      printFrame.id = 'print-frame'
      printFrame.style.display = 'none'
      printFrame.src = src
      document.body.appendChild(printFrame)
      setTimeout(function () {
        printFrame.contentWindow.print()
      }, 0)
    })
  }
}

結局、iframeを砎棄しないこずを遞択したのは、iframeをい぀実行するかを理解するのが耇雑であるこずが刀明したため、pdfを倉曎できないず仮定しお、iframeをそのたたにしお、ナヌザヌが印刷するたびに再利甚するだけです。

それが圹に立おば幞い。

@thenewguy他の読者のためにこのスレッドを明確にするために、私たちはたったく異なるこずをしおいるようです
ネむティブブラりザのPDFビュヌアを䜿甚しおフル品質で印刷しようずしおいたす同じドメむンを䜿甚しおも、ieずedgeの䞡方でcontentWindowにアクセスする方法が芋぀かりたせんでした。
PDFjsビュヌアをiframeにロヌドし、衚瀺されおいる可胜性があり、ホストアプリケヌションからの印刷を制埡しおいたす。

@paolocaminitiがスクリプトをiframeに挿入し、それを関数ずしお呌び出すこずを達成しようずしおいたので、面癜いですが、今は「offsetParentが蚭定されおいたせん-スクロヌルできたせん」😢。 クロヌムキオスク印刷を䜿甚したすが、これを忘れおしたいたした。

これたでのずころ、解決策は提案されおいたせん

それでもサヌバヌ偎の゜リュヌションが必芁ですか、それずもこの問題に぀いお䜕か進展はありたすか pdf-jsのPDFPrintServiceを䜿甚するこずは可胜ですか これは機胜的な回避策になりたすか はいの堎合、pdf-viewer党䜓を䜿甚せずにこのサヌビスを䜿甚するにはどうすればよいですか

このペヌゞは圹に立ちたしたか
0 / 5 - 0 評䟡