<p>html2canvas๋Š” ์š”์†Œ์— ์žˆ๋Š” ์ด๋ฏธ์ง€๋ฅผ ๋ Œ๋”๋งํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.</p>

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

ํ…์ŠคํŠธ์™€ ๋ฐฐ๊ฒฝ์ƒ‰์„ ์ถ”๊ฐ€ํ•œ ๋‹ค์Œ ์ €์žฅ์„ ๋ˆ„๋ฅด๋ฉด ํ…์ŠคํŠธ์™€ ๋ฐฐ๊ฒฝ์ƒ‰์ด ํ‘œ์‹œ๋˜์ง€๋งŒ div์— ์ด๋ฏธ์ง€๋ฅผ ์ถ”๊ฐ€ํ•˜๋ฉด ์ด๋ฏธ์ง€๊ฐ€ ํ‘œ์‹œ๋˜์ง€ ์•Š์ง€๋งŒ ๋‹ค๋ฅธ ๊ฒƒ์€ ํ‘œ์‹œ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. .

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

๋ชจ๋“  ์ด๋ฏธ์ง€๋ฅผ ์Šคํฌ๋ฆฐ์ƒท์œผ๋กœ ๋ณด๋ ค๋ฉด allowTaint ์˜ต์…˜์„ ์‚ฝ์ž…ํ•˜์„ธ์š”.

html2canvas(document.getElementById('invoice-panel'), { letterRendering: 1, allowTaint : true, onrendered : function (canvas) { } });

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

์•ˆ๋…•.
๋‚˜๋Š” ์ •ํ™•ํžˆ ๊ฐ™์€ ๋ฌธ์ œ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

์—ฌ๊ธฐ์—์„œ๋„ ๊ฐ™์€ ๋ฌธ์ œ์ž…๋‹ˆ๋‹ค.
ํŠธ์œ—์„ ์บก์ณํ•˜๋ ค๊ณ  ํ•˜๋Š”๋ฐ ์ฒจ๋ถ€๋œ ์ด๋ฏธ์ง€๊ฐ€ ์•ˆ๋‚˜์˜ต๋‹ˆ๋‹ค.
์ด๋ฏธ์ง€๊ฐ€ ์ฒจ๋ถ€๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

stream-item-tweet-670397195221241856 2

๋‹ค๋ฅธ ์‚ฌ์ดํŠธ์˜ ์ด๋ฏธ์ง€๋Š” "HTML5 ์บ”๋ฒ„์Šค๋ฅผ ์˜ค์—ผ"์‹œํ‚ค๊ธฐ ๋•Œ๋ฌธ์— ๊ธฐ๋ณธ์ ์œผ๋กœ ์ฐจ๋‹จ๋˜์–ด ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ๋‹ค์Œ์€ ๋ Œ๋”๋Ÿฌ๋ฅผ ํ˜ธ์ถœํ•  ๋•Œ ์‚ฌ์šฉํ•ด์•ผ ํ•˜๋Š” ์˜ต์…˜์ž…๋‹ˆ๋‹ค.

์†์„ฑ: allowTaint
์œ ํ˜•: ๋ถ€์šธ
๊ธฐ๋ณธ๊ฐ’: ๊ฑฐ์ง“
์„ค๋ช…: ๊ต์ฐจ ์ถœ์ฒ˜ ์ด๋ฏธ์ง€๊ฐ€ ์บ”๋ฒ„์Šค๋ฅผ ์˜ค์—ผ์‹œํ‚ค๋Š” ๊ฒƒ์„ ํ—ˆ์šฉํ• ์ง€ ์—ฌ๋ถ€

https://html2canvas.hertzen.com/documentation.html์—์„œ ์ฐพ์•˜์Šต๋‹ˆ๋‹ค.

๊ฐ™์€ ๋ฌธ์ œ....
๋‚ด ์ด๋ฏธ์ง€๋Š” ๊ฐ™์€ ์ถœ์ฒ˜์—์„œ ์™”์Šต๋‹ˆ๋‹ค.

๋‚˜๋Š” ๊ฐ™์€ ๋ฌธ์ œ์— ์ง๋ฉดํ–ˆ์œผ๋ฉฐ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๋Š” ๊ฐ€์žฅ ์ข‹์€ ๋ฐฉ๋ฒ•์€ ์„œ๋ฒ„์—์„œ ํ”„๋กœ์ ํŠธ๋ฅผ ์‹คํ–‰ํ•˜๊ณ  ๊ฒฐ๊ณผ๋ฅผ ๋ณด๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.
์ œ ๊ฒฝ์šฐ์—๋Š” ์ด์ „์— ์„œ๋ฒ„ ์—†์ด ์ง์ ‘ html ํŒŒ์ผ์„ ์‹คํ–‰ํ–ˆ์ง€๋งŒ ์•ฝ๊ฐ„์˜ ์ธํ„ฐ๋„ท ๊ฒ€์ƒ‰ ํ›„์— ์„œ๋ฒ„์—์„œ ์‹œ๋„ํ•  ์ˆ˜ ์žˆ๋Š” ์†”๋ฃจ์…˜์„ ์–ป์—ˆ์Šต๋‹ˆ๋‹ค.
Visual Studio๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํ”„๋กœ์ ํŠธ๋ฅผ ์‹œ๋„ํ–ˆ๋Š”๋ฐ ์™„๋ฒฝํ•˜๊ฒŒ ์‹คํ–‰๋˜๊ณ  ์žˆ์—ˆ๊ณ  div ํƒœ๊ทธ ์•ˆ์˜ ์ด๋ฏธ์ง€๋„ ๋ณต์‚ฌ๋˜๊ณ  ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค.

๋ชจ๋“  ์ด๋ฏธ์ง€๋ฅผ ์Šคํฌ๋ฆฐ์ƒท์œผ๋กœ ๋ณด๋ ค๋ฉด allowTaint ์˜ต์…˜์„ ์‚ฝ์ž…ํ•˜์„ธ์š”.

html2canvas(document.getElementById('invoice-panel'), { letterRendering: 1, allowTaint : true, onrendered : function (canvas) { } });

div ์š”์†Œ ๋ชฉ๋ก์ด ์žˆ์Šต๋‹ˆ๋‹ค.
id๋กœ ๊ฐ div๋ฅผ ์บก์ฒ˜ํ•˜๋ ค๊ณ ํ•˜๋ฉด div ์ ˆ๋ฐ˜ ๋ถ€๋ถ„์ด ์บก์ฒ˜๋˜๊ณ  div์˜ ์บก์ฒ˜ ์ด๋ฏธ์ง€ ์ค‘ ์ผ๋ถ€๊ฐ€ ๋น„์–ด ์žˆ์Šต๋‹ˆ๋‹ค.
๋ฌด์—‡์ด ๋ฌธ์ œ์ด๊ณ  ์–ด๋–ป๊ฒŒ ๊ณ ์น  ์ˆ˜ ์žˆ๋Š”์ง€ ๋งํ•ด ์ค„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ? @

๊ฐ™์€ ๋ฌธ์ œ์ž…๋‹ˆ๋‹ค. ํ•ด๊ฒฐํ•ด ์ฃผ์…”์„œ ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค.

html2canvas๊ฐ€ base64 ํ˜•์‹์˜ src์— ์ด๋ฏธ์ง€๋ฅผ ๋ณ€ํ™˜ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋กœ๊ทธ๋ฅผ ์ธ์‡„ํ–ˆ์Šต๋‹ˆ๋‹ค. ์นœ์ ˆํ•˜๊ฒŒ ๋„์™€์ฃผ์„ธ์š”

1283ms html2canvas: ๋ณต์ œ๋œ ๋ฌธ์„œ html2canvas.js:1487
3936ms html2canvas: ํฌ๊ธฐ๊ฐ€ 601 x 965์ธ ์ดˆ๊ธฐํ™”๋œ CanvasRenderer html2canvas.js:1487
3937ms html2canvas: NodeParser ์‹œ์ž‘ html2canvas.js:1487
4014ms html2canvas: ๊ฐ€์ ธ์˜จ ๋…ธ๋“œ, ์ด๊ณ„: 10 html2canvas.js:1487
4015ms html2canvas: ์˜ค๋ฒ„ํ”Œ๋กœ ํด๋ฆฝ ๊ณ„์‚ฐ html2canvas.js:1487
4034ms html2canvas: ์ด๋ฏธ์ง€ ๊ฐ€์ ธ์˜ค๊ธฐ ์‹œ์ž‘ html2canvas.js:1487
4044ms html2canvas: ์ด๋ฏธ์ง€ #1 ๋ฐ์ดํ„ฐ ์ถ”๊ฐ€:image/jpeg;base64 ,/9j/4AAQSkZJRgABAQAAAQABAAD/2wBDAA0JCgsKCA0LCgsODg0PEyAVExISEyccHhcgLikxMC4pL html2canvas.js:1487
4047ms html2canvas: ์ด๋ฏธ์ง€ #2 ๋ฐ์ดํ„ฐ ์ถ”๊ฐ€:image/jpeg;base64 ,/9j/4AAQSkZJRgABAQAAAQABAAD/2wBDAAgGBgcGBQgHBwcJCQgKDBQNDASLDBkSEw8UHRofHh0aH html2canvas.js:14
4051ms html2canvas: ์ด๋ฏธ์ง€ ๊ฒ€์ƒ‰ ์™„๋ฃŒ html2canvas.js:1487
4052ms html2canvas: ์„ฑ๊ณต์ ์œผ๋กœ ๋กœ๋“œ๋œ ์ด๋ฏธ์ง€ #1
ImageContainer {src: " data:image/jpeg;base64 ,/9j/4AAQSkZJRgABAQAAAQABAADโ€ฆAKKKKACiiigAooooAKKKKACiiigAooooAKKKACiiigD/2Q==", ์ด๋ฏธ์ง€: img, ์˜ค์—ผ๋œ: null, ์•ฝ์†: h}
html2canvas.js:1487
4056ms html2canvas: ์„ฑ๊ณต์ ์œผ๋กœ ๋กœ๋“œ๋œ ์ด๋ฏธ์ง€ #2
ImageContainer {src: " data:image/jpeg;base64 ,/9j/4AAQSkZJRgABAQAAAQABAADโ€ฆ4PXOaUMB0/GlrcdiYtkcc/WkzjqfwqMPxzxRvAz3oSCx//9k=", ์ด๋ฏธ์ง€: img, ์˜ค์—ผ๋จ: null, ์•ฝ์†
html2canvas.js:1487
4059ms html2canvas: ์ด๋ฏธ์ง€ ๋กœ๋“œ, html2canvas.js:1487 ๊ตฌ๋ฌธ ๋ถ„์„ ์‹œ์ž‘
4060ms html2canvas: ์Šคํƒ ์ปจํ…์ŠคํŠธ ๋งŒ๋“ค๊ธฐ html2canvas.js:1487
4064ms html2canvas: ์Šคํƒ ์ปจํ…์ŠคํŠธ ์ •๋ ฌ html2canvas.js:1487
4066ms html2canvas: 9๊ฐœ ํ•ญ๋ชฉ์œผ๋กœ ์ƒ์„ฑ๋œ ๋ Œ๋”๋ง ๋Œ€๊ธฐ์—ด html2canvas.js:1487
4104ms html2canvas: html2canvas.js:1487 ๋ Œ๋”๋ง ์™„๋ฃŒ
4109ms html2canvas: ์บ”๋ฒ„์Šค ์ž๋ฅด๊ธฐ: ์™ผ์ชฝ: 28 ์ƒ๋‹จ: 529 ๋„ˆ๋น„: 545 ๋†’์ด: 0 html2canvas.js:1487
4111ms html2canvas: ๋„ˆ๋น„๊ฐ€ 545์ด๊ณ  ๋†’์ด๊ฐ€ 0์ด๊ณ  x 28 ๋ฐ y 529์ธ ๊ฒฐ๊ณผ ์ž๋ฅด๊ธฐ

html2canvsas๊ฐ€ base64 src๋กœ ์ œ๊ณต๋œ ์ด๋ฏธ์ง€๋ฅผ ๋ Œ๋”๋งํ•˜์ง€ ์•Š์Œ, ํ˜ธ์ถœ์ด "onrendered"๋กœ ๋Œ์•„์˜ค์ง€ ์•Š์Œ
ํ•จ์ˆ˜. ์นœ์ ˆํ•˜๊ฒŒ ๋„์™€์ฃผ์„ธ์š”

1283ms html2canvas: ๋ณต์ œ๋œ ๋ฌธ์„œ html2canvas.js:1487
3936ms html2canvas: ํฌ๊ธฐ๊ฐ€ 601 x 965์ธ ์ดˆ๊ธฐํ™”๋œ CanvasRenderer html2canvas.js:1487
3937ms html2canvas: NodeParser ์‹œ์ž‘ html2canvas.js:1487
4014ms html2canvas: ๊ฐ€์ ธ์˜จ ๋…ธ๋“œ, ์ด๊ณ„: 10 html2canvas.js:1487
4015ms html2canvas: ์˜ค๋ฒ„ํ”Œ๋กœ ํด๋ฆฝ ๊ณ„์‚ฐ html2canvas.js:1487
4034ms html2canvas: ์ด๋ฏธ์ง€ ๊ฐ€์ ธ์˜ค๊ธฐ ์‹œ์ž‘ html2canvas.js:1487
4044ms html2canvas: ์ด๋ฏธ์ง€ #1 ๋ฐ์ดํ„ฐ ์ถ”๊ฐ€:image/jpeg;base64 ,/9j/4AAQSkZJRgABAQAAAQABAAD/2wBDAA0JCgsKCA0LCgsODg0PEyAVExISEyccHhcgLikxMC4pL html2canvas.js:1487
4047ms html2canvas: ์ด๋ฏธ์ง€ #2 ๋ฐ์ดํ„ฐ ์ถ”๊ฐ€:image/jpeg;base64 ,/9j/4AAQSkZJRgABAQAAAQABAAD/2wBDAAgGBgcGBQgHBwcJCQgKDBQNDASLDBkSEw8UHRofHh0aH html2canvas.js:14
4051ms html2canvas: ์ด๋ฏธ์ง€ ๊ฒ€์ƒ‰ ์™„๋ฃŒ html2canvas.js:1487
4052ms html2canvas: ์„ฑ๊ณต์ ์œผ๋กœ ๋กœ๋“œ๋œ ์ด๋ฏธ์ง€ #1
ImageContainer {src: " data:image/jpeg;base64 ,/9j/4AAQSkZJRgABAQAAAQABAADโ€ฆAKKKKACiiigAooooAKKKKACiiigAooooAKKKACiiigD/2Q==", ์ด๋ฏธ์ง€: img, ์˜ค์—ผ๋œ: null, ์•ฝ์†: h}
html2canvas.js:1487
4056ms html2canvas: ์„ฑ๊ณต์ ์œผ๋กœ ๋กœ๋“œ๋œ ์ด๋ฏธ์ง€ #2
ImageContainer {src: " data:image/jpeg;base64 ,/9j/4AAQSkZJRgABAQAAAQABAADโ€ฆ4PXOaUMB0/GlrcdiYtkcc/WkzjqfwqMPxzxRvAz3oSCx//9k=", ์ด๋ฏธ์ง€: img, ์˜ค์—ผ๋จ: null, ์•ฝ์†
html2canvas.js:1487
4059ms html2canvas: ์ด๋ฏธ์ง€ ๋กœ๋“œ, html2canvas.js:1487 ๊ตฌ๋ฌธ ๋ถ„์„ ์‹œ์ž‘
4060ms html2canvas: ์Šคํƒ ์ปจํ…์ŠคํŠธ ๋งŒ๋“ค๊ธฐ html2canvas.js:1487
4064ms html2canvas: ์Šคํƒ ์ปจํ…์ŠคํŠธ ์ •๋ ฌ html2canvas.js:1487
4066ms html2canvas: 9๊ฐœ ํ•ญ๋ชฉ์œผ๋กœ ์ƒ์„ฑ๋œ ๋ Œ๋”๋ง ๋Œ€๊ธฐ์—ด html2canvas.js:1487
4104ms html2canvas: html2canvas.js:1487 ๋ Œ๋”๋ง ์™„๋ฃŒ
4109ms html2canvas: ์บ”๋ฒ„์Šค ์ž๋ฅด๊ธฐ: ์™ผ์ชฝ: 28 ์ƒ๋‹จ: 529 ๋„ˆ๋น„: 545 ๋†’์ด: 0 html2canvas.js:1487
4111ms html2canvas: ๋„ˆ๋น„๊ฐ€ 545์ด๊ณ  ๋†’์ด๊ฐ€ 0์ด๊ณ  x 28 ๋ฐ y 529์ธ ๊ฒฐ๊ณผ ์ž๋ฅด๊ธฐ

@SebasAlvarez - allowTaint ์˜ต์…˜์ด ๋” ์ด์ƒ ์ž‘๋™ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์—ฌ์ „ํžˆ ํšจ๊ณผ๊ฐ€ ์žˆ์Šต๋‹ˆ๊นŒ?

@SebasAlvarez , @sandeepnagra :
์ƒˆ ํƒญ์˜ ์ด๋ฏธ์ง€ ์Šคํฌ๋ฆฐ์ƒท์— ์ด ์ฝ”๋“œ๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์ง€๋งŒ ์ด๋ฏธ์ง€๊ฐ€ ๋ Œ๋”๋ง๋˜์ง€ ์•Š๊ณ  "a llowTaint:true "์— ์ง€์ณค์Šต๋‹ˆ๋‹ค. ๋™์ผํ•œ ์ฐฝ ๋‚ด์—์„œ๋งŒ ์ž‘๋™ํ•˜์ง€๋งŒ ์ƒˆ ํƒญ์—์„œ๋Š” ์ž‘๋™ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
์ด๊ฒƒ์€ ๋‚ด ์ฝ”๋“œ์ž…๋‹ˆ๋‹ค.
ํ•จ์ˆ˜ ๋ Œ๋”(){
html2canvas(document.body, { allowTaint : ์ฐธ,
๋ Œ๋”๋ง: ํ•จ์ˆ˜(์บ”๋ฒ„์Šค) {
document.body.appendChild(์บ”๋ฒ„์Šค);
window.open(canvas.toDataURL());
}
});
}
๋ฌธ์ œ๊ฐ€ ๋ฌด์—‡์ธ์ง€ ์•Œ๋ ค์ฃผ์‹ค ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ? ์–ด๋–ป๊ฒŒ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ?

@venkateshduddu - ์Šคํฌ๋ฆฐ์ƒท์„ ์ฐ๊ธฐ ์ „์— ๋จผ์ € ์ƒˆ ํƒญ์œผ๋กœ ์ดˆ์ ์„ ์˜ฎ๊ธฐ๊ณ  ์žˆ์Šต๋‹ˆ๊นŒ?

@sandeepnagra - sandeep ์—†์Œ, ํด๋ฆญ ์ด๋ฒคํŠธ๋งŒ ์‚ฌ์šฉ ์ค‘์ž…๋‹ˆ๋‹ค. ๋กœ์ปฌ ์ด๋ฏธ์ง€ ๊ฒฝ๋กœ๋ฅผ ์‚ฌ์šฉํ•˜์ง€๋งŒ ์ƒˆ ํƒญ์—์„œ ์„œ๋ฒ„ ๊ฒฝ๋กœ๊ฐ€ ์ž‘๋™ํ•˜์ง€ ์•Š๋Š” ๊ฒฝ์šฐ ํ•œ ๊ฐ€์ง€ ๋” ์Šคํฌ๋ฆฐ์ƒท์ด ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค.

@venkateshduddu - ํด๋ฆญ ์ด๋ฒคํŠธ๋Š” ํฌ์ปค์Šค๋ฅผ ์ƒˆ ํƒญ์œผ๋กœ ์ž๋™์œผ๋กœ ์ด๋™ํ•˜์ง€ ์•Š์œผ๋ฏ€๋กœ ํŠธ๋ฆฌ๊ฑฐํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ๋จผ์ € ์‹œ๋„ํ•ด ๋ณด์‹ญ์‹œ์˜ค. ๋ฌธ์ œ๊ฐ€ ํ•ด๊ฒฐ๋  ๊ฒƒ์ด๋ผ๊ณ  100% ํ™•์‹ ํ•ฉ๋‹ˆ๋‹ค.

์„œ๋ฒ„ ๊ฒฝ๋กœ์™€ ๊ด€๋ จํ•˜์—ฌ ํ•ด๋‹น ๋„คํŠธ์›Œํฌ ๋“œ๋ผ์ด๋ธŒ๊ฐ€ ์ธ์ฆ๋˜์—ˆ์Šต๋‹ˆ๊นŒ? ๊ทธ๋ ‡๋‹ค๋ฉด ๋„คํŠธ์›Œํฌ ๋“œ๋ผ์ด๋ธŒ์— ํŒŒ์ผ์„ ์—…๋กœ๋“œํ•˜๊ธฐ ์ „์— ์ธ์ฆํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๊นŒ? S3 ๋ฒ„ํ‚ท์— ์—…๋กœ๋“œํ•˜๋ ค๋Š” ๊ฒฝ์šฐ ์™„์ „ํžˆ ๋‹ค๋ฅธ ์ด์•ผ๊ธฐ์ž…๋‹ˆ๋‹ค.

์•ˆ๋…•ํ•˜์„ธ์š”, ๋‚ด๋ถ€ IP ์นด๋ฉ”๋ผ๋กœ iframe์„ ์Šคํฌ๋ฆฌ๋‹ํ•˜๋ ค๊ณ  ํ•˜๋ฉด ๋ฌดํšจ ์ด๋ฏธ์ง€๊ฐ€ ๋ฐ˜ํ™˜๋ฉ๋‹ˆ๋‹ค. ๋„์™€์ฃผ์‹œ๊ฒ ์Šต๋‹ˆ๊นŒ?

allowTaint๋ฅผ ์‚ฌ์šฉํ•œ ๊ฒฝ์šฐ ๋‹ค์šด๋กœ๋“œ ์˜ต์…˜์ด ์ž‘๋™ํ•˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค. ๋„์™€์ฃผ์„ธ์š”

๊ฐ™์€ ๋ฌธ์ œ....
๋‚ด ์ด๋ฏธ์ง€๋Š” ๊ฐ™์€ ์ถœ์ฒ˜์—์„œ ์™”์Šต๋‹ˆ๋‹ค.

๋ฐฉ๊ธˆ ์ด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ–ˆ์Šต๋‹ˆ๋‹ค.
pls๋Š” 'useCORS' ์˜ต์…˜์„ 'true'๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.
์•„๋ž˜ ์ฝ”๋“œ:
html2canvas( document.querySelector(".preview_area"), { logging: true, letterRendering: 1, // allowTaint: false useCORS: true } ).then(canvas => { })

@Sotyoyo ์ •๋ง ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค. ์ œ ๋ฒ„๊ทธ๋Š” ์œ„์˜ ์ฝ”๋“œ๋กœ ์ˆ˜์ •๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค

@Sotyoyo ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค ํ˜•๋‹˜ ์ถ•๋ณตํ•ฉ๋‹ˆ๋‹ค <3

@Sotyoyo ์ •๋ง ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค.

์ด๋ฏธ์ง€๊ฐ€ ๋ Œ๋”๋ง๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋‚ด ์ฝ”๋“œ์— ๋ฌธ์ œ๊ฐ€ ์žˆ์Šต๋‹ˆ๊นŒ?

html2canvas(document.getElementById("html-2-pdfwrapper"), {
๋กœ๊น…: ์ฐธ,
๋ฌธ์ž ๋ Œ๋”๋ง: 1,
allowTaint: ๊ฑฐ์ง“,
useCORS: ์‚ฌ์‹ค,
๋ Œ๋”๋ง: ํ•จ์ˆ˜(์บ”๋ฒ„์Šค) {
var img = ์บ”๋ฒ„์Šค.toDataURL('์ด๋ฏธ์ง€/png');
var ๋ฌธ์„œ = ์ƒˆ๋กœ์šด jsPDF();
doc.addImage(img, 'JPEG', 20, 20);
doc.save('test2.pdf');
}
});

๊ฐ™์€ ๋ฌธ์ œ....
๋‚ด ์ด๋ฏธ์ง€๋Š” ๊ฐ™์€ ์ถœ์ฒ˜์—์„œ ์™”์Šต๋‹ˆ๋‹ค.

๋ฐฉ๊ธˆ ์ด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ–ˆ์Šต๋‹ˆ๋‹ค.
pls๋Š” 'useCORS' ์˜ต์…˜์„ 'true'๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.
์•„๋ž˜ ์ฝ”๋“œ:
html2canvas( document.querySelector(".preview_area"), { logging: true, letterRendering: 1, // allowTaint: false useCORS: true } ).then(canvas => { })

๊ทธ๊ฒƒ์˜ ์ผ! ๊ณ ๋งˆ์›Œ!

๊ฐ™์€ ๋ฌธ์ œ....
๋‚ด ์ด๋ฏธ์ง€๋Š” ๊ฐ™์€ ์ถœ์ฒ˜์—์„œ ์™”์Šต๋‹ˆ๋‹ค.

๋ฐฉ๊ธˆ ์ด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ–ˆ์Šต๋‹ˆ๋‹ค.
pls๋Š” 'useCORS' ์˜ต์…˜์„ 'true'๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.
์•„๋ž˜ ์ฝ”๋“œ:
html2canvas( document.querySelector(".preview_area"), { logging: true, letterRendering: 1, // allowTaint: false useCORS: true } ).then(canvas => { })

๋งž์•„์š” /

html2canvas(document.querySelector("#id-of-element"),{ logging: true, letterRendering: 1, allowTaint: false, useCORS: true }).then(canvas => {
var imgData = ์บ”๋ฒ„์Šค.toDataURL('์ด๋ฏธ์ง€/jpeg');
});

๋ชจ๋“  ์ด๋ฏธ์ง€๋ฅผ ์Šคํฌ๋ฆฐ์ƒท์œผ๋กœ ๋ณด๋ ค๋ฉด allowTaint ์˜ต์…˜์„ ์‚ฝ์ž…ํ•˜์„ธ์š”.

html2canvas(document.getElementById('invoice-panel'), { letterRendering: 1, allowTaint : true, onrendered : function (canvas) { } });

๊ฐ์‚ฌ ํ•ด์š”. ์ž˜ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค.

ํ•˜์ง€๋งŒ ์ด๋ฏธ์ง€ ์Šคํƒ€์ผ์„ ์บ”๋ฒ„์Šค์— ๋ณต์ œํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

์œ„์˜ ์˜ต์…˜์„ ์‚ฌ์šฉํ•œ ํ›„์—๋„ ์—ฌ์ „ํžˆ ๋™์ผํ•œ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.
var ์š”์†Œ = document.querySelector("#๋งต ์ด๋ฏธ์ง€ ID");
html2canvas(์š”์†Œ, {
๋กœ๊น…: ์ฐธ,
๋ฌธ์ž ๋ Œ๋”๋ง: 1,
allowTaint: ๊ฑฐ์ง“,
useCORS: ์‚ฌ์‹ค
}).then(canvasElm => {
var imageType = "์ด๋ฏธ์ง€/png";
var ์ด๋ฏธ์ง€ ๋ฐ์ดํ„ฐ = ์บ”๋ฒ„์ŠคElm.toDataURL(์ด๋ฏธ์ง€ ์œ ํ˜•);
var src = ์ธ์ฝ”๋”ฉURI(์ด๋ฏธ์ง€ ๋ฐ์ดํ„ฐ);
console.log("src", src);
console.log("์ด๋ฏธ์ง€ ๋ฐ์ดํ„ฐ", imageData);

์œ„์˜ ์˜ต์…˜์„ ์‚ฌ์šฉํ•œ ํ›„์—๋„ ์—ฌ์ „ํžˆ ๋™์ผํ•œ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.
var ์š”์†Œ = document.querySelector("#๋งต ์ด๋ฏธ์ง€ ID");
html2canvas(์š”์†Œ, {
๋กœ๊น…: ์ฐธ,
๋ฌธ์ž ๋ Œ๋”๋ง: 1,
allowTaint: ๊ฑฐ์ง“,
useCORS: ์‚ฌ์‹ค
}).then(canvasElm => {
var imageType = "์ด๋ฏธ์ง€/png";
var ์ด๋ฏธ์ง€ ๋ฐ์ดํ„ฐ = ์บ”๋ฒ„์ŠคElm.toDataURL(์ด๋ฏธ์ง€ ์œ ํ˜•);
var src = ์ธ์ฝ”๋”ฉURI(์ด๋ฏธ์ง€ ๋ฐ์ดํ„ฐ);
console.log("src", src);
console.log("์ด๋ฏธ์ง€ ๋ฐ์ดํ„ฐ", imageData);

๋‹น์‹  ๊ฐ™์€. ํ•ด๊ฒฐํ•˜์…จ๋‚˜์š”?

์œ„์˜ ์˜ต์…˜์„ ์‚ฌ์šฉํ•œ ํ›„์—๋„ ์—ฌ์ „ํžˆ ๋™์ผํ•œ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.
var ์š”์†Œ = document.querySelector("#๋งต ์ด๋ฏธ์ง€ ID");
html2canvas(์š”์†Œ, {
๋กœ๊น…: ์ฐธ,
๋ฌธ์ž ๋ Œ๋”๋ง: 1,
allowTaint: ๊ฑฐ์ง“,
useCORS: ์‚ฌ์‹ค
}).then(canvasElm => {
var imageType = "์ด๋ฏธ์ง€/png";
var ์ด๋ฏธ์ง€ ๋ฐ์ดํ„ฐ = ์บ”๋ฒ„์ŠคElm.toDataURL(์ด๋ฏธ์ง€ ์œ ํ˜•);
var src = ์ธ์ฝ”๋”ฉURI(์ด๋ฏธ์ง€ ๋ฐ์ดํ„ฐ);
console.log("src", src);
console.log("์ด๋ฏธ์ง€ ๋ฐ์ดํ„ฐ", imageData);

๋‚˜์™€ ๊ฐ™์€ ๋ฌธ์ œ ์–ด๋–ค ๋„์›€

๋‚˜๋Š” ๊ฐ™์€ ๋ฌธ์ œ๋ฅผ๋ณด๊ณ ์žˆ๋‹ค. ๋‚ด๊ฐ€ ๋ญ˜ ์ž˜๋ชปํ•˜๊ณ  ์žˆ์ฃ ?

html2canvas(document.getElementById(<id>), {
    logging: true,
    letterRendering: 1,
    allowTaint: false,
    useCORS: true
}).then(result => {
    var img = result.toDataURL("image/png");
    savePng(img);
});

์•„๋ž˜๋Š” <img src-"..." /> ๋ฅผ ํฌํ•จํ•˜๋ ค๋Š” ๊ฒฝ์šฐ์—๋„ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค.

html2canvas(report, {letterRendering: 1, allowTaint: true, useCORS: true})
            .then((canvas) => {      
                const imgData = canvas.toDataURL('image/png');
               // const pdf = new jsPDF();
               // pdf.addImage(imgData, 'PNG', 10, 10);
                //pdf.save("foo.pdf");  
            });

๋‚ด ์ฝ˜ํ…์ธ ์—๋Š” Aws.s3()์—์„œ ๊ฐ€์ ธ์˜จ ์ด๋ฏธ์ง€๊ฐ€ ํฌํ•จ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค. ์œ„์—์„œ ์–ธ๊ธ‰ํ•œ ๋Œ“๊ธ€์€ ์ œ ๊ฒฝ์šฐ์—๋Š” ์ž‘๋™ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

html2canvas(๋‚ด์šฉ, {letterRendering: 1,allowTaint: false,useCORS:true})
.then(์บ”๋ฒ„์Šค => {
const imgData = ์บ”๋ฒ„์Šค.toDataURL('์ด๋ฏธ์ง€/png');
console.log(imgData);
const pdf = ์ƒˆ๋กœ์šด jsPDF();
pdf.addImage(imgData, 'PNG', 10, 10, canvas.width, canvas.height);
pdf.save('๋‹ค์šด๋กœ๋“œ.pdf');
});

์ถœ๋ ฅ ์บ”๋ฒ„์Šค์—๋Š” ์ด๋ฏธ์ง€ ๋Œ€์‹  ๋นˆ ์ƒ์ž๋งŒ ์žˆ์Šต๋‹ˆ๋‹ค. ๋ˆ„๊ตฌ๋“ ์ง€ ๋‚ด ๊ฒฝ์šฐ์— ๋Œ€ํ•œ ํ•ด๊ฒฐ์ฑ…์ด ์žˆ์Šต๋‹ˆ๊นŒ?

๋‚ด ์ฝ˜ํ…์ธ ์—๋Š” Aws.s3()์—์„œ ๊ฐ€์ ธ์˜จ ์ด๋ฏธ์ง€๊ฐ€ ํฌํ•จ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค. ์œ„์—์„œ ์–ธ๊ธ‰ํ•œ ๋Œ“๊ธ€์€ ์ œ ๊ฒฝ์šฐ์—๋Š” ์ž‘๋™ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

html2canvas(๋‚ด์šฉ, {letterRendering: 1,allowTaint: false,useCORS:true})
.then(์บ”๋ฒ„์Šค => {
const imgData = ์บ”๋ฒ„์Šค.toDataURL('์ด๋ฏธ์ง€/png');
console.log(imgData);
const pdf = ์ƒˆ๋กœ์šด jsPDF();
pdf.addImage(imgData, 'PNG', 10, 10, canvas.width, canvas.height);
pdf.save('๋‹ค์šด๋กœ๋“œ.pdf');
});

์ถœ๋ ฅ ์บ”๋ฒ„์Šค์—๋Š” ์ด๋ฏธ์ง€ ๋Œ€์‹  ๋นˆ ์ƒ์ž๋งŒ ์žˆ์Šต๋‹ˆ๋‹ค. ๋ˆ„๊ตฌ๋“ ์ง€ ๋‚ด ๊ฒฝ์šฐ์— ๋Œ€ํ•œ ํ•ด๊ฒฐ์ฑ…์ด ์žˆ์Šต๋‹ˆ๊นŒ?

์—ฌ๊ธฐ์—์„œ ๊ฐ™์€ ๋ฌธ์ œ. S3 ๋ฒ„ํ‚ท์—์„œ ์˜ค๋Š” ์ด๋ฏธ์ง€

๊ฐ™์€ ๋ฌธ์ œ....
๋‚ด ์ด๋ฏธ์ง€๋Š” ๊ฐ™์€ ์ถœ์ฒ˜์—์„œ ์™”์Šต๋‹ˆ๋‹ค.

๋ฐฉ๊ธˆ ์ด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ–ˆ์Šต๋‹ˆ๋‹ค.
pls๋Š” 'useCORS' ์˜ต์…˜์„ 'true'๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.
์•„๋ž˜ ์ฝ”๋“œ:
html2canvas( document.querySelector(".preview_area"), { logging: true, letterRendering: 1, // allowTaint: false useCORS: true } ).then(canvas => { })

๊ฐ์‚ฌ ํ•ด์š”
๊ทธ๊ฒƒ์€ ๋‚˜๋ฅผ ์œ„ํ•ด ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค โคโค

์›๋ณธ ' http://localhost :3000'์˜ ' https://image/logo ๋งํฌ'์— ์žˆ๋Š” ์ด๋ฏธ์ง€์— ๋Œ€ํ•œ ์•ก์„ธ์Šค๊ฐ€ CORS ์ •์ฑ…์— ์˜ํ•ด ์ฐจ๋‹จ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ์š”์ฒญํ•œ ๋ฆฌ์†Œ์Šค์— 'Access-Control-Allow-Origin' ํ—ค๋”๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.
์ด๊ฒƒ์ด ๋‚ด ๋กœ๊ณ ๊ฐ€ pdf ํŒŒ์ผ์— ๋‚˜ํƒ€๋‚˜์ง€ ์•Š๋Š” ์ด์œ ์ž…๋‹ˆ๋‹ค.
CSS๊ฐ€ ์ ์šฉ๋œ ๋ชจ๋“  ํ…์ŠคํŠธ์™€ ์ •์  ํด๋”์— ์žˆ๋Š” ๋ธŒ๋žœ๋“œ ๋กœ๊ณ ๊ฐ€ ์˜ต๋‹ˆ๋‹ค.
์ด ๋ฌธ์ œ์— ๋Œ€ํ•œ ๋„์›€์ด ํ•„์š”ํ•œ ๋‹ต๋ณ€์„ 2์ฃผ ์ด์ƒ ์‹œ๋„ํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

์—ฌ๊ธฐ ์˜ค๋Š” ์‚ฌ๋žŒ์€ ์—ฌ๋Ÿฌ ๊ฐ€์ง€๋ฅผ ์‹œ๋„ํ•œ ํ›„ ์™ธ๋ถ€ ๋ฆฌ์†Œ์Šค(์˜ˆ: S3 ๋ฒ„ํ‚ท)์—์„œ ์ด๋ฏธ์ง€๋ฅผ ๊ฐ€์ ธ์˜ค๋ ค๋ฉด html2canvas์— ๋Œ€ํ•ด useCORS = true๋ฅผ ๋ชจ๋‘ ํ™œ์„ฑํ™”ํ•˜๊ณ  S3์—์„œ ์ œ๊ณต๋˜๋Š” ์ด๋ฏธ์ง€์— ๋Œ€ํ•ด CORS ์ •์ฑ…์„ ํ™œ์„ฑํ™”ํ•ด์•ผ ํ•œ๋‹ค๋Š” ๊ฒƒ์„ ์•Œ๊ฒŒ ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

html2canvas ํ”„๋ก์‹œ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํ•ด๊ฒฐํ–ˆ์Šต๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์—์„œ ์‚ฌ์šฉ ๋ฐ ํ…Œ์ŠคํŠธ์— ๋Œ€ํ•œ ์„ธ๋ถ€ ์ •๋ณด๋ฅผ ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
https://github.com/zeusstl/html2canvas-proxy-nodejs

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