<p>html2canvas: ๋ณต์ œ๋œ ๋ฌธ์„œ์—์„œ DIV๋ฅผ ์ฐพ๋Š” ๋™์•ˆ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ–ˆ์Šต๋‹ˆ๋‹ค.</p>

์— ๋งŒ๋“  2018๋…„ 01์›” 24์ผ  ยท  12์ฝ”๋ฉ˜ํŠธ  ยท  ์ถœ์ฒ˜: niklasvh/html2canvas

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

html2canvas์— ์ „๋‹ฌํ•˜๊ธฐ ์ „์— HTMLElement์—์„œ element.cloneNode(true) ๋˜๋Š” angular.copy(element)๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์ด ์˜ค๋ฅ˜๊ฐ€ ๋ฐ˜ํ™˜๋ฉ๋‹ˆ๋‹ค.

html2canvas: ๋ณต์ œ๋œ ๋ฌธ์„œ์—์„œ DIV๋ฅผ ์ฐพ๋Š” ๋™์•ˆ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ–ˆ์Šต๋‹ˆ๋‹ค.
์žกํžˆ์ง€ ์•Š์Œ(์•ฝ์†) ๋ณต์ œ๋œ ๋ฌธ์„œ์—์„œ DIV๋ฅผ ์ฐพ๋Š” ๋™์•ˆ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ–ˆ์Šต๋‹ˆ๋‹ค.

๋ช…์„ธ์„œ:

  • html2canvas ๋ฒ„์ „ ํ…Œ์ŠคํŠธ: 1.0.0-alpha.9"
  • ๋ธŒ๋ผ์šฐ์ € ๋ฐ ๋ฒ„์ „: Chrome 63.0.3239.132
  • ์šด์˜ ์ฒด์ œ: ๋งฅ

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

์ด์ œ ํ•ด๊ฒฐ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.
dom์„ ๋ฉ”๋ชจ๋ฆฌ์˜ ๊ฐ์ฒด๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ๋ Œ๋”๋ง์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.
์ถ”๊ฐ€ document.getElementsByTagName('BODY')[0].append(mainDom); ๋‚ด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ–ˆ์Šต๋‹ˆ๋‹ค.

html2canvas๊ฐ€ ์ฒ˜๋ฆฌ๋˜๋ฉด mainDom ์ œ๊ฑฐ๋ฅผ ์ฒ˜๋ฆฌํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

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

์บ”๋ฒ„์Šค๋ฅผ ๋กœ์ปฌ ์ €์žฅ์†Œ์— ์ €์žฅํ•˜๊ณ  React.js๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋‹ค๋ฅธ ํŽ˜์ด์ง€์— ์—ฐ๊ฒฐํ•˜๋ ค๊ณ  ํ•  ๋•Œ๋„ ๋™์ผํ•œ ๋ฌธ์ œ

<Link to="/system">
            <button className="submitButton"  onClick={this.captureMap} >SUBMIT </button>
</Link>

   captureMap(){
      html2canvas(document.querySelector(".mapboxgl-canvas")).then(canvas => {
        // document.body.appendChild(canvas);
        var image = canvas;
        if(typeof localStorage !== "undefined"){
          localStorage.setItem('mapImg',image.toDataURL());
        }
      });
    }

๊ฐ™์€ ๋ฌธ์ œ์— ์ง๋ฉด
const mainDom = document.createElement('div');
mainDom.appendChild(domElem[0].cloneNode(true)); // domElem์€ ์ผ๋ถ€ dom ๊ฐ์ฒด์ž…๋‹ˆ๋‹ค.

mainDom์„ html2canvas์— ์ „๋‹ฌํ•˜๋ฉด ์•„๋ž˜ ์˜ค๋ฅ˜๊ฐ€ ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค.

html2canvas: ๋ณต์ œ๋œ ๋ฌธ์„œ์—์„œ DIV๋ฅผ ์ฐพ๋Š” ๋™์•ˆ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ–ˆ์Šต๋‹ˆ๋‹ค.
demo.html#/Demo/ Widget:1 ์žกํžˆ์ง€ ์•Š์Œ(์•ฝ์†) ๋ณต์ œ๋œ ๋ฌธ์„œ์—์„œ DIV๋ฅผ ์ฐพ๋Š” ๋™์•ˆ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ–ˆ์Šต๋‹ˆ๋‹ค.

@HarishSonar jsfiddle ์—์„œ ๋ฌธ์ œ๋ฅผ ๋ณต์ œํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ?

์ด์ œ ํ•ด๊ฒฐ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.
dom์„ ๋ฉ”๋ชจ๋ฆฌ์˜ ๊ฐ์ฒด๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ๋ Œ๋”๋ง์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.
์ถ”๊ฐ€ document.getElementsByTagName('BODY')[0].append(mainDom); ๋‚ด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ–ˆ์Šต๋‹ˆ๋‹ค.

