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ãã¡ã€ã«ãåããã¡ã€ã³ã«ããŒããããŠããããšãæ確ã«ããå¿ èŠããããŸãã
ãããããã°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å
šäœã䜿çšããã«ãã®ãµãŒãã¹ã䜿çšããã«ã¯ã©ãããã°ããã§ããïŒ
æãåèã«ãªãã³ã¡ã³ã
å°ãªããšã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
ã®ãããªãã®ãä»ããŠã¡ãã»ãŒãžãåãå ¥ããæ¹æ³ã¯ãããŸããïŒ ïŒç§ã¯ããã䜿çšããããšããªãã®ã§ããã®ãŠãŒã¹ã±ãŒã¹ã«é©ããŠãããã©ããã¯ããããŸãããïŒ