Html2canvas: ์žกํžˆ์ง€ ์•Š์Œ(์•ฝ์† ์ค‘) ์ œ๊ณต๋œ ์š”์†Œ๊ฐ€ ๋ฌธ์„œ ๋‚ด์— ์—†์Šต๋‹ˆ๋‹ค.

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

์ด ์˜ค๋ฅ˜์˜ ์˜๋ฏธ๋Š” ๋ฌด์—‡์ž…๋‹ˆ๊นŒ? ๊ทธ๋ฆฌ๊ณ  ๊ทธ๊ฒƒ์„ ๊ณ ์น˜๋Š” ๋ฐฉ๋ฒ•

Needs More Information

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

jQuery๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ DIV ์‚ฌ์šฉ์„ ์ฐพ๋Š” ๊ฒฝ์šฐ
html2canvas($("#์š”์†Œ")[0]).then(ํ•จ์ˆ˜(์บ”๋ฒ„์Šค) {
$("#์š”์†Œ ์ถœ๋ ฅ").append(์บ”๋ฒ„์Šค);
});

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

๋ Œ๋”๋งํ•˜๋ ค๋Š” ์š”์†Œ๊ฐ€ Document DOM ๋‚ด์— ์žˆ์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

์ด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๋Š” ๋ฐฉ๋ฒ•์€ ๋ฌด์—‡์ž…๋‹ˆ๊นŒ?

0.5๋Š” ๊ดœ์ฐฎ์ง€๋งŒ 1๋กœ ์—…๊ทธ๋ ˆ์ด๋“œํ•˜๋ฉด ์ด ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.

jsfiddle์—์„œ ์˜ˆ์ œ๋ฅผ ๊ณต์œ ํ•ด ์ฃผ์„ธ์š”.

HTML ๋ณธ๋ฌธ ๋‹ค์Œ์— html2canvas js(๋ฒ„์ „ 1) ๋ฐ ๋‚ด ์•ฑ js๋ฅผ ๋กœ๋“œํ•˜๋ ค๊ณ  ์‹œ๋„ํ–ˆ๋Š”๋ฐ ์ด ๋ฌธ์ œ๊ฐ€ ํ•ด๊ฒฐ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

๋ˆ„๊ตฌ๋“ ์ง€์ด ๋ฌธ์ œ์— ๋Œ€ํ•œ ์ˆ˜์ • ์‚ฌํ•ญ์ด ์žˆ์Šต๋‹ˆ๊นŒ? ASP.Net MVC cshtml ํŽ˜์ด์ง€์—์„œ ์‚ฌ์šฉํ•˜๋Š” ๋™์•ˆ ๋™์ผํ•œ ๋ฌธ์ œ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

jQuery๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ DIV ์‚ฌ์šฉ์„ ์ฐพ๋Š” ๊ฒฝ์šฐ
html2canvas($("#์š”์†Œ")[0]).then(ํ•จ์ˆ˜(์บ”๋ฒ„์Šค) {
$("#์š”์†Œ ์ถœ๋ ฅ").append(์บ”๋ฒ„์Šค);
});

๊ทธ๋Ÿฌ๋‚˜ html2canvas๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ Google ์ง€๋„์˜ ์ด๋ฏธ์ง€๋ฅผ ์ฐ์„ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค(๋ชจ๋“  ์ง€๋„ ์ด๋ฏธ์ง€๊ฐ€ ์˜ค์ง€ ์•Š์Œ). cshtml์—์„œ ๋™์ผํ•œ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ๋ˆ„๊ฐ€ ๋„์™€์ค„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ ???

@cjcortez @RaghavPrabhu ์œ„์˜ smartbepl์˜ ์†”๋ฃจ์…˜์€ jQuery ๋˜๋Š” ๋‹จ์ผ Element ๋Œ€์‹  ์š”์†Œ ๋ชฉ๋ก์„ ์ œ๊ณตํ•˜๋Š” ๋‹ค๋ฅธ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ๋‹ค๊ณ  ๊ฐ€์ •ํ•  ์ˆ˜ ์žˆ๋„๋ก ์ˆ˜์ •ํ•ฉ๋‹ˆ๊นŒ?

์ด๊ฒƒ์€ ๋‚˜๋ฅผ ์œ„ํ•ด ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค!
html2canvas($('#div').get(0)).then( ํ•จ์ˆ˜(์บ”๋ฒ„์Šค) {
console.log(์บ”๋ฒ„์Šค);
});

๋•๋ถ„์— ํšจ๊ณผ๊ฐ€ ์žˆ์—ˆ๋‹ค

@jeremielodi ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค, ์ด๊ฒƒ์€ ๋‚˜๋ฅผ

์œ„์™€ ์œ ์‚ฌํ•œ ์ฝ”๋“œ๋ฅผ ์‹œ๋„ํ–ˆ์ง€๋งŒ ์•„๋งˆ๋„ ๋‚ด๊ฐ€ ๋ฐ›๋Š” ์˜ค๋ฅ˜๋Š” ๊ทธ๋‹ค์ง€ ๊ด€๋ จ์ด ์—†์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค: Uncaught (in promise) undefined... Promise denied (async)

๋˜‘๊ฐ™์€ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ–ˆ์Šต๋‹ˆ๋‹ค. ๋ฒ„ํŠผ ํด๋ฆญ ์‹œ HTML2Canvas๋ฅผ ํ˜ธ์ถœํ•˜๊ณ  ์‹ถ์—ˆ์Šต๋‹ˆ๋‹ค. HTML2Canvas ํ˜ธ์ถœ์„ ์–ด๋–ป๊ฒŒ ์ž‘์„ฑํ–ˆ๋Š”์ง€์— ๊ด€๊ณ„์—†์ด "Uncaught(in promise) undefined...Promise denied(async)" ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค. ๋งˆ์ง€๋ง‰์œผ๋กœ, ๋‚˜๋Š” ์•ฝ์†์ด ์–ด๋–ป๊ฒŒ ์ž‘๋™ํ•˜๋Š”์ง€์— ๋Œ€ํ•ด ์กฐ๊ธˆ ๋ฐฐ์› ๊ณ  ํ•ด๊ฒฐ์ฑ…์ด ์บ์น˜๋ฅผ ์ถ”๊ฐ€ํ•˜๋Š” ๊ฒƒ์„ ๋ฐœ๊ฒฌํ–ˆ์Šต๋‹ˆ๋‹ค.

function myFunction() {
    html2canvas(document.querySelector("#capture")).then(canvas => {          
            var base64encodedstring = canvas.toDataURL("image/jpeg", 1).replace("data:image/jpeg;base64,", "");
            j$("[id$='inputHidden']").val(base64encodedstring);
            console.log('Saving...');
            mySaveFunction();
        })
        .catch(function (error) {
            /* This is fired when the promise executes without the DOM */    
        });
}

๊ฒฝ๊ณ ์˜ ๋ง์”€, ์ €๋Š” ์™„์ „ํ•œ ์ž๋ฐ” ์Šคํฌ๋ฆฝํŠธ ์ดˆ๋ณด์ž์ด๋ฉฐ ์•ฝ์†์ด ์–ด๋–ป๊ฒŒ ์ž‘๋™ํ•˜๋Š”์ง€ ๊ฑฐ์˜ ์ดํ•ดํ•˜์ง€ ๋ชปํ•ฉ๋‹ˆ๋‹ค. ๋‚ด ์ฝ”๋“œ๋Š” ํ•จ์ˆ˜ ์™ธ๋ถ€์—์„œ ์‚ฌ์šฉํ•œ ๊ฒฝ์šฐ .catch() ์—†์ด๋„ ์ž˜ ์ž‘๋™ํ–ˆ์Šต๋‹ˆ๋‹ค. ์–ด๋–ป๊ฒŒ๋“  ์บก์Šํ™”ํ•˜๋ฉด ๋” ์ด์ƒ ์˜ฌ๋ฐ”๋ฅธ DOM ์•ก์„ธ์Šค ๊ถŒํ•œ์ด ์—†๊ณ  ์•ฝ์†์ด ์‹คํŒจํ•œ๋‹ค๊ณ  ๊ฐ€์ •ํ•ฉ๋‹ˆ๋‹ค.

@ikemike ์ด๊ฒƒ์€ ๋‹น์‹ ์„ ๋„์šธ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค
```html


html2์บ”๋ฒ„์Šค


@niklasvh ์ตœ์‹  ๋ฒ„์ „์˜ html2canvas๋ฅผ ์‚ฌ์šฉ ์ค‘์ž…๋‹ˆ๋‹ค. Uncaught(์•ฝ์†): ์ •์˜๋˜์ง€ ์•Š์€ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค. ์ œ๋ฐœ ๋‚  ์ข€ ๋„์™€ ์ค„ ์ˆ˜ ์žˆ๋‹ˆ.

image

image

์ด, ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค

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

function downloadURI(uri, name) {
    var link = document.createElement("a");

    link.download = name;
    link.href = uri;
    document.body.appendChild(link);
    link.click();
    clearDynamicLink(link); 
}

function DownloadAsImage() {
    var element = $("#table-card")[0];
    html2canvas(element).then(function (canvas) {
        var myImage = canvas.toDataURL();
        downloadURI(myImage, "cartao-virtual.png");
    });
}

ํฌ๋กฌ์—์„œ๋Š” ์ž˜ ๋˜๋Š”๋ฐ IE11์—์„œ๋Š” ์•ˆ๋˜๋„ค์š”... T_T;

์žกํžˆ์ง€ ์•Š์Œ(์•ฝ์† ์ค‘): ์ •์˜๋˜์ง€ ์•Š์€ ์˜ค๋ฅ˜

@bandacs ์ด์— ๋Œ€ํ•œ ํ•ด๊ฒฐ์ฑ…์„ ์ฐพ์•˜์Šต๋‹ˆ๊นŒ? ๊ท€ํ•˜์˜ ์Šคํฌ๋ฆฐ ์ƒท๊ณผ ๊ฐ™์€ ์ •ํ™•ํ•œ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.

1.0 alpha 12 ๋ฆด๋ฆฌ์Šค๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ๋Š”๋ฐ ๊ฐ™์€ ๋ฌธ์ œ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด ๋ชจ๋“  ์†”๋ฃจ์…˜์„ ์‹œ๋„ํ–ˆ์Šต๋‹ˆ๋‹ค.

@smartbepl์—์„œ ์ด ์†”๋ฃจ์…˜์„ ์‹œ๋„ํ–ˆ์Šต๋‹ˆ๋‹ค.
html2canvas($("#์š”์†Œ")[0]).then(ํ•จ์ˆ˜(์บ”๋ฒ„์Šค) {
$("#์š”์†Œ ์ถœ๋ ฅ").append(์บ”๋ฒ„์Šค);
});

๋‚˜๋Š” ์ด๊ฒƒ์„ @jeremielodi๊ฐ€ ์‹œ๋„ํ–ˆ๋‹ค.
html2canvas($('#div').get(0)).then( ํ•จ์ˆ˜(์บ”๋ฒ„์Šค) {
console.log(์บ”๋ฒ„์Šค);
});

๋‚˜๋Š” ๋˜ํ•œ leandrocgsi ์†”๋ฃจ์…˜์„ ์‹œ๋„ํ–ˆ๊ณ  @ikemike๊ฐ€ ์ œ์•ˆํ•œ ๋Œ€๋กœ ์บ์น˜๋ฅผ ์ถ”๊ฐ€ํ•˜๋ ค๊ณ  ์‹œ๋„ํ–ˆ์Šต๋‹ˆ๋‹ค.

์ด๋ฅผ ๋‹จ์ˆœํ™”ํ•˜๊ณ  ๋ชจ๋“  ์š”์†Œ๊ฐ€ DOM์— ๋กœ๋“œ๋˜๋„๋ก ํ•˜๊ธฐ ์œ„ํ•ด take_screenshot()์ด๋ผ๋Š” ํ•จ์ˆ˜๋ฅผ ๋ฐฐ์น˜ํ•ฉ๋‹ˆ๋‹ค.

ํ•จ์ˆ˜ take_screenshot()
{
html2canvas($(".image__container")[0]).then(์บ”๋ฒ„์Šค => {
console.log('์ œ๋ฐœ ์ •์‹ ์„ ์ฐจ๋ฆฌ๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค');
});
}
๊ทธ๋Ÿฐ ๋‹ค์Œ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ์ฝ˜์†”์—์„œ ์ง์ ‘ take_screenshot()์„ ํ˜ธ์ถœํ•˜์—ฌ ๋ชจ๋“  ๊ฒƒ์ด ๋กœ๋“œ๋˜์—ˆ๋Š”์ง€ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.
Uncaught(์•ฝ์†์—์„œ) undefined ๊ฐ™์€ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.

https://github.com/niklasvh/html2canvas/issues/1313#issuecomment -377132089์—์„œ ์ง๋ฉดํ•œ ๊ฒƒ๊ณผ ๋˜‘๊ฐ™์€ ๋ฌธ์ œ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.
๋ˆ„๊ตฌ๋“ ์ง€ ์ด ๋ฌธ์ œ์— ๋Œ€ํ•œ ํ•ด๊ฒฐ์ฑ…์„ ์ฐพ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ?

๋‚ด๊ฐ€ ์น˜์–ด๋ฆฌ๋”์— ์‹คํŒจํ•œ ์ด์œ ๋Š”?

   .get(url)
   .end((err, res) => {
       cheerio.load(res.text)
       html2Canvas($('#statuses').get(0), {
           allowTaint: true
       }).then(function(canvas) {})
})
Uncaught (in promise) Error: Element is not attached to a Document

์ด์ œ ๋˜ ๋‹ค๋ฅธ ํ˜ธ์ถœ ๊ทœ์น™์ด ์žˆ์Šต๋‹ˆ๋‹ค.
๋ฒ„์ „ 0.5๋Š” ๋ฐฐ์—ด์˜ ๋…ธ๋“œ๋ฅผ ์˜ˆ์ƒํ–ˆ์ง€๋งŒ ์ง€๊ธˆ์€ ์ง์ ‘ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.
๋ฒ„์ „ 0.5์—๋Š” "onrendered" ์˜ต์…˜์ด ์žˆ์—ˆ์ง€๋งŒ ์ด์ œ๋Š” "then" ๊ตฌ๋ฌธ์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

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