html2canvas๊ฐ€ ์ฒ˜๋ฆฌ๋˜๋ฉด mainDom ์ œ๊ฑฐ๋ฅผ ์ฒ˜๋ฆฌํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

๋ฏธ๋ž˜์˜ ๋ฐฉ๋ฌธ์ž๋ฅผ ์œ„ํ•ด ์ €๋„ ๊ฐ™์€ ๋ฌธ์ œ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

๋‚˜๋Š” DOM ๋…ธ๋“œ๋ฅผ ๋ณต์ œํ•˜์—ฌ document.body ์˜ ์ฒซ ๋ฒˆ์งธ ์ž์‹์œผ๋กœ ์‚ฝ์ž…ํ•˜๊ณ  CSS ์Šคํƒ€์ผ position: absolute; top: -16384px; width: ${originalElementWidth} ์‚ฌ์šฉํ•˜์—ฌ ๋๋‚ด์—ˆ์Šต๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ์Šคํฌ๋ฆฐ์ƒท์œผ๋กœ ์บก์ฒ˜ํ•˜๊ธฐ ์ „์— DOM ๋…ธ๋“œ๋ฅผ ๋ณ€๊ฒฝํ•ด์•ผ ํ•˜๋Š” ๊ฒฝ์šฐ์— ์œ ์šฉํ•ฉ๋‹ˆ๋‹ค.

๋˜ํ•œ @niklasvh , ์—ฌ์ „ํžˆ ์‚ดํŽด๋ณด๊ณ  ์‹ถ๋‹ค๋ฉด jsfiddle์ด ์žˆ์Šต๋‹ˆ๋‹ค. https://jsfiddle.net/bLwya8sf/1/

์•ˆ๋…•ํ•˜์„ธ์š”, ์ €๋„์ด ๋ฌธ์ œ๋ฅผ ๋งŒ๋‚ฌ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  html2canvas ํ•จ์ˆ˜๋ฅผ ํŠธ๋ฆฌ๊ฑฐํ•˜๋ฉด ๋‚ด ํ”„๋กœ์ ํŠธ์˜ ๋ชจ๋“  ์š”์ฒญ์ด ์ „์†ก๋ฉ๋‹ˆ๋‹ค. ํ•ด๊ฒฐ์ฑ…์„ ์•Œ๋ ค์ฃผ์‹œ๊ฒ ์Šต๋‹ˆ๊นŒ? ์ •๋ง ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ๋‚ด ์ฝ”๋“œ์ž…๋‹ˆ๋‹ค.
๊ณต๊ฐœ ๋‹ค์šดBtn(){
var targetDom = document.querySelector('#Box');
var copyDom = targetDom.cloneNode(true);
document.body.appendChild(copyDom);
html2canvas(copyDom).then(์บ”๋ฒ„์Šค => {
var imgData = ์บ”๋ฒ„์Šค.toDataURL('์ด๋ฏธ์ง€/jpeg');
var img = ์ƒˆ๋กœ์šด ์ด๋ฏธ์ง€();
img.src = imgData;
img.onload = ํ•จ์ˆ˜() {
pdf.addImage(imgData, 'jpeg', 0, 0, this.width * 0.225, this.height * 0.225);
pdf.save('pdf_2.pdf');
};
copyDom.remove();
});

๋™์ผํ•œ ๋ฌธ์ œ: ์ด ๋ฌธ์ œ๋ฅผ ํ”ผํ•˜๊ธฐ ์œ„ํ•ด SVG๋ฅผ div๋กœ ๋ž˜ํ•‘ํ•ด์•ผ ํ–ˆ์Šต๋‹ˆ๋‹ค...

๋™์ผํ•œ ๋ฌธ์ œ: ์ด ๋ฌธ์ œ๋ฅผ ํ”ผํ•˜๊ธฐ ์œ„ํ•ด SVG๋ฅผ div๋กœ ๋ž˜ํ•‘ํ•ด์•ผ ํ–ˆ์Šต๋‹ˆ๋‹ค...

์–ด๋–ป๊ฒŒ ํ•˜๋ฉด ์ข‹์„๊นŒ?

์ด์ œ ํ•ด๊ฒฐ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.
dom์„ ๋ฉ”๋ชจ๋ฆฌ์˜ ๊ฐ์ฒด๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ๋ Œ๋”๋ง์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.
์ถ”๊ฐ€ document.getElementsByTagName('BODY')[0].append(mainDom); ๋‚ด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ–ˆ์Šต๋‹ˆ๋‹ค.

html2canvas๊ฐ€ ์ฒ˜๋ฆฌ๋˜๋ฉด mainDom ์ œ๊ฑฐ๋ฅผ ์ฒ˜๋ฆฌํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

์˜ˆ, ๋ Œ๋”๋ง๋œ ์š”์†Œ๋กœ ์ž‘์—…ํ•ด์•ผ ํ•˜๋ฉฐ ๋ฉ”๋ชจ๋ฆฌ์˜ ๊ฐ์ฒด๋กœ dom์„ ์‚ฌ์šฉํ•ด์„œ๋Š” ์•ˆ ๋ฉ๋‹ˆ๋‹ค.

๋™์ผํ•œ ๋ฌธ์ œ: ์ด ๋ฌธ์ œ๋ฅผ ํ”ผํ•˜๊ธฐ ์œ„ํ•ด SVG๋ฅผ div๋กœ ๋ž˜ํ•‘ํ•ด์•ผ ํ–ˆ์Šต๋‹ˆ๋‹ค...

์–ด๋–ป๊ฒŒ ํ•˜๋ฉด ์ข‹์„๊นŒ?

ํ™•์‹ ํ•˜๋Š”!
์—ฌ๊ธฐ์—์„œ ์˜ˆ๋ฅผ ๋งŒ๋“ค์—ˆ์Šต๋‹ˆ๋‹ค.
๊ทธ๊ฒƒ์€ ์ธํ„ฐ๋„ท ์ต์Šคํ”Œ๋กœ๋Ÿฌ 11์„ ์ œ์™ธํ•œ ๋ชจ๋“  ๋ธŒ๋ผ์šฐ์ €์—์„œ ์ž˜ ์ž‘๋™ ๋‹ค์Œ html2canvas ์ ‘๊ทผ ๋ฐฉ์‹์€ ๋ชจ๋ฅด๋Š” ... ์ตœ์ข… PDF์—์„œ ์•„๋ฌด๊ฒƒ๋„ ๋ Œ๋”๋งํ•˜์ง€ ์•Š๋Š” ๊ฒฝ์šฐ html2canvas ๋ฌธ์ œ ๋˜๋Š” ๊ทธ jsPDF์˜ ํ•˜๋‚˜ ... ์–ด๋–ค ํžŒํŠธ?
๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค

์ด์ œ ํ•ด๊ฒฐ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.
dom์„ ๋ฉ”๋ชจ๋ฆฌ์˜ ๊ฐ์ฒด๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ๋ Œ๋”๋ง์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.
์ถ”๊ฐ€ document.getElementsByTagName('BODY')[0].append(mainDom); ๋‚ด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ–ˆ์Šต๋‹ˆ๋‹ค.
html2canvas๊ฐ€ ์ฒ˜๋ฆฌ๋˜๋ฉด mainDom ์ œ๊ฑฐ๋ฅผ ์ฒ˜๋ฆฌํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

์˜ˆ, ๋ Œ๋”๋ง๋œ ์š”์†Œ๋กœ ์ž‘์—…ํ•ด์•ผ ํ•˜๋ฉฐ ๋ฉ”๋ชจ๋ฆฌ์˜ ๊ฐ์ฒด๋กœ dom์„ ์‚ฌ์šฉํ•ด์„œ๋Š” ์•ˆ ๋ฉ๋‹ˆ๋‹ค.

์™œ onclone ์ฝœ๋ฐฑ์„ ์‚ฌ์šฉํ•˜์ง€ ์•Š์Šต๋‹ˆ๊นŒ? ์ด๋ ‡๊ฒŒ ํ•˜๋ฉด ๋ Œ๋”๋ง ์ „์— documentClone์œผ๋กœ ์ž‘์—…ํ•˜๊ณ  ๋ณ€๊ฒฝํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
์˜ˆ๋ฅผ ๋“ค์–ด ์Šคํฌ๋กค ๊ฐ€๋Šฅํ•œ ํ…Œ์ด๋ธ”์ธ Gantt ์ฐจํŠธ๊ฐ€ ์žˆ๊ณ  PDF์—์„œ ์ˆจ๊ฒจ์ง„ ํ–‰์„ ๋ณผ ์ˆ˜ ์žˆ๋Š” ์ „์ฒด ํ…Œ์ด๋ธ”์„ ์ธ์‡„ํ•˜๋ ค๊ณ  ํ•ฉ๋‹ˆ๋‹ค.

html2canvas(document.body, {
        onclone: function(documentClone) {
            // target elements you want to change on the "documentClone" object
        })
        .then(function(canvas) {
            // print canvas with e.g: jsPDF
        });
    };

๋‚˜๋Š” ์—ฌ๊ธฐ ์—์„œ IE11์„ ํ•ด๊ฒฐํ–ˆ์Šต๋‹ˆ๋‹ค.

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