Html2canvas: toDataURL์„ ํ†ตํ•ด ์ƒ์„ฑ๋œ ์ด๋ฏธ์ง€์˜ ํ•ด์ƒ๋„๋ฅผ ๋†’์ด๋Š” ๋ฐฉ๋ฒ•

์— ๋งŒ๋“  2013๋…„ 07์›” 10์ผ  ยท  58์ฝ”๋ฉ˜ํŠธ  ยท  ์ถœ์ฒ˜: niklasvh/html2canvas

์ด๊ฒƒ์€ ๋” ๋งŽ์€ ๊ธฐ๋Šฅ ์š”์ฒญ์ž…๋‹ˆ๋‹ค. ๋ฐ˜ํ™˜๋œ canvas toDataURL ๋ฅผ ํ˜ธ์ถœํ•˜์—ฌ PNG๋ฅผ ์‰ฝ๊ฒŒ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์ด๋ฏธ์ง€์˜ ํ’ˆ์งˆ์ด ๋‹ค์†Œ ํ๋ฆฟํ•˜๊ฑฐ๋‚˜ ์ข‹์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋‚˜๋Š” ์•ฝ๊ฐ„์˜ ์ธํ„ฐ๋„ท ๊ฒ€์ƒ‰์„ํ–ˆ๊ณ  ๊ธฐ๋ณธ์ ์œผ๋กœ 96dpi์˜ ์ด๋ฏธ์ง€๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค๋Š” ๊ฒƒ์„ ์•Œ์•˜์Šต๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์ด๊ฒƒ์„ ๊ฐœ์„ ํ•˜๋Š” ํ‘œ์ค€ ๋ฐฉ๋ฒ•์€ ์—†๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ๋˜ํ•œ toDataURLHD ๋Š” ์‹คํ—˜์ ์ด๋ฉฐ ์–ด๋–ค ๋ฐฉ์‹์œผ๋กœ๋„ ์ž‘๋™ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

html2canvas ์—์„œ ๋” ๋†’์€ ํ•ด์ƒ๋„์˜ ์ด๋ฏธ์ง€๋ฅผ ๋ฐ˜ํ™˜ํ•  ์ˆ˜ ์žˆ๋Š” ๋ฐฉ๋ฒ•์ด ์žˆ์Šต๋‹ˆ๊นŒ? ๋˜๋Š” DOM์„ ๋ Œ๋”๋งํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์ œ๊ณตํ•  ์ˆ˜ ์žˆ๋‹ค๊ณ  ํ•ด๋„ DOM์„ ์‚ฌ์šฉํ•˜๋Š” ์ผ๋ถ€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ(๋ชจ๋“  ๊ณ„์‚ฐ๋œ ์Šคํƒ€์ผ์ด ์ ์šฉ๋œ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ)๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ์›ํ•˜๋Š” ์ด๋ฏธ์ง€๋ฅผ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๊ฐ€์žฅ ์œ ์šฉํ•œ ๋Œ“๊ธ€

์ด๊ฒƒ์— ๋Œ€ํ•ด +1. PDF์— ์‚ฝ์ž…ํ•  html2canvas๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ด๋ฏธ์ง€๋ฅผ ์–ป์œผ๋ ค๊ณ  ํ•˜์ง€๋งŒ ํ’ˆ์งˆ์ด ํ๋ฆฟํ•ฉ๋‹ˆ๋‹ค.

๋ชจ๋“  58 ๋Œ“๊ธ€

๋‹ค๋ฅธ ๋ฌธ์ œ/์š”์ฒญ์˜ ์–ด๋Š ์‹œ์ ์—์„œ ์ด์— ๋Œ€ํ•œ ์ด์•ผ๊ธฐ๊ฐ€ ์žˆ์—ˆ๊ณ  ๋ˆ„๊ตฐ๊ฐ€๊ฐ€ pull ์š”์ฒญ์„ ์ œ์ถœํ–ˆ๋‹ค๋Š” ๊ฒƒ์„ ์•Œ๊ณ  ์žˆ์ง€๋งŒ pull ์š”์ฒญ์ด ๋ณ‘ํ•ฉ๋˜๋Š” ๊ฒƒ์„ ๋ณธ ์ ์ด ์—†์Šต๋‹ˆ๋‹ค.

์žฅ์น˜ ํ”ฝ์…€ ๋ฐ€๋„๋ฅผ ํ™•์ธํ•˜๋Š” ๋ฐ ์‚ฌ์šฉํ•˜๋Š” ์ž‘์—… ๋ฐฉ๋ฒ•์ด ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์ด๊ฒƒ์€ ์„ฑ๋Šฅ์— ์˜ํ–ฅ์„ ์ค„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋Œ€์‹  ๋” ๋†’์€ dpi๋กœ ๋ Œ๋”๋งํ•˜๋„๋ก ๋งค๊ฐœ๋ณ€์ˆ˜๊ฐ€ ํ•„์š”ํ• ๊นŒ์š”?

@missing ์˜ˆ, DPI๋ฅผ ์ง€์ •ํ•˜๋Š” ๋งค๊ฐœ ๋ณ€์ˆ˜๋Š” ๊ต‰์žฅํ•ฉ๋‹ˆ๋‹ค.

๋˜ํ•œ ์žฅ์น˜ ํ”ฝ์…€ ๋ฐ€๋„์— ๋Œ€ํ•œ ์ž‘์—… ๋ฐฉ๋ฒ•์„ ๊ณต์œ ํ•˜๋Š” ๋ฐ ์‹ ๊ฒฝ ์“ฐ์ง€ ์•Š๋Š”๋‹ค๋ฉด ๊ดœ์ฐฎ์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋‚ด ์ฃผ์š” ์‘์šฉ ํ”„๋กœ๊ทธ๋žจ์€ ์ตœ๋Œ€ 50๊ฐœ ๋‹จ์–ด์˜ ๋‹จ์–ด ๊ตฌ๋ฆ„์˜ png๋ฅผ ๋‚ด๋ณด๋‚ด๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ทธ๋ž˜์„œ ๋‚˜๋Š” ์ด๊ฒƒ์— ๋Œ€ํ•œ ์„ฑ๋Šฅ ํžˆํŠธ์— ๋Œ€ํ•ด ๊ทธ๋‹ค์ง€ ๊ฑฑ์ •ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

์ด๋ฏธ์ง€์˜ ํ’ˆ์งˆ์ด ๋ฌธ์ œ์ž…๋‹ˆ๊นŒ ์•„๋‹ˆ๋ฉด ํ๋ฆฟํ•œ ํšจ๊ณผ์ž…๋‹ˆ๊นŒ(์ผ๋ถ€ ์ด๋ฏธ์ง€๋Š” html2canvas์— ์˜ํ•ด ํ๋ฆฟํ•œ ํšจ๊ณผ๋กœ ์ƒ์„ฑ๋จ)?

@brcontainer ์ด๋ฏธ์ง€์˜ ํ’ˆ์งˆ์ด ๋ฌธ์ œ๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ์ œ ์ƒ๊ฐ์—๋Š”. ์˜ˆ: 100% ํ™•๋Œ€/์ถ•์†Œ์—์„œ ์‚ฌ์ง„์€ ๊ดœ์ฐฎ๊ฒŒ ๋ณด์ž…๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ 5%๋งŒ ํ™•๋Œ€ํ•ด๋„ ์‚ฌ์ง„ ํ’ˆ์งˆ์ด ๋ˆˆ์— ๋„๊ฒŒ ๋–จ์–ด์ง€๋Š” ๊ฒƒ์„ ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ฒจ๋ถ€๋œ ์ด๋ฏธ์ง€๋ฅผ ์ฐธ์กฐํ•˜์„ธ์š”.
association-cloud-apple-twitter

๋Ÿฐํƒ€์ž„์— ๋ฌธ์ œ์˜ ์˜ˆ๋ฅผ ๋ณด๋Š” ๊ฒƒ๋งŒ์œผ๋กœ ํ™•์‹ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

http://jsfiddle.net/ ์„ ์‚ฌ์šฉํ•˜์—ฌ ๊ฐ™์€ ์žฅ์†Œ๋ฅผ ์‹œ๋„ํ•˜๊ณ  ์—ฌ๊ธฐ์— ๋งํฌ๋ฅผ ๊ฒŒ์‹œํ•˜์‹ญ์‹œ์˜ค.

[ํŽธ์ง‘ํ•˜๋‹ค]
html2canvas์— ์˜ํ•ด ์ƒ์„ฑ๋œ ์บ”๋ฒ„์Šค์— ์ ์šฉ _zoom_์„ ์‹œ๋„ํ•  ๊ฐ€๋Šฅ์„ฑ์ด ์žˆ๋Š” ๊ฒฝ์šฐ (์ด๋ฏธ์ง€๋กœ ์ €์žฅํ•˜๊ธฐ ์ „์—) ๋‹ค์Œ์„ ์‚ฌ์šฉํ•ด ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

ctx.webkitImageSmoothingEnabled = false;
ctx.mozImageSmoothingEnabled = false;
ctx.imageSmoothingEnabled = false;

ํ–‰์šด์„ ๋น•๋‹ˆ๋‹ค

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

96DPI๋ณด๋‹ค ๋†’์€ ํ•ด์ƒ๋„๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. 300DPI ์ด์ƒ์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.

์ด๊ฒƒ์ด html2canvas์™€ _๊ฐ€๋Šฅ_ํ•ฉ๋‹ˆ๊นŒ?

์ด๋ฏธ์ง€์˜ ํ๋ฆฟํ•จ๊ณผ ๋™์ผํ•œ ๋ฌธ์ œ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ํ๋ฆฟํ•จ์„ ์ œ๊ฑฐํ•˜๊ณ  ๋ณด๊ธฐ ์ข‹์€ DPI๋ฅผ ์ œ๊ณตํ•˜๋Š” ์†”๋ฃจ์…˜์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.

์ด ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ๋Š” ๋ฐฉ๋ฒ• ๋˜๋Š” ๋™์ผํ•œ ํšจ๊ณผ๋ฅผ ์–ป์„ ์ˆ˜ ์žˆ๋Š” ๋‹ค๋ฅธ ๋ฐฉ๋ฒ•์— ๋Œ€ํ•œ ์ƒ๊ฐ/์ œ์•ˆ์ด ์žˆ์Šต๋‹ˆ๊นŒ?

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

@brcontainer ์ง€๊ธˆ ํŽธ์ง‘ํ–ˆ์Šต๋‹ˆ๋‹ค. ๋‚˜๋Š” ๋‹น์‹ ์ด ์ œ์•ˆํ•œ ๊ฒƒ์„ํ–ˆ์ง€๋งŒ ์—ฌ์ „ํžˆ ์ด๋ฏธ์ง€ ํ’ˆ์งˆ์— ์šด์ด ์—†์Šต๋‹ˆ๋‹ค. ์—ฌ๊ธฐ ๋‚ด๊ฐ€ ํ•œ ์ผ์ด ์žˆ์Šต๋‹ˆ๋‹ค -

                var ctx = canvas.getContext('2d');

                ctx.webkitImageSmoothingEnabled = false;
                ctx.mozImageSmoothingEnabled = false;
                ctx.imageSmoothingEnabled = false;

                var rawData = canvas.toDataURL("image/png");

์ˆœ์„œ๊ฐ€ ์ž˜๋ชป๋œ ๊ฒฝ์šฐ ์ด๋ฏธ์ง€ ํฌ๊ธฐ๋ฅผ ์กฐ์ •ํ•˜๊ธฐ ์ „์— "ImageSmoothingEnabled"๋ฅผ ์ ์šฉํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

์ฝ”๋“œ ์ƒ˜ํ”Œ์„ http://jsfiddle.net์— ๋„ฃ์œผ๋ฉด ํŽธ์ง‘ํ•ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

์•ˆ๋…•ํ•˜์„ธ์š” ์—ฌ๋Ÿฌ๋ถ„,

toDataURL์˜ 96dpi ์ œ์•ฝ ์—†์ด ๊ณ ํ•ด์ƒ๋„ ์ด๋ฏธ์ง€๋ฅผ ์—…๋กœ๋“œํ•˜๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค. toDataURLHD๋Š” ์•„์ง ์‚ฌ์šฉํ•  ์ˆ˜ ์—†๊ธฐ ๋•Œ๋ฌธ์— ์–ด๋–ป๊ฒŒ ๋‚ด ๊ฟˆ์„ ์‹คํ˜„ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ? :-)

์–ด๋–ค ํžŒํŠธ๋ผ๋„ ๋ฏธ๋ฆฌ ๊ฐ์‚ฌ๋“œ๋ฆฝ๋‹ˆ๋‹ค

@brcontainer ์ด๋ฏธ์ง€ ํฌ๊ธฐ๋ฅผ ์ „ํ˜€ ์กฐ์ •ํ•˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— ํฌ๊ธฐ ์กฐ์ • ์ „์— ์Šค๋ฌด๋”ฉ์„ ์ ์šฉํ•œ๋‹ค๋Š” ๊ฒƒ์ด ๋ฌด์Šจ ๋œป์ธ์ง€ ์ž˜ ๋ชจ๋ฅด๊ฒ ์Šต๋‹ˆ๋‹ค. ์–ด์จŒ๋“  ๋‚˜๋Š” ๋‹น์‹ ์ด http://jsfiddle.net/tankchintan/92mra/4/ ๋ฅผ ๋ณผ ์ˆ˜ ์žˆ๋„๋ก jsfiddle์„ ๋งŒ๋“ค์—ˆ์Šต๋‹ˆ๋‹ค.

์ด ๋ฌธ์ œ๊ฐ€ ํ•ด๊ฒฐ๋˜๊ธฐ๋ฅผ ์ •๋ง ๊ธฐ๋Œ€ํ•ฉ๋‹ˆ๋‹ค! :)

๋‹น์‹ ์ด ํ˜ผ๋ž€์Šค๋Ÿฌ์›Œํ•˜๋Š” ์นœ๊ตฌ, ํฌ๊ธฐ๋ฅผ ์กฐ์ •ํ•ด์•ผ ํ•˜๋Š” toDataURL ์ด ์žˆ์Šต๋‹ˆ๋‹ค. CANVAS ํฌ๊ธฐ๋ฅผ ์กฐ์ •ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
์˜ˆ์ œ๋ฅผ ๋งŒ๋“ค๋ ค๊ณ  ํ•˜์ง€๋งŒ ์—ฌ์ „ํžˆ ์ž‘๋™ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

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

๋‚˜๋Š” ๋” ๋‚˜์€ ์ด๋ฏธ์ง€ ํ’ˆ์งˆ์„ ์œ„ํ•ด ์ด๋Ÿฌํ•œ ์ œ์•ˆ์„ ๋”ฐ๋ฅด๋ ค๊ณ  ๋…ธ๋ ฅํ–ˆ์ง€๋งŒ ๋‚˜์—๊ฒŒ๋„ ๋ช…ํ™•ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

brcontainer, ๋‹น์‹ ์ด ๋งํ•˜๋Š” ์•„์ด๋””์–ด๋กœ tankchintan์ด ๋งŒ๋“  JS ๋ฐ”์ด์˜ฌ๋ฆฐ์„ ๋ช…ํ™•ํžˆ ํ•˜๊ฑฐ๋‚˜ ๋ณ€๊ฒฝ/์ƒ์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ? 2๋ฐฐ ํฌ๊ธฐ์˜ ์ด๋ฏธ์ง€๋ฅผ ์ƒ์„ฑํ•˜๋”๋ผ๋„ ์ด๋ฏธ์ง€๋ฅผ 192DPI๋กœ ๋ณ€ํ™˜ํ•œ ํ›„์—๋„ ์ด๋ฏธ์ง€์˜ ํ”ฝ์…€ํ™”๊ฐ€ ์—ฌ์ „ํžˆ ๋‚จ์•„ ์žˆ์Šต๋‹ˆ๋‹ค.

์•ˆ๋…•ํ•˜์„ธ์š” ์—ฌ๋Ÿฌ๋ถ„, ์ด ๋ฌธ์ œ์— ๋Œ€ํ•œ ํ”ผ๋“œ๋ฐฑ์ด ๋” ์žˆ์Šต๋‹ˆ๊นŒ? ํ’ˆ์งˆ/ํ•ด์ƒ๋„๋ฅผ ๋†’์ด๊ธฐ ์œ„ํ•ด zoomFactor ์„ค์ •ํ•  ์ˆ˜ ์žˆ๋Š” PhantomJS์™€ ๋น„๊ตํ•˜์—ฌ html2canvas๋กœ ๋งค์šฐ ํ”„๋กœ ์ด๋ฏธ์ง€ ํ’ˆ์งˆ์„ ๊ฒฝํ—˜ํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

๋น„์Šทํ•œ ๋ฌธ์ œ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. html2canvas๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ div๋ฅผ ์ด๋ฏธ์ง€๋กœ ๋ณ€ํ™˜ํ•œ ๋‹ค์Œ iTextsharp๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ PDF์— ์ด๋ฏธ์ง€๋ฅผ ์ถ”๊ฐ€ํ•˜๋Š” PDF ๋ฌธ์„œ๋กœ ์›น ํŽ˜์ด์ง€์˜ ์Šค๋ƒ…์ƒท์„ ๊ฐ€์ ธ์™€์•ผ ํ•œ๋‹ค๋Š” ์š”๊ตฌ ์‚ฌํ•ญ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์ƒ์„ฑ๋œ ์ด๋ฏธ์ง€๊ฐ€ ์•ฝ๊ฐ„ ํ๋ฆฟํ•˜๊ฒŒ ๋ณด์ด๋ฉฐ ๋ˆˆ์œผ๋กœ ์ง€์†์ ์œผ๋กœ ๋ณด๊ธฐ๊ฐ€ ์–ด๋ ต์Šต๋‹ˆ๋‹ค. html2canvas์—์„œ ์ƒ์„ฑ ์‹œ ์ž์ฒด์ ์œผ๋กœ ์ง€์ •๋œ ํ•ด์ƒ๋„์˜ ์ด๋ฏธ์ง€๋ฅผ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ๋Š”์ง€ ์•Œ๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค.

์•ˆ๋…•ํ•˜์„ธ์š”,
๋‚˜๋Š” ์œ„์™€ ๋˜‘๊ฐ™์€ ์š”๊ตฌ ์‚ฌํ•ญ์„ ๊ฐ€์ง€๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ๊ฐ™์€ ๋ฌธ์ œ๊ฐ€ ์ง๋ฉดํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.
"๋‚ด div๋ฅผ ์ด๋ฏธ์ง€๋กœ ๋ณ€ํ™˜ํ•œ ๋‹ค์Œ ์ด๋ฏธ์ง€๋ฅผ PDF์— ์ถ”๊ฐ€ํ•˜๊ธฐ ์œ„ํ•ด html2canvas๋ฅผ ์‚ฌ์šฉํ•˜๋Š” PDF ๋ฌธ์„œ๋กœ ์›น ํŽ˜์ด์ง€์˜ ์Šค๋ƒ…์ƒท ๊ฐ€์ ธ์˜ค๊ธฐ."
๊ทธ๋Ÿฌ๋‚˜ ์ƒ์„ฑ๋œ ์ด๋ฏธ์ง€๊ฐ€ ์•ฝ๊ฐ„ ํ๋ฆฟํ•˜๊ฒŒ ๋ณด์ž…๋‹ˆ๋‹ค.

์œ„์˜ ์ œ์•ˆ์„ ๋”ฐ๋ž์ง€๋งŒ ์—ฌ์ „ํžˆ ํ๋ฆฟํ•œ ์ด๋ฏธ์ง€๊ฐ€ ๋‚˜ํƒ€๋‚ฉ๋‹ˆ๋‹ค.
์—ฌ๊ธฐ ๋‚ด ์ฝ”๋“œ์—์„œ: html2canvas๋Š” ์‹œ์Šคํ…œ ํ•ด์ƒ๋„๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ํ•˜๋Š” ์›น ํŽ˜์ด์ง€์˜ ์Šค๋ƒ…์ƒท์„ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.
์‹œ์Šคํ…œ ํ•ด์ƒ๋„์— ๋”ฐ๋ผ ๋‹ค๋ฅธ ํฌ๊ธฐ์˜ ๋™์ผํ•œ ์›น ํŽ˜์ด์ง€ "์Šค๋ƒ…์ƒท"์ด ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค.

์˜ˆ์‹œ :
์ด๋ฏธ์ง€ ํฌ๊ธฐ : 816x422
์ด๋ฏธ์ง€ ํฌ๊ธฐ : 1193x437
์ด๋ฏธ์ง€ ํฌ๊ธฐ : 1275x437
์—ฌ๊ธฐ์„œ ๋‚ด ๊ธฐ๋Œ€์น˜๋Š” 2000 x 1784 ์น˜์ˆ˜ ์ด์ƒ์ž…๋‹ˆ๋‹ค.

์ด ์ฐจ์›์˜ ์ด๋ฏธ์ง€๋ฅผ ์–ป์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ?
์†Œ์ค‘ํ•œ ์ œ์•ˆ์„ ํ•ด์ฃผ์‹œ๊ณ  ์†Œ์ค‘ํ•œ ์‹œ๊ฐ„ ๋‚ด์ฃผ์…”์„œ ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค.

์ด๊ฒƒ์— ๋Œ€ํ•ด +1. PDF์— ์‚ฝ์ž…ํ•  html2canvas๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ด๋ฏธ์ง€๋ฅผ ์–ป์œผ๋ ค๊ณ  ํ•˜์ง€๋งŒ ํ’ˆ์งˆ์ด ํ๋ฆฟํ•ฉ๋‹ˆ๋‹ค.

๋” ๋†’์€ ํ•ด์ƒ๋„๋กœ ๋‚ด๋ณด๋‚ด๋ ค๋Š” ์š”์†Œ์— ๋Œ€ํ•ด parentNode์˜ CSS ๋ณ€ํ™˜ ๋งคํŠธ๋ฆญ์Šค๋ฅผ ์‚ฌ์šฉํ•ด ๋ณด์…จ์Šต๋‹ˆ๊นŒ? ์ด๊ฒƒ์€ ๋‚˜๋ฅผ ์œ„ํ•ด ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค. ์˜ˆ: "๋ณ€ํ™˜: scale(2, 2)"

@mudcube ๋Š” ๋ถ€๋ถ„์ ์œผ๋กœ ๋‚˜๋ฅผ ์œ„ํ•ด ์ผํ–ˆ์Šต๋‹ˆ๋‹ค.

@brcontainer ๊ทธ๊ฒƒ์€ ๋‚˜๋ฅผ ์œ„ํ•ด ์ž˜ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค

ํ•ด๊ฒฐ์ฑ…์ด ์žˆ์Šต๋‹ˆ๊นŒ?? ํ๋ฆฟํ•œ ์ด๋ฏธ์ง€์˜ ํ•ด์ƒ๋„๋ฅผ ๋†’์ด๋Š” ๋ฐฉ๋ฒ•์„ ๊ณต์œ ํ•˜์‹ญ์‹œ์˜ค. ๋‚˜๋Š” ๊ทธ๊ฒƒ์˜ pdf๋ฅผ ๋งŒ๋“ค์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

+1 ์ด์— ๋Œ€ํ•œ ์†”๋ฃจ์…˜/์ง€์นจ์ด ์•„์ง ์žˆ์Šต๋‹ˆ๊นŒ?

์–ด๋–ค ํ•ด๊ฒฐ์ฑ…์„ ์ฐพ์•˜์Šต๋‹ˆ๊นŒ?

์—ฌ๋Ÿฌ๋ถ„, transform: scale(2, 2) ํ•˜๋ฉด ์ž˜ ๋ฉ๋‹ˆ๋‹ค.

์ž์„ธํ•œ ๋‚ด์šฉ์„ ์ œ๊ณตํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ?

@matiasinsaurralde ์Šคํฌ๋ฆฐ์ƒท์„ ๋งŒ๋“ค๊ธฐ ์ง์ „์— ์œ„์—์„œ css ๊ทœ์น™์ด ํฌํ•จ๋œ css ํด๋ž˜์Šค .x2 ๋ฅผ ์š”์†Œ์— ์ถ”๊ฐ€ํ•œ ๋‹ค์Œ html2canvas ์ฝœ๋ฐฑ์—์„œ ํ•ด๋‹น ํด๋ž˜์Šค๋ฅผ ์ œ๊ฑฐํ•ฉ๋‹ˆ๋‹ค. ๋‘ ๋ฐฐ ํฌ๊ธฐ์˜ ์š”์†Œ์™€ ๋‘ ๋ฐฐ ํฌ๊ธฐ์˜ ์Šคํฌ๋ฆฐ์ƒท๋„ ์–ป์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ๊ทธ๊ฒƒ์€ ๋งค๋„๋Ÿฝ๊ธฐ ๋•Œ๋ฌธ์— ํฌ๊ธฐ ์กฐ์ •์„ ๊ด€์ฐฐํ•˜์ง€ ์•Š์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

image
@Ajaxy ์ œ์•ˆ์„ ๋”ฐ๋ฅด๋ ค๊ณ  ํ•  ๋•Œ์˜ ์Šคํฌ๋ฆฐ์ƒท. ๋‚ด ์ฝ”๋“œ์— ๋ฌธ์ œ๊ฐ€ ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๊นŒ? ํŽ˜์ด์ง€๋ฅผ ๋ Œ๋”๋งํ•˜๋Š” ๋ฐ ๋„ˆ๋ฌด ์˜ค๋ž˜ ๊ฑธ๋ ธ์Šต๋‹ˆ๋‹ค.

์Šค์ผ€์ผ์€ ๋‚˜๋ฅผ ์œ„ํ•ด ํ•ด์ƒ๋„๋ฅผ ์ฆ๊ฐ€์‹œํ‚ค์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค. JS๋กœ ํ•ด๊ฒฐํ•ด์•ผํ–ˆ์Šต๋‹ˆ๋‹ค -
https://github.com/niklasvh/html2canvas/issues/379

ํ–‰์šด์„ ๋น•๋‹ˆ๋‹ค ์—ฌ๋Ÿฌ๋ถ„?

transform: scale(2, 2); ๋Š” dygraph.js์— ๋Œ€ํ•œ ์†”๋ฃจ์…˜๋„ ์•„๋‹™๋‹ˆ๋‹ค.

@premerddyn , ์—ฐ๊ฒฐ๋œ ๋ฌธ์ œ์—์„œ ๋‚ด ์†”๋ฃจ์…˜์„ ์ฐธ์กฐํ•˜์‹ญ์‹œ์˜ค.
์ž˜ ์ž‘๋™ํ•˜์ง€๋งŒ ์Šคํฌ๋ฆฐ์ƒท ์ „์— ํ™•๋Œ€ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
๋‚ด ์˜๊ฒฌ์ด ๋ช…ํ™•ํ•˜์ง€ ์•Š์œผ๋ฉด ๋” ๋งŽ์€ ์„ค๋ช…์„ ์ถ”๊ฐ€ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.

๊ธ€์Ž„, ๋‚ด๊ฐ€ ํ•œ ์ผ์€ ๋‘ ๋ฐฐ ํฌ๊ธฐ์˜ div๋ฅผ ๋งŒ๋“ค๊ณ  ๊ฐ€์‹œ์„ฑ์„ ์ถ•์†Œํ•˜๊ณ  ์—ฌ๊ธฐ์— ์žˆ๋Š” ๋ชจ๋“  ์ฝ˜ํ…์ธ ๋ฅผ ํ•ด๋‹น div์— ๊ฒŒ์‹œํ•˜๊ณ  ์Šคํฌ๋ฆฐ์ƒท์„ ์ฐ์€ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ทธ๋Ÿฐ ์‹์œผ๋กœ ์ด๋ฏธ์ง€ ์„ ๋ช…๋„๊ฐ€ ์†์‹ค๋˜์ง€ ์•Š๊ณ  ๊ธ€๊ผด ํฌ๊ธฐ ์ฝ”๋“œ๋ฅผ ์ˆ˜์ •ํ•˜์—ฌ ๋งŒ๋“ค์—ˆ์Šต๋‹ˆ๋‹ค. ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค.์ž˜ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค.ํ•˜์ง€๋งŒ ๋‚ด ๋ฌธ์ œ๋Š” ํ…์ŠคํŠธ ์ŠคํŠธ๋กœํฌ ๋ฐ ์—ฌ๋Ÿฌ ์ค„ ํ…์ŠคํŠธ ๋ฐฐ๊ฒฝ์— ์žˆ์Šต๋‹ˆ๋‹ค.

2๋กœ ์Šค์ผ€์ผ๋งํ•˜๋ฉด ํšจ๊ณผ๊ฐ€ ์žˆ์ง€๋งŒ ๋ Œ๋”๋ง์ด ์ฐฝ ํ•ด์ƒ๋„/ํฌ๊ธฐ์— ์˜ํ•ด ์ œํ•œ๋œ๋‹ค๋Š” ๊ฒƒ์„ ์•Œ์•˜์Šต๋‹ˆ๋‹ค. ํฌ๊ธฐ๊ฐ€ ์กฐ์ •๋œ div๊ฐ€ ์ฐฝ๋ณด๋‹ค ๋„“์œผ๋ฉด ์ผ๋ถ€๊ฐ€ ์ž˜๋ฆฝ๋‹ˆ๋‹ค.

๊ทธ๋ž˜์„œ ํ™”๋ฉด๋ณด๋‹ค ํฐ ์บ”๋ฒ„์Šค๋ฅผ ์บก์ณํ•˜๋Š” ๋ฐฉ๋ฒ•์€ ์—†๋‚˜์š”?

์•„, ์ด ์Šค๋ ˆ๋“œ์—์„œ:

var h = $(element)[0].ownerDocument.defaultView.innerHeight;
    $(element)[0].ownerDocument.defaultView.innerHeight = $(element).height();
    html2canvas($(element)).then(function(canvas) {
        $(element)[0].ownerDocument.defaultView.innerHeight = h;
        //Do whatever you want with your canvas
    }

https://jsfiddle.net/enjoythedaycsk/9L966sdd/1/

์ด ์˜ˆ์—์„œ ๊ณ ํ•ด์ƒ๋„๋ฅผ ๋‹ฌ์„ฑํ•˜๋ ค๊ณ ํ–ˆ์ง€๋งŒ ์–ป์ง€ ๋ชปํ–ˆ์Šต๋‹ˆ๋‹ค ...

pngx2 ๋‹ค์šด๋กœ๋“œ ๋ฒ„ํŠผ์„ ํด๋ฆญํ•˜์„ธ์š”..

๋ฒ„ํŠผ์„ ํด๋ฆญํ•˜๋ฉด ์บ”๋ฒ„์Šค๊ฐ€ ๋‘ ๋ฐฐ ํฌ๊ธฐ๋กœ ๋ฐ”๋€Œ๊ณ  ์‚ฌ์ง„์ด ์บก์ฒ˜๋˜๊ณ  ๋‹ค์‹œ ์บ”๋ฒ„์Šค๊ฐ€ ์ผ๋ฐ˜ ํฌ๊ธฐ๋กœ ๋Œ์•„์˜ค๋Š” ๊ฒƒ๊ณผ ๊ฐ™์€ ๋ฐฑ์—”๋“œ์—์„œ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ?

๋ฌผ๋ก  ๊ทธ๋ ‡๊ฒŒ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋‚˜๋Š” ๋‚ด๊ฐ€ ์›ํ•˜๋Š” ํฌ๊ธฐ์˜ ์บ”๋ฒ„์Šค๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ
์ฝ”๋“œ ์ œ๊ณต. ๊ฐ’์„ ๊ตฌํ•˜๋Š” ๊ฒƒ์ด ๋ถ€์ •ํ™•ํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฒƒ์„ ์•Œ์•˜์œผ๋ฏ€๋กœ
๋„ˆ๋น„/๋†’์ด๋ฅผ ์ง์ ‘ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

2016๋…„ 5์›” 7์ผ ํ† ์š”์ผ์— enjoytheday [email protected] ์€ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ผ์Šต๋‹ˆ๋‹ค.

https://jsfiddle.net/enjoythedaycsk/9L966sdd/1/

์ด ์˜ˆ์—์„œ ๊ณ ํ•ด์ƒ๋„๋ฅผ ๋‹ฌ์„ฑํ•˜๋ ค๊ณ  ์‹œ๋„ํ–ˆ์ง€๋งŒ ์–ป์ง€ ๋ชปํ–ˆ์Šต๋‹ˆ๋‹ค.
์ €๊ฒƒ...

pngx2 ๋‹ค์šด๋กœ๋“œ ๋ฒ„ํŠผ์„ ํด๋ฆญํ•˜์„ธ์š”..

๋ฒ„ํŠผ์„ ํด๋ฆญํ•  ๋•Œ์™€ ๊ฐ™์ด ๋ฐฑ์—”๋“œ์—์„œ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ?
์บ”๋ฒ„์Šค๊ฐ€ ๋‘ ๋ฐฐ ํฌ๊ธฐ๋กœ ๋ฐ”๋€Œ๊ณ  ์‚ฌ์ง„์ด ์บก์ฒ˜๋˜๊ณ  ๋‹ค์‹œ
์บ”๋ฒ„์Šค๋ฅผ ๋‹ค์‹œ ์ผ๋ฐ˜ ํฌ๊ธฐ๋กœ ๊ฐ€์ ธ์˜ต๋‹ˆ๋‹ค..

โ€”
๋‹น์‹ ์ด ๋Œ“๊ธ€์„ ๋‹ฌ์•˜๊ธฐ ๋•Œ๋ฌธ์— ์ด๊ฒƒ์„ ๋ฐ›๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.
์ด ์ด๋ฉ”์ผ์— ์ง์ ‘ ๋‹ต์žฅํ•˜๊ฑฐ๋‚˜ GitHub์—์„œ ํ™•์ธํ•˜์„ธ์š”.
https://github.com/niklasvh/html2canvas/issues/241#issuecomment -217634634

์„ธ๊ณ„์—์„œ ๊ฐ€์žฅ ์˜ค๋ž˜ ์ง€์†๋˜๋Š” ์ผ๋Ÿฌ์ŠคํŠธ๋ ˆ์ด์…˜
ForeverScape.com http://www.foreverscape.com/ | @foreverscape
https://twitter.com/foreverscape | Github์—์„œ
https://github.com/vance/foreverscapecore | ๋‰ด์Šค์—์„œ
http://www.foreverscape.com/art/reviews/

@vance jsfiddle ์˜ˆ์ œ์—์„œ ์ด๊ฒƒ์„ ์„ค์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ?

https://jsfiddle.net/enjoythedaycsk/9L966sdd/1/

์‹œ๋„ํ–ˆ์ง€๋งŒ ๋‚ด๊ฐ€ ์„ค์ •ํ•˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค.

์™„์ „ํžˆ ํŽธ์ง‘ํ•˜๊ฑฐ๋‚˜ ์ƒˆ๋กœ ๋งŒ๋“ค ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋งŽ์€ ์‚ฌ๋žŒ๋“ค์—๊ฒŒ ๋„์›€์ด ๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค :๋Œ„์„œ:

์žฌ๋นจ๋ฆฌ ์กฐ๋กฑํ•˜๋ ค๊ณ  ํ–ˆ์ง€๋งŒ ํ…Œ์ŠคํŠธ div๋ฅผ ๊ณ ์น  ์‹œ๊ฐ„์ด ์—†์—ˆ์Šต๋‹ˆ๋‹ค. div์˜ ๋‚ด๋ถ€ ๋†’์ด๊ฐ€ ์˜ํ–ฅ์„ ๋ฐ›์ง€ _NOT_ ๋•Œ๋ฌธ์— transform:scale() ๋ฌด์–ธ๊ฐ€๋ฅผ ์บก์ฒ˜ํ•˜๋Š” ๊ฒƒ์€ ์•„๋ฌด ์ผ๋„ ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๊ทธ๋ ‡๊ธฐ ๋•Œ๋ฌธ์— ๋ณ€ํ˜•์ž…๋‹ˆ๋‹ค. w/h ์†์„ฑ์€ (๋‚ด๋ถ€์ ์œผ๋กœ) ๋ณ€๊ฒฝ๋˜์ง€ ์•Š์•˜์œผ๋ฉฐ getBoundingClientRect() ์„ ๊ฐ€์ ธ์™€ ํ…Œ์ŠคํŠธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋ถ€๋ชจ์˜ ์ปจํ…์ŠคํŠธ์—์„œ ๋ณผ ๋•Œ ๋„ˆ๋น„/๋†’์ด๋งŒ _actually_ ๋ณ€๊ฒฝ๋ฉ๋‹ˆ๋‹ค. ํฌ๊ธฐ๊ฐ€ ์กฐ์ •๋œ ํ›„ ์ปจํ…Œ์ด๋„ˆ div๋ฅผ ๊ฐ€์ ธ์™€์•ผ ํ•ฉ๋‹ˆ๋‹ค.

https://jsfiddle.net/jano9ao4/1/

๋™์ผํ•œ ๋ฌธ์ œ์— ์ง๋ฉดํ•ด ์žˆ์Šต๋‹ˆ๋‹ค. ์‹คํ–‰ ๊ฐ€๋Šฅํ•œ ์†”๋ฃจ์…˜์ด ์žˆ์Šต๋‹ˆ๊นŒ?ใƒพ(ยด๏ฝฅ ๏ฝฅ๏ฝ€๏ฝก)ใƒŽ"

์ฐฝ๋ณด๋‹ค ํฐ ์š”์†Œ๋ฅผ ์บก์ฒ˜ํ•˜๊ธฐ ์œ„ํ•ด ์ž‘๋™ํ•˜๋„๋ก ํ•  ์ˆ˜ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค. ๋ณ€ํ™˜๋œ ์š”์†Œ์—์„œ ๋‹จ์ˆœํžˆ "๋” ํฐ" ์ด๋ฏธ์ง€๋ฅผ ์–ป์„ ์ˆ˜ ์—†๋‹ค๋Š” ๊ฒƒ์„ ๊ธฐ์–ตํ•˜์‹ญ์‹œ์˜ค. ์™œ๋ƒํ•˜๋ฉด (์ž์ฒด์ ์œผ๋กœ) ์—ฌ์ „ํžˆ ๋™์ผํ•œ ์น˜์ˆ˜๋ฅผ ๊ฐ–๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.

iframe์—์„œ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๊ณ  base64 ๋ฐ์ดํ„ฐ๋ฅผ ๋ฉ”์‹œ์ง€๋กœ ๋‹ค์‹œ ๋ณด๋‚ด์•ผ ํ–ˆ์Šต๋‹ˆ๋‹ค. ์™œ๋ƒํ•˜๋ฉด ๋‹ค์Œ์„ ์ˆ˜ํ–‰ํ•˜๋ฉด ์ฐฝ ํฌ๊ธฐ ์กฐ์ • ์ด๋ฒคํŠธ๊ฐ€ ์ค‘๋‹จ๋˜๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.

๋‹ค์‹œ ๋Œ“๊ธ€๋กœ:

   //store the original size
    var h = $(element)[0].ownerDocument.defaultView.innerHeight;
    var w = $(element)[0].ownerDocument.defaultView.innerWidth;

   //set the document to the element's size
    $(element)[0].ownerDocument.defaultView.innerHeight = $(element).height();
    $(element)[0].ownerDocument.defaultView.innerWidth = $(element).width();

    html2canvas($(element)).then(function(canvas) {
        //restore the document size
        $(element)[0].ownerDocument.defaultView.innerHeight = h;
        $(element)[0].ownerDocument.defaultView.innerWidth = w;
        //Do whatever you want with your canvas
    }

html2canvas๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ HTML ์š”์†Œ์—์„œ ๋” ๋†’์€ DPI ์Šคํฌ๋ฆฐ์ƒท์„ ์‰ฝ๊ฒŒ ์–ป๊ธฐ ์œ„ํ•ด ๋‹ค์Œ ํ•จ์ˆ˜๋ฅผ ์ž‘์„ฑํ–ˆ์Šต๋‹ˆ๋‹ค.

  • ๋†’์ด ๋˜๋Š” ๋„ˆ๋น„๊ฐ€ ์ œํ•œ๋œ ๊ฒฝ์šฐ(์˜ˆ: ๊ณ ์ •๋œ ๋ณธ๋ฌธ ๋„ˆ๋น„๊ฐ€ ์žˆ๋Š” ๊ฒฝ์šฐ) ์ฒ˜๋ฆฌ ์ค‘์— ์ œ์•ฝ์„ ์ œ๊ฑฐํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์†Œ์Šค ์š”์†Œ๋Š” ์›ํ•˜๋Š” ํฌ๊ธฐ๊นŒ์ง€ ์„ฑ์žฅํ•  ์ˆ˜ ์žˆ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
  • srcEl ๋Š” ๊ธฐ์กด ์š”์†Œ์—ฌ์•ผ ํ•ฉ๋‹ˆ๋‹ค.
  • destIMG ๋Š” ๊ธฐ์กด(๋นˆ) ์ด๋ฏธ์ง€ ์š”์†Œ์—ฌ์•ผ ํ•ฉ๋‹ˆ๋‹ค.
  • dpi ๋Š” 96์˜ ๋ฐฐ์ˆ˜์—ฌ์•ผ ํ•ฉ๋‹ˆ๋‹ค.
var makeHighResScreenshot = function(srcEl, destIMG, dpi) {
    var scaleFactor = Math.floor(dpi / 96);
    // Save original size of element
    var originalWidth = srcEl.offsetWidth;
    var originalHeight = srcEl.offsetHeight;
    // Save original document size
    var originalBodyWidth = document.body.offsetWidth;
    var originalBodyHeight = document.body.offsetHeight;

    // Add style: transform: scale() to srcEl
    srcEl.style.transform = "scale(" + scaleFactor + ", " + scaleFactor + ")";
    srcEl.style.transformOrigin = "left top";

    // create wrapper for srcEl to add hardcoded height/width
    var srcElWrapper = document.createElement('div');
    srcElWrapper.id = srcEl.id + '-wrapper';
    srcElWrapper.style.height = originalHeight*scaleFactor + 'px';
    srcElWrapper.style.width = originalWidth*scaleFactor + 'px';
    // insert wrapper before srcEl in the DOM tree
    srcEl.parentNode.insertBefore(srcElWrapper, srcEl);
    // move srcEl into wrapper
    srcElWrapper.appendChild(srcEl);

    // Temporarily remove height/width constraints as necessary
    document.body.style.width = originalBodyWidth*scaleFactor +"px";
    document.body.style.height = originalBodyHeight*scaleFactor +"px";

    window.scrollTo(0, 0); // html2canvas breaks when we're not at the top of the doc, see html2canvas#820
    html2canvas(srcElWrapper, {
        onrendered: function(canvas) {
            destIMG.src = canvas.toDataURL("image/png");
            srcElWrapper.style.display = "none";
            // Reset height/width constraints
            document.body.style.width = originalBodyWidth + "px";
            document.body.style.height = originalBodyHeight + "px";
        }
    });
};

์šฉ๋ฒ•:

var src = document.getElementById("screenshot-source");
var img = document.getElementById("screenshot-img");
makeHighResScreenshot(src, img, 192); // DPI of 192 is 4x resolution (2x normal DPI for both width and height)

์ด๋ ‡๊ฒŒ ํ•˜๋ฉด window.onresize ์ด๋ฒคํŠธ ํ•ธ๋“ค๋Ÿฌ๋„ ์ค‘๋‹จ๋œ๋‹ค๋Š” ์‚ฌ์‹ค์„ ์•Œ์•˜์Šต๋‹ˆ๊นŒ? ์ด๋Ÿฌํ•œ ์ด์œ ๋กœ iframe ๋‚ด์—์„œ ์ด ๋ชจ๋“  ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๊ณ  ๋‚ด์šฉ์„ ๋ฐ˜ํ™˜ํ•˜๊ธฐ ์œ„ํ•ด parent.window.postMessage(data)๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๊ฒฐ๊ณผ๋ฅผ ๋‹ค์‹œ ๊ฒŒ์‹œํ•ด์•ผ ํ–ˆ์Šต๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ๋ชจ๋ฐ”์ผ ์•ฑ์ด๊ธฐ ๋•Œ๋ฌธ์— ๋‚˜์—๊ฒŒ๋งŒ ์ค‘์š”ํ•˜๋ฉฐ onsize fire๋ฅผ ๊ฐ–๋Š” ๊ฒƒ์ด ์ค‘์š”ํ•ฉ๋‹ˆ๋‹ค.

@vance : ์ œ ๊ฒฝ์šฐ์—๋Š” ๊ทธ๋Ÿฐ ๊ฒƒ๋“ค์ด ํ•„์š”ํ•˜๊ฑฐ๋‚˜ ์‚ฌ์šฉํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์‹ค์ œ๋กœ HTML-to-PDF ๋ Œ๋”๋Ÿฌ์˜ ๋ฒ„๊ทธ๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด ์ด๊ฒƒ์„ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ๊ท€ํ•˜์˜ ๋ฐฉ๋ฒ•์— ๋Œ€ํ•œ ์ „์ฒด ์˜ˆ๋ฅผ ๋ณด๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค. ๋” ์œ ์—ฐํ•ด ๋ณด์ž…๋‹ˆ๋‹ค.

๋ชธ์˜ ํฌ๊ธฐ๋ฅผ ์กฐ์ •ํ•  ํ•„์š”๊ฐ€ ์—†๋Š” ๊ณ ํ•ด์ƒ๋„ ์ด๋ฏธ์ง€๋ฅผ ์–ป๋Š” ๋‹ค๋ฅธ ๋ฐฉ๋ฒ•์„ ์ฐพ์•˜์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ html2canvas์˜ ๋ฒ„๊ทธ(#790, #820, #893, #922 ๋“ฑ)๋กœ ์ธํ•ด ์†Œ์Šค ์š”์†Œ์˜ ์œ„์น˜๋ฅผ โ€‹โ€‹์ ˆ๋Œ€์ ์œผ๋กœ ์ง€์ •ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. @MisterLamb ์˜ ๋ ˆํ‹ฐ๋‚˜ ์ฝ”๋“œ๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ

function takeHighResScreenshot(srcEl, destIMG, scaleFactor) {
    // Save original size of element
    var originalWidth = srcEl.offsetWidth;
    var originalHeight = srcEl.offsetHeight;
    // Force px size (no %, EMs, etc)
    srcEl.style.width = originalWidth + "px";
    srcEl.style.height = originalHeight + "px";

    // Position the element at the top left of the document because of bugs in html2canvas. The bug exists when supplying a custom canvas, and offsets the rendering on the custom canvas based on the offset of the source element on the page; thus the source element MUST be at 0, 0.
    // See html2canvas issues #790, #820, #893, #922
    srcEl.style.position = "absolute";
    srcEl.style.top = "0";
    srcEl.style.left = "0";

    // Create scaled canvas
    var scaledCanvas = document.createElement("canvas");
    scaledCanvas.width = originalWidth * scaleFactor;
    scaledCanvas.height = originalHeight * scaleFactor;
    scaledCanvas.style.width = originalWidth + "px";
    scaledCanvas.style.height = originalHeight + "px";
    var scaledContext = scaledCanvas.getContext("2d");
    scaledContext.scale(scaleFactor, scaleFactor);

    html2canvas(srcEl, { canvas: scaledCanvas })
    .then(function(canvas) {
        destIMG.src = canvas.toDataURL("image/png");
        srcEl.style.display = "none";
    });
};

์šฉ๋ฒ•:

var src = document.getElementById("screenshot-src");
var img = document.getElementById("screenshot-img");
takeHighResScreenshot(src, img, 2); // This time we provide desired scale factor directly, no more messing with DPI

ํŽธ์ง‘: ์ œ์•ˆ์— ๋Œ€ํ•œ @jason-o-matic ๋•๋ถ„์— ์‹ค์ œ๋กœ ์š”์†Œ๋ฅผ ์ด๋™ํ•˜๊ณ  ์—ฌ๋ฐฑ์„ ์กฐ์ •ํ•˜๋Š” ๋Œ€์‹  ์ ˆ๋Œ€ ์œ„์น˜๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํ•ดํ‚น์„ ์ค„์˜€์Šต๋‹ˆ๋‹ค.

์ด๊ฒƒ์€ ์ตœ์‹  ๋ฒ„์ „(0.5.0-alpha)์—์„œ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ 0.4.1์ด ์•„๋‹™๋‹ˆ๋‹ค.

0.4.1์—์„œ ์ด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๋ ค๋ฉด ์บ”๋ฒ„์Šค ํฌ๊ธฐ๋ฅผ ๊ฐ€์ง€๊ณ  ๋†€์•„์•ผ ํ•ฉ๋‹ˆ๋‹ค.

@airdrummingfool ์˜ ์ˆ˜์ • ์‚ฌํ•ญ(ํ›Œ๋ฅญํ•˜๊ฒŒ ์ž‘๋™ํ•จ)์„ ์‚ฌ์šฉํ•˜๋Š” ์‚ฌ๋žŒ์„ ์œ„ํ•œ ๊ฐ„๋‹จํ•œ ๋ฉ”๋ชจ...

xtree๊ฐ€ ์–ผ๋งˆ๋‚˜ ๋ฉ€๋ฆฌ ์žˆ๋Š”์ง€์— ์ƒ๊ด€์—†์ด ์Šคํฌ๋ฆฐ ๋คํ”„ํ•˜๋ ค๋Š” ์š”์†Œ๋ฅผ ๋ž˜ํ•‘ํ•˜๋Š” "์ƒ๋Œ€์ " ์š”์†Œ๋ฅผ ๊ฐ€์งˆ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ํ™”๋ฉด ๋คํ”„ ๊ธฐ๊ฐ„ ๋™์•ˆ ์ •์ ์œผ๋กœ ์ „ํ™˜ํ•ด์•ผ ์›ํ•˜๋Š” ์š”์†Œ๊ฐ€ ์‹ค์ œ๋กœ ์ฃผ๋ณ€ DIV๊ฐ€ ์•„๋‹Œ ์ฐฝ์„ ๊ธฐ์ค€์œผ๋กœ 0,0์— ๋‚˜ํƒ€๋‚ฉ๋‹ˆ๋‹ค.

์ด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๋Š” ๋ฐ ๋ช‡ ์‹œ๊ฐ„์ด ๊ฑธ๋ ธ์œผ๋ฏ€๋กœ ์ด๊ฒƒ์ด ๋ˆ„๊ตฐ๊ฐ€๊ฐ€ ๊ฐ™์€ ๋ฌธ์ œ๋ฅผ ํ”ผํ•˜๋Š” ๋ฐ ๋„์›€์ด ๋˜๊ธฐ๋ฅผ ๋ฐ”๋ž๋‹ˆ๋‹ค.

์ข‹์€ ์˜คํ›„์ž…๋‹ˆ๋‹ค ์—ฌ๋Ÿฌ๋ถ„,
์•„๋ฌด๋„ @airdrummingfool ์†”๋ฃจ์…˜์˜ jsfiddle์„ ๊ฐ€์ง€๊ณ  ์žˆ์Šต๋‹ˆ๊นŒ? ์šด์ด ์—†์œผ๋ฉด ๋‚ด ํ”„๋กœ์ ํŠธ์—์„œ ๊ตฌํ˜„ํ•˜๋ ค๊ณ ํ•ฉ๋‹ˆ๋‹ค. ์‹ค์ œ ์˜ˆ์ œ๋Š” ์ด๊ฒƒ์ด ์–ด๋–ป๊ฒŒ ์ž‘๋™ํ•˜๋Š”์ง€ ์ดํ•ดํ•˜๋Š” ๋ฐ ํฐ ๋„์›€์ด ๋  ๊ฒƒ์ด๋ฉฐ ๋‚ด ํ”„๋กœ์ ํŠธ์—์„œ ์ด๋ฅผ ๊ตฌํ˜„ํ•˜๋Š” ๋ฐ ํฐ ๋„์›€์ด ๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์ œ๊ณตํ•  ์ˆ˜ ์žˆ๋Š” ๋ชจ๋“  ์ง€์›์— ๋Œ€ํ•ด ๋Œ€๋‹จํžˆ ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค.

์•ˆ๋…•ํ•˜์„ธ์š” ์—ฌ๋Ÿฌ๋ถ„! @airdrummingfool ์†”๋ฃจ์…˜์„ ์‚ฌ์šฉํ•˜๋ ค๊ณ ํ•ฉ๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ์งœ์ฆ๋‚˜๋Š” ์˜ค๋ฅ˜๊ฐ€ ํ•˜๋‚˜ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค. ์ด๋ฏธ์ง€๋ฅผ ๊ฐ€์ ธ์˜ค๋ ค๋Š” ์š”์†Œ ๋‚ด๋ถ€์—๋Š” ์š”์†Œ์™€ ์ ˆ์ฐจ๋ฅผ ์ˆ˜ํ–‰ํ•  ๋•Œ img ์š”์†Œ๋Š” ๊ณต๋ฐฑ์ด ๋˜๊ณ  src๋Š” ๋ฌด์‹œ๋ฉ๋‹ˆ๋‹ค. ์ด ๋ฌธ์ œ๋ฅผ ์–ด๋–ป๊ฒŒ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ๋Š”์ง€ ์•„์‹ญ๋‹ˆ๊นŒ? ๋ˆ„๊ตฌ๋“ ์ง€ html2canvas์—์„œ ์ด ๋ฌธ์ œ์— ์ง๋ฉดํ•œ ์ ์ด ์žˆ์Šต๋‹ˆ๊นŒ?

์ด ์Šค๋ ˆ๋“œ์— ๋ฏธ๋ฆฌ ๊ฐ์‚ฌ๋“œ๋ฆฝ๋‹ˆ๋‹ค! ๋‚  ๊ตฌํ•˜๊ณ  ์žˆ์–ด!! :NS

ํŽธ์ง‘: ๋˜ํ•œ ๋ Œ๋”๋ง๋œ ์ด๋ฏธ์ง€์˜ ์ ˆ๋ฐ˜๋งŒ ์–ป๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ํ•ด์ƒ๋„๋Š” ์™„๋ฒฝํ•ด ๋ณด์ž…๋‹ˆ๋‹ค xD

์ด๋ฏธ์ง€๋ฌธ์ œ ์ˆ˜์ •!! useCORS๊ฐ€ ํ™œ์„ฑํ™”๋˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค! ํ•˜์ง€๋งŒ ์—ฌ์ „ํžˆ ๋ Œ๋”๋ง๋œ ์ด๋ฏธ์ง€์˜ ์ ˆ๋ฐ˜๋งŒ ๋ฐ›๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

์—„์ฒญ๋‚œ! ์ ˆ๋ฐ˜ ์ด๋ฏธ์ง€๋Š” ์บ”๋ฒ„์Šค ์™ธ ๋ Œ๋”๋ง ๋ฌธ์ œ ๋กœ ์ธํ•œ ๊ฒƒ์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋˜ํ•œ html2canvas์— ํ•ด์ƒ๋„/ํฌ๊ธฐ ์กฐ์ • ์„ @airdrummingfool ์†”๋ฃจ์…˜๋ณด๋‹ค ์‚ฌ์šฉํ•˜๊ธฐ๊ฐ€ ๋” ์‰ฝ์Šต๋‹ˆ๋‹ค.

๊ทธ๊ฒƒ๋“ค์ด html2canvas์— ๋ณ‘ํ•ฉ๋  ๋•Œ๊นŒ์ง€ ์—ฌ๊ธฐ์—์„œ ์ด ๋‘ ๊ฐ€์ง€์™€ ๋ช‡ ๊ฐ€์ง€ ๋‹ค๋ฅธ ๋ฒ„๊ทธ ์ˆ˜์ •์œผ๋กœ ๋‚ด ์‚ฌ์šฉ์ž ์ •์˜ ๋นŒ๋“œ๋ฅผ ์–ป์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค .

์•ˆ๋…•ํ•˜์„ธ์š” @eKoopmans์ž…๋‹ˆ๋‹ค. ๋‹ต๋ณ€ํ•ด ์ฃผ์…”์„œ ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค. ๋ฐฉ๊ธˆ ๋†’์ด์— 2๋ฅผ ๊ณฑํ•˜์—ฌ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ–ˆ์Šต๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ์œ„์™€ ์•„๋ž˜์— ๊ณต๋ฐฑ์ด ์žˆ๋Š” ๋” ํฐ ์ด๋ฏธ์ง€๋ฅผ ์–ป์€ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค... ๊ทธ๋ž˜์„œ... ๊ท€ํ•˜์˜ ์ด๋ฏธ์ง€๋ฅผ ์‹œ๋„ํ•˜๊ณ  ๋ช‡ ๋ถ„ ํ›„์— ๋‹ค์‹œ ๋ณด๊ณ ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค. !

OM(F)G @eKoopmans .. ๋‹น์‹ ์˜ ๊ฒƒ์€ ์ฆ‰์‹œ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค. ๊ณ ๋งˆ์›Œ์š”. ๊ทธ ํ’€ ๋ฆฌํ€˜์ŠคํŠธ... ์ง€๊ธˆ ์ˆ˜๋ฝํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. html2canvas์— ์ด dpi ์˜ต์…˜์„ ์›ํ•˜๋Š” ์‚ฌ๋žŒ๋“ค์ด ๋งŽ์ด ์žˆ์Šต๋‹ˆ๋‹ค.

#1087 ์ฐฌ์„ฑ์œผ๋กœ ๋งˆ๊ฐ

@airdrummingfool ... ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค. ์™„๋ฒฝํ•˜๊ฒŒ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค.

https://github.com/cburgmer/rasterizeHTML.js ๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ตœ์‹  ๋ฒ„์ „์˜ html2canvas๋Š” ํฌ๊ธฐ ์กฐ์ • ์˜ต์…˜์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. ์ •๋ง ์ž˜ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค.

html2canvas(์š”์†Œ, {
๊ทœ๋ชจ: 2
});

html ๋ฐ ์ด๋ฏธ์ง€ ์ฝ˜ํ…์ธ ์—์„œ ์—ฌ๋Ÿฌ ํŽ˜์ด์ง€ pdf ๋ Œ๋”๋ง์˜ ๊ฒฝ์šฐ scale: 1 ์„ค์ •ํ•˜๋ฉด ํ•ด์ƒ๋„ ๋ฌธ์ œ๊ฐ€ ํ•ด๊ฒฐ๋˜๊ณ  ๋™์‹œ์— ์ด๋ฏธ์ง€๊ฐ€ pdf ํ…Œ๋‘๋ฆฌ๋ฅผ ์ดˆ๊ณผํ•˜๋Š” ๊ฒƒ์„ ๋ฐฉ์ง€ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋‚˜๋Š” ์ด๊ฒƒ์ด ๋„์›€์ด๋œ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ๋‚˜๋Š” html2canvas๋ฅผ ์‚ฌ์šฉํ–ˆ์Šต๋‹ˆ๋‹ค.

๋‹ค์šด๋กœ๋“œpdf() {
var ๋ฌธ์„œ = ์ƒˆ๋กœ์šด jsPDF({
ํ˜•์‹: "a4"
});

html2canvas(document.getElementById("pdf-doc"), {
๊ทœ๋ชจ: "5"
}).then(์บ”๋ฒ„์Šค => {
this.imgFile = ์บ”๋ฒ„์Šค;
doc.addImage(this.imgFile, "JPEG", 5, 5, 200, 285);
doc.save("ํŒŒ์ผ๋ช…" + ".pdf");
});
}

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