ํ ์คํธ์ ๋ฐฐ๊ฒฝ์์ ์ถ๊ฐํ ๋ค์ ์ ์ฅ์ ๋๋ฅด๋ฉด ํ ์คํธ์ ๋ฐฐ๊ฒฝ์์ด ํ์๋์ง๋ง div์ ์ด๋ฏธ์ง๋ฅผ ์ถ๊ฐํ๋ฉด ์ด๋ฏธ์ง๊ฐ ํ์๋์ง ์์ง๋ง ๋ค๋ฅธ ๊ฒ์ ํ์๋์ง ์์ต๋๋ค. .
์๋
.
๋๋ ์ ํํ ๊ฐ์ ๋ฌธ์ ๊ฐ ์์ต๋๋ค.
์ฌ๊ธฐ์์๋ ๊ฐ์ ๋ฌธ์ ์
๋๋ค.
ํธ์์ ์บก์ณํ๋ ค๊ณ ํ๋๋ฐ ์ฒจ๋ถ๋ ์ด๋ฏธ์ง๊ฐ ์๋์ต๋๋ค.
์ด๋ฏธ์ง๊ฐ ์ฒจ๋ถ๋์์ต๋๋ค.
๋ค๋ฅธ ์ฌ์ดํธ์ ์ด๋ฏธ์ง๋ "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
๊ฐ์ฅ ์ ์ฉํ ๋๊ธ
๋ชจ๋ ์ด๋ฏธ์ง๋ฅผ ์คํฌ๋ฆฐ์ท์ผ๋ก ๋ณด๋ ค๋ฉด allowTaint ์ต์ ์ ์ฝ์ ํ์ธ์.
html2canvas(document.getElementById('invoice-panel'), { letterRendering: 1, allowTaint : true, onrendered : function (canvas) { } });