Html2canvas: SVG<img/> ๋ฐฉ๋Œ€ํ•˜๋‹ค

์— ๋งŒ๋“  2019๋…„ 04์›” 11์ผ  ยท  9์ฝ”๋ฉ˜ํŠธ  ยท  ์ถœ์ฒ˜: niklasvh/html2canvas

html2canvas ์˜ ์ตœ์‹ 
์ด์ „ ๋ฒ„์ „์€ ์ง€์›๋˜์ง€ ์•Š์œผ๋ฉฐ๋ณด๊ณ  ๋œ ๋ฌธ์ œ๋Š” ์ข…๊ฒฐ๋ฉ๋‹ˆ๋‹ค.

๋จผ์ € ์ผ๋ฐ˜์ ์ธ ๋ฌธ์ œ ํ•ด๊ฒฐ ๋‹จ๊ณ„๋ฅผ ๋”ฐ๋ฅด์‹ญ์‹œ์˜ค.

  • [x] ์ตœ์‹  ๋ฒ„์ „์„ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.
  • [x] ์ถ•์†Œ๋˜์ง€ ์•Š์€ html2canvas ๋ฒ„์ „์„ ์‚ฌ์šฉํ•˜์—ฌ ํ…Œ์ŠคํŠธ ์ค‘์ด๋ฉฐ ์ฝ˜์†”์—๋ณด๊ณ  ๋œ ์ž ์žฌ์  ๋ฌธ์ œ๋ฅผ ํ™•์ธํ–ˆ์Šต๋‹ˆ๋‹ค.

๋ฒ„๊ทธ ๋ณด๊ณ ์„œ :

<img src="... .svg"> ํ•˜๋ฉด svg๊ฐ€ ํฌ๊ฒŒ ๋‚ ์•„๊ฐ‘๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ "๋ฐ˜์‘ ํ˜•"svg ์ด๋ฏธ์ง€ (์‹ค์ œ ์ด๋ฏธ์ง€ ์ธ์ฝ”๋”ฉ์— ๋†’์ด๋‚˜ ๋„ˆ๋น„๊ฐ€ ์„ค์ •๋˜์ง€ ์•Š์€ ์ด๋ฏธ์ง€)์—์„œ๋งŒ ๋ฐœ์ƒํ•˜๋Š” ๊ฒƒ์œผ๋กœ ๋ณด์ž…๋‹ˆ๋‹ค. ์ด๋ฏธ์ง€์™€ contentBox๋Š” ์˜ฌ๋ฐ”๋ฅธ ํฌ๊ธฐ๋กœ ๋ Œ๋”๋ง๋˜์ง€๋งŒ ์บ”๋ฒ„์Šค์— ๊ทธ๋ฆด ๋•Œ ์ด๋ฏธ์ง€๋Š” ๋ทฐํฌํŠธ ๋†’์ด๋ฅผ ์ฑ„ํƒํ•ฉ๋‹ˆ๋‹ค.

์—ฌ๊ธฐ ๋ฐ”์ด์˜ฌ๋ฆฐ์ด ์žˆ์Šต๋‹ˆ๋‹ค : http://jsfiddle.net/1b4mLnfj/2/

screencapture-html2canvas-hertzen-2019-04-10-22_39_56
screencapture-html2canvas-hertzen-2019-04-10-22_40_16

๋ช…์„ธ์„œ:

  • ํ…Œ์ŠคํŠธ ๋œ html2canvas ๋ฒ„์ „ : 1.0.0-rc.1 / 1.0.0-rc.0
  • ๋ธŒ๋ผ์šฐ์ € ๋ฐ ๋ฒ„์ „ : Chrome 73 / Opera 58
  • ์šด์˜ ์ฒด์ œ : OS X
Bug Unverified

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

๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค. ์กฐ์‚ฌํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.

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

๋‚˜๋Š” ์ด๊ฒƒ์„ ๋ถ„๋ช…ํžˆํ•˜๊ธฐ๋ฅผ ํฌ๋งํ•˜๋Š” Fiddle์„ ์ฒจ๋ถ€ํ–ˆ๋‹ค : http://jsfiddle.net/1b4mLnfj/2/

๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค. ์กฐ์‚ฌํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.

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

์ž์„ธํžˆ ์กฐ์‚ฌํ•œ ๊ฒฐ๊ณผ, ์ด๊ฒƒ์€ "๋ฐ˜์‘ ํ˜•"์ธ svg ์ด๋ฏธ์ง€์—์„œ๋งŒ ๋ฐœ์ƒํ•˜๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. Illustrator์—์„œ svg๋ฅผ ์—ด๊ณ  ๋ฐ˜์‘ ํ˜• ์˜ต์…˜์„ ์„ ํƒํ•˜์ง€ ์•Š๊ณ  ์ €์žฅํ•˜๋ฉด ํฌ๊ธฐ๊ฐ€ ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ์กฐ์ •๋ฉ๋‹ˆ๋‹ค. ๊ธฐ๋ณธ์ ์œผ๋กœ svg๊ฐ€ ๊ทธ๋ ‡์ง€ ์•Š์€ ๊ฒฝ์šฐ ์—ฌ๊ธฐ์— ๋†’์ด์™€ ๋„ˆ๋น„๊ฐ€ ์ธ์ฝ”๋”ฉ ๋œ ๊ฒฝ์šฐ (Illustrator์—์„œ "๋ฐ˜์‘ ํ˜•"์ด๋ผ๊ณ  ํ•จ) ๋ทฐํฌํŠธ์˜ ํฌ๊ธฐ๋ฅผ ์ฑ„ํƒํ•ฉ๋‹ˆ๋‹ค.

๋”ฐ๋ผ์„œ ํ•œ ๊ฐ€์ง€ ์ž ์žฌ์  ์ธ ํ•ด๊ฒฐ์ฑ…์€ svg-inject (https://github.com/iconfu/svg-inject)์™€ ๊ฐ™์€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ <img> ์„ ์‹ค์ œ <svg> ๋กœ ๋ฐ”๊พธ๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์—์„œ <img> ๋†’์ด์™€ ๋„ˆ๋น„๋ฅผ ์ ์šฉํ•˜๋ฉด ์‚ฝ์ž… ๋  ๋•Œ <svg> ์ฑ„ํƒ๋˜์–ด ์บ”๋ฒ„์Šค์—์„œ ํฌ๊ธฐ ์กฐ์ •์„ ๋ฐฉ์ง€ํ•ฉ๋‹ˆ๋‹ค.

์—ฌ๊ธฐ์—๋Š” ๋ช‡ ๊ฐ€์ง€ ๋‹จ์ ์ด ์žˆ์Šต๋‹ˆ๋‹ค (์˜ˆ : ์ธ์ฝ”๋”ฉ ๋œ base64 src๋ฅผ ์‚ฌ์šฉํ•˜๊ฑฐ๋‚˜ ๋™์ผํ•œ ๊ตฌ์กฐ ๋ฐ ์ธ๋ผ์ธ ํด๋ž˜์Šค ์Šคํƒ€์ผ์„ ๊ฐ€์ง„ ์—ฌ๋Ÿฌ svg๊ฐ€์žˆ๋Š” ๊ฒฝ์šฐ). ๋‚˜๋Š” ์ด๊ฒƒ์„ ๋ฉฐ์น  ๋™์•ˆ ๊พธ์ค€ํžˆ ์ž‘์—… ํ•ด ์™”์œผ๋ฉฐ ์ด๊ฒƒ์ด ์ง€๊ธˆ๊นŒ์ง€ ๋‚ด๊ฐ€ ๊ฐ€์ง„ ์ตœ๊ณ ์˜ ์†”๋ฃจ์…˜์ž…๋‹ˆ๋‹ค. SVG์— ์ธ์ฝ”๋”ฉ ๋œ ๋†’์ด / ๋„ˆ๋น„ ๊ฐ’์ด์—†๋Š” ๊ฒฝ์šฐ ์บ”๋ฒ„์Šค์—์„œ svg ์ด๋ฏธ์ง€์˜ ํฌ๊ธฐ๋ฅผ ์กฐ์ •ํ•˜์ง€ ๋ชปํ•˜๊ฒŒํ•˜๋Š” ์‹ค์ œ html2canvas ์ฝ”๋“œ๋ฅผ ์ฐพ์„ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

๊ทธ๋ž˜์„œ ๋‚˜๋Š” ์ด๊ฒƒ์— ์ˆ˜๊ฑด์„ ๋˜์ง€๊ณ  ์žˆ์ง€๋งŒ SVG๊ฐ€ ์บ”๋ฒ„์Šค์— ๋ Œ๋”๋ง / ๊ทธ๋ ค์ง€๋Š” ๋ฐฉ๋ฒ•๊ณผ ๊ด€๋ จ๋œ ์†”๋ฃจ์…˜์— ๋„๋‹ฌํ–ˆ์Šต๋‹ˆ๋‹ค. ํŠนํžˆ renderNodeContent ์—์„œ ์ด๋ฏธ์ง€๊ฐ€ svg์ด๊ณ  ์ธ์ฝ”๋”ฉ ๋œ ๋†’์ด / ๋„ˆ๋น„ (๋ฐ˜์‘ ํ˜•)๊ฐ€ ๋ˆ„๋ฝ ๋œ ์ด๋ฏธ์ง€์ธ์ง€ ํ™•์ธํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์•Œ์•„๋‚ผ ์ˆ˜ ์žˆ๋‹ค๋ฉด ๋ทฐํฌํŠธ ( width = viewport.width, height = (image.height * viewport.width) / image.width)) ์ด๋ก ์ ์œผ๋กœ ์ด๊ฒƒ์€ ์ž‘๋™ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. svg ์ด๋ฏธ์ง€์— ํ•ด๋‹น ๋†’์ด ๋ฐ ๋„ˆ๋น„ ๊ฐ’์ด ์—†๋Š”์ง€ ํ™•์ธํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์ž˜ ๋ชจ๋ฅด๊ฒ ์Šต๋‹ˆ๋‹ค.

์—ฌ๊ธฐ์— ์—…๋ฐ์ดํŠธ๊ฐ€ ์žˆ์Šต๋‹ˆ๊นŒ?

๋‚˜๋Š” ๋ฌธ์ œ์— ๋Œ€ํ•œ ์ž‘์—…์„ ์ค‘๋‹จํ–ˆ์ง€๋งŒ ์œ„์˜ ์˜๊ฒฌ์ด ๋„์›€์ด ๋  ์ˆ˜ ์žˆ๊ธฐ๋ฅผ ๋ฐ”๋ž๋‹ˆ๋‹ค.

์•ˆ๋…• ๋‚˜๋Š” ๊ฐ™์€ ๋ฌธ์ œ๊ฐ€ ์žˆ์—ˆ๋‹ค.
๋‚ด ์ด๋ฏธ์ง€ ํƒœ๊ทธ์— style='transition: transform 0.6s;' ์Šคํƒ€์ผ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๊ฒƒ์ด ์—†์œผ๋ฉด ์ด๋ฏธ์ง€๊ฐ€ ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ๋ Œ๋”๋ง๋ฉ๋‹ˆ๋‹ค.

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