Pdf.js: iFrame์— ๋กœ๋“œ๋œ ๊ฒฝ์šฐ PDF๋ฅผ ์ธ์‡„ํ•  ์ˆ˜ ์—†์Œ

์— ๋งŒ๋“  2014๋…„ 10์›” 11์ผ  ยท  21์ฝ”๋ฉ˜ํŠธ  ยท  ์ถœ์ฒ˜: mozilla/pdf.js

DOM์— ๋™์ ์œผ๋กœ ๋ฐฐ์น˜ํ•œ iframe ๋‚ด์— ๋กœ๋“œ๋œ PDF ํŒŒ์ผ์— ์ดˆ์ ์„ ๋งž์ถ”๊ณ  ์ธ์‡„ํ•˜๊ธฐ ์œ„ํ•ด Javascript๋ฅผ ์‚ฌ์šฉํ•˜๋ ค๊ณ  ํ•ฉ๋‹ˆ๋‹ค. ์ด ๋ฌธ์ œ๋Š” ํŠนํžˆ 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();

๋‹ค์Œ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.

์˜ค๋ฅ˜: '์ธ์‡„' ์†์„ฑ์— ๋Œ€ํ•œ ์•ก์„ธ์Šค ๊ถŒํ•œ์ด ๊ฑฐ๋ถ€๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

๋‚ด ์—ฐ๊ตฌ๋Š” ์ด๊ฒƒ์ด ์ž‘๋™ํ•ด์•ผ ํ•œ๋‹ค๊ณ  ๋งํ•˜๊ณ  ์žˆ์œผ๋ฉฐ, ๋” ์ฝ์–ด๋ณด๋‹ˆ ์ด๊ฒƒ์ด ๋ฒ„๊ทธ์ผ ์ˆ˜ ์žˆ๋‹ค๊ณ  ๋ฏฟ๊ฒŒ ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ๋„์›€์„ ์ฃผ์‹œ๋ฉด ๊ฐ์‚ฌํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.

ํŽธ์ง‘ํ•˜๋‹ค

PDF ํŒŒ์ผ์„ ๊ทธ ์•ˆ์— ์žˆ๋Š” ์ฒซ ํŽ˜์ด์ง€์˜ PNG ํ˜•์‹์˜ ์Šคํฌ๋ฆฐ์ƒท์œผ๋กœ ๊ต์ฒดํ•˜์—ฌ ๊ธฐ๋Šฅ์„ ํ…Œ์ŠคํŠธํ–ˆ์œผ๋ฉฐ ์ธ์‡„ ๊ธฐ๋Šฅ์ด ์ž‘๋™ํ–ˆ์Šต๋‹ˆ๋‹ค.

ํŽธ์ง‘ํ•˜๋‹ค

์ถ”๊ฐ€ ํ…Œ์ŠคํŠธ. ๋‚ด ํฌ๋กฌ ์„ค์น˜์— 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= ๋กœ ์„ค์ •ํ•œ ๋‹ค์Œ iframe์— ์ธ์‡„ํ•˜๋„๋ก ์ง€์‹œํ•˜๋ฉด(OP์—์„œ์™€ ๊ฐ™์ด) ์ œ๋Œ€๋กœ ์ž‘๋™ํ–ˆ์Šต๋‹ˆ๋‹ค.

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= ๋กœ ์„ค์ •ํ•œ ๋‹ค์Œ iframe์— ์ธ์‡„ํ•˜๋„๋ก ์ง€์‹œํ•˜๋ฉด(OP์—์„œ์™€ ๊ฐ™์ด) ์ œ๋Œ€๋กœ ์ž‘๋™ํ–ˆ์Šต๋‹ˆ๋‹ค.

PDF.js(์ ์–ด๋„ Firefox์—์„œ ์‹คํ–‰ ์ค‘์ผ ๋•Œ)๊ฐ€ window.postMessage ์™€ ๊ฐ™์€ ๊ฒƒ์„ ํ†ตํ•ด ๋‹ค๋ฅธ ์ฐฝ์—์„œ ๋ฉ”์‹œ์ง€๋ฅผ ์ˆ˜๋ฝํ•˜๋Š” ๋ฐฉ๋ฒ•์ด ์žˆ์Šต๋‹ˆ๊นŒ? (์ €๋Š” ์‚ฌ์šฉํ•ด ๋ณธ ์ ์ด ์—†์–ด์„œ ์ด ์œ ์Šค ์ผ€์ด์Šค์— ์ ํ•ฉํ•œ์ง€ ์•„๋‹Œ์ง€๋Š” ๋ชจ๋ฅด๊ฒ ์Šต๋‹ˆ๋‹ค.)

๋˜ ๋‹ค๋ฅธ ๊ด€์ฐฐ: iframe ์˜ onload ์ด๋ฒคํŠธ๋ฅผ ํ†ตํ•ด ์ธ์‡„๋ฅผ ํŠธ๋ฆฌ๊ฑฐํ•˜๊ธฐ๋ฅผ ํฌ๋งํ–ˆ์ง€๋งŒ PDF๊ฐ€ ์•„์ง ๋ Œ๋”๋ง๋˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค. ์ด๋ฅผ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋Š” ์‹ ๋ขฐํ•  ์ˆ˜ ์žˆ๋Š” ๋ฐฉ๋ฒ•์ด ์žˆ๋Š”์ง€ ํ™•์‹คํ•˜์ง€ ์•Š์Šต๋‹ˆ๊นŒ?

#5765๋ฅผ ๋ณด์•˜์ง€๋งŒ ๋‚ด์žฅ๋œ Firefox ๋ฒ„์ „์ด ์•„๋‹Œ PDF.js๋ฅผ ์ง์ ‘ ์‹คํ–‰ํ•˜๋Š” ๊ฒฝ์šฐ ์—ฐ๊ฒฐํ•  ์ˆ˜ ์žˆ๋Š” ์ด๋ฒคํŠธ๋งŒ ์–ธ๊ธ‰ํ•˜๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๊นŒ?

๋‚˜๋Š” ์ด๊ฒƒ์ด ์ž๋ฐ” ์Šคํฌ๋ฆฝํŠธ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ธ์‡„ํ•˜๊ธฐ ์œ„ํ•ด PDF ํŒŒ์ผ์„ ํŠธ๋ฆฌ๊ฑฐํ•˜๋Š” ๊ฒƒ๊ณผ ๊ฐ™์€ ๊ฐ„๋‹จํ•œ ๋ฌธ์ œ๋ฅผ ์ˆ˜ํ–‰ํ•˜๋Š” ๊ฒƒ๊ณผ ๊ฐ™์€ ๋ฌธ์ œ์— ๋‹นํ™ฉํ–ˆ์Šต๋‹ˆ๋‹ค. ์ด ๋ฌธ์ œ๋Š” ํ˜„์žฌ ์•ฝ 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 ๋ฐ์ดํ„ฐ๋ฅผ ํŽธ์ง‘ํ•  ์ˆ˜ ์žˆ๋Š” ๊ณณ์ด๋ฉด ์–ด๋””์—์„œ๋‚˜ ์ธ์‡„ ์ง€์นจ์„ ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์žฌ๋ฏธ์žˆ๋Š” ๋ถ€๋ถ„์€ ํŒŒ์ด์–ดํญ์Šค๊ฐ€ โ€‹โ€‹๊ทธ๊ฒƒ์„ ํ•„์š”๋กœ ํ•œ๋‹ค๋Š” ๊ฒƒ๋ฟ์ž…๋‹ˆ๋‹ค... ์ด ๋ฌธ์ œ๊ฐ€ ๋ณด๊ณ ๋œ ์ง€ 3๋…„์ด ํ˜๋ €๊ณ  ํŒŒ์ด์–ดํญ์Šค๋Š” iframe contentWindow ์•ก์„ธ์Šค์— ๋Œ€ํ•ด ๋ถˆํ‰ํ•˜๋Š” ์œ ์ผํ•œ ๋ธŒ๋ผ์šฐ์ €์ž…๋‹ˆ๋‹ค.

์ด๊ฒƒ์€ ๋‚˜๋ฅผ ์œ„ํ•ด ์ผํ•˜๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค

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

๋ทฐ์–ด์— ์—ฐ๊ฒฐํ•˜๋Š” ์ด๋ฒคํŠธ๋‚˜ ๋ฐฉ๋ฒ•์„ ์ฐพ์„ ์ˆ˜ ์—†์—ˆ์ง€๋งŒ ์ธ์‡„ ๋ฒ„ํŠผ(์ €๋Š” ๋ฒ„์ „ 1.4.20์„ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์Œ)์—์„œ๋„ ํด๋ฆญ์„ ํŠธ๋ฆฌ๊ฑฐํ•˜๋ฉด ์ธ์‡„๋˜๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. settimeout์„ ํ†ตํ•ด ๋ทฐ์–ด ์‹œ๊ฐ„์„ ๋กœ๋“œํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

Firefox์—์„œ contentWindow์— ์•ก์„ธ์Šคํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ? ๋ณด์•ˆ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•˜์ง€ ์•Š์Šต๋‹ˆ๊นŒ?

@paolocaminiti ๋™์ผํ•œ ๋„๋ฉ”์ธ์—์„œ ๋ชจ๋“  ํŒŒ์ผ์„ ๋กœ๋“œํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๊ฒƒ์€ ๋‚˜๋ฅผ ์œ„ํ•ด ์ž‘๋™ํ•˜๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. Windows์—์„œ IE 10 ๋ฐ 11, IE Edge, Chrome์„ ์‚ฌ์šฉํ–ˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  Ubuntu 14.04์˜ FireFox 38.

    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/opera/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๋ฅผ ํ˜ธ์ถœํ•˜๊ธฐ๋งŒ ํ•˜๋ฉด setTimeout 0์„ ์‚ฌ์šฉํ•˜๋ฉด iframe์ด ์ฒจ๋ถ€๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋ถˆํ–‰ํžˆ๋„ firefox๋Š” blob์ด ์žˆ๋Š” contentWindow๋ฅผ ํ—ˆ์šฉํ•˜์ง€ ์•Š์ง€๋งŒ ์ธ์‡„ ๋ช…๋ น์ด ์žˆ๋Š” blob์€ ์ž์ฒด์ ์œผ๋กœ ์ธ์‡„ํ•ฉ๋‹ˆ๋‹ค.

์˜ˆ๋ฅผ ๋“ค์–ด ๋กœ์ปฌ ๋ฐ์ดํ„ฐ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ์†”๋ฃจ์…˜์€ ์—†์ง€๋งŒ pdf ๋ฐ์ดํ„ฐ๋ฅผ ๋ผ์šฐํŒ…ํ•˜๊ธฐ ์œ„ํ•ด ํ•œ ์†Œ์œ  ์„œ๋ฒ„์— ํ”„๋ก์‹œ๊ฐ€ ์žˆ์œผ๋ฉด ๋ชจ๋‘ ๋™์ผํ•œ ๋„๋ฉ”์ธ์— ์žˆ๊ณ  ์ฝ”๋“œ๋ฅผ ์ ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์•ˆ๋…•ํ•˜์„ธ์š”,

"res"์€(๋Š”) ๋ฌด์Šจ ๋œป์ธ๊ฐ€์š”? ๊ทธ๋ฆฌ๊ณ  PDFViewerApplication์€ PDF.js์—์„œ ์ œ๊ณต๋ฉ๋‹ˆ๊นŒ?

๊ฐ์‚ฌ ํ•ด์š”,

์˜ˆ, PDFViewerApplication์€ pdfjs์˜ PDFViewer ๋นŒ๋“œ์—์„œ ์ œ๊ณต๋˜๋ฉฐ ์†Œ์Šค๋Š” /web ๋””๋ ‰ํ† ๋ฆฌ ์•„๋ž˜์— ์žˆ์Šต๋‹ˆ๋‹ค. ์—…๋ฐ์ดํŠธํ•  ๋•Œ ๋งˆ์Šคํ„ฐ ๋ฆฌํฌ์ง€ํ† ๋ฆฌ๋ฅผ ๋” ์‰ฝ๊ฒŒ ๋ณ‘ํ•ฉํ•  ์ˆ˜ ์žˆ๋„๋ก ์ƒˆ ๋นŒ๋“œ๋ฅผ ์ˆ˜์ •ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค...

res๋Š” getData์— ์˜ํ•ด ๋‹ค์‹œ ์ „๋‹ฌ๋œ ์ธ์ˆ˜์ด๋ฉฐ pdf ํŒŒ์ผ์˜ ๋ฐ”์ดํŠธ ๋žฉ ํ‘œํ˜„์ด์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์—์„œ ์ถ”๊ฐ€ ๋„คํŠธ์›Œํฌ ์š”์ฒญ ์—†์ด ๋กœ๋“œํ•  ๋กœ์ปฌ blob url์„ ๋นŒ๋“œํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.

์œ„์˜ ์ฝ”๋“œ์™€ ๊ฐ™์€ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๋ ค๋Š” ๊ฒฝ์šฐ ์•ฝ๊ฐ„ ์ •๋ฆฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

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์„ ์ฒ˜๋ถ„ํ•ด์•ผ ํ•  ๋•Œ๋ฅผ ์ดํ•ดํ•˜๊ธฐ๊ฐ€ ๋ณต์žกํ•˜๊ธฐ ๋•Œ๋ฌธ์— ํ๊ธฐํ•˜์ง€ ์•Š๊ธฐ๋กœ ์„ ํƒํ–ˆ์Šต๋‹ˆ๋‹ค. pdf๊ฐ€ ์ค‘๊ฐ„์— ๋ณ€๊ฒฝ๋  ์ˆ˜ ์—†๋‹ค๊ณ  ๊ฐ€์ •ํ•˜๊ณ  ์‚ฌ์šฉ์ž๊ฐ€ ์ธ์‡„ํ•  ๋•Œ๋งˆ๋‹ค ๊ทธ๋Œ€๋กœ ๋‘๊ณ  ์žฌ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

๋„์›€์ด ๋˜๊ธฐ๋ฅผ ๋ฐ”๋ž๋‹ˆ๋‹ค.

@newguy ๋‹ค๋ฅธ ๋…์ž๋“ค์„ ์œ„ํ•ด ์ด ์Šค๋ ˆ๋“œ๋ฅผ ๋ช…ํ™•ํžˆ ํ•˜๊ธฐ ์œ„ํ•ด ์šฐ๋ฆฌ๋Š” ์ƒ๋‹นํžˆ ๋‹ค๋ฅธ ์ผ์„ ํ•˜๊ณ  ์žˆ๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.
๊ธฐ๋ณธ ๋ธŒ๋ผ์šฐ์ € pdf ๋ทฐ์–ด๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ „์ฒด ํ’ˆ์งˆ๋กœ ์ธ์‡„ํ•˜๋ ค๊ณ  ํ•ฉ๋‹ˆ๋‹ค.
๋ณผ ์ˆ˜ ์žˆ๋Š” iframe์—์„œ PDFjs ๋ทฐ์–ด๋ฅผ ๋กœ๋“œํ•˜๊ณ  ํ˜ธ์ŠคํŠธ ์‘์šฉ ํ”„๋กœ๊ทธ๋žจ์—์„œ ์ธ์‡„๋ฅผ ์ œ์–ดํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

iframe์— ์Šคํฌ๋ฆฝํŠธ๋ฅผ ์‚ฝ์ž…ํ•˜๊ณ  ํ•จ์ˆ˜๋กœ ํ˜ธ์ถœํ•˜๋Š” @paolocaminiti ๋ฅผ ๋‹ฌ์„ฑํ•˜๋ ค๊ณ  ์‹œ๋„ํ–ˆ์ง€๋งŒ ์ง€๊ธˆ์€ "offsetParent๊ฐ€ ์„ค์ •๋˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค -- ์Šคํฌ๋กคํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค"๋ผ๋Š” ๋ฉ”์‹œ์ง€๊ฐ€ ํ‘œ์‹œ๋˜๊ธฐ ๋•Œ๋ฌธ์— ์žฌ๋ฏธ์žˆ์Šต๋‹ˆ๋‹ค. ๐Ÿ˜ข. ํฌ๋กฌ ํ‚ค์˜ค์Šคํฌ ์ธ์‡„๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ์ด๊ฒƒ์„ ์žŠ์–ด ๋ฒ„๋ ธ์Šต๋‹ˆ๋‹ค.

ํ˜„์žฌ๊นŒ์ง€ ์–ด๋– ํ•œ ํ•ด๊ฒฐ์ฑ…๋„ ์ œ์‹œ๋˜์ง€ ์•Š์Œ

์—ฌ์ „ํžˆ ์„œ๋ฒ„ ์ธก ์†”๋ฃจ์…˜์ด ํ•„์š”ํ•ฉ๋‹ˆ๊นŒ, ์•„๋‹ˆ๋ฉด ์ด ์ฃผ์ œ์— ๋Œ€ํ•ด ์ง„์ „์ด ์žˆ์Šต๋‹ˆ๊นŒ? pdf-js์—์„œ PDFPrintService ๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ? ์ด๊ฒƒ์ด ๊ธฐ๋Šฅ์  ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•์ด ๋ ๊นŒ์š”? ๊ทธ๋ ‡๋‹ค๋ฉด ์ „์ฒด pdf ๋ทฐ์–ด๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š๊ณ  ์–ด๋–ป๊ฒŒ ์ด ์„œ๋น„์Šค๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ?

์ด ํŽ˜์ด์ง€๊ฐ€ ๋„์›€์ด ๋˜์—ˆ๋‚˜์š”?
0 / 5 - 0 ๋“ฑ๊ธ‰