์ด๊ฒ์ ๋ ๋ง์ ๊ธฐ๋ฅ ์์ฒญ์
๋๋ค. ๋ฐํ๋ canvas
toDataURL
๋ฅผ ํธ์ถํ์ฌ PNG๋ฅผ ์ฝ๊ฒ ์์ฑํ ์ ์์ต๋๋ค. ๊ทธ๋ฌ๋ ์ด๋ฏธ์ง์ ํ์ง์ด ๋ค์ ํ๋ฆฟํ๊ฑฐ๋ ์ข์ง ์์ต๋๋ค. ๋๋ ์ฝ๊ฐ์ ์ธํฐ๋ท ๊ฒ์์ํ๊ณ ๊ธฐ๋ณธ์ ์ผ๋ก 96dpi์ ์ด๋ฏธ์ง๋ฅผ ๋ฐํํ๋ค๋ ๊ฒ์ ์์์ต๋๋ค. ๊ทธ๋ฆฌ๊ณ ์ด๊ฒ์ ๊ฐ์ ํ๋ ํ์ค ๋ฐฉ๋ฒ์ ์๋ ๊ฒ ๊ฐ์ต๋๋ค. ๋ํ toDataURLHD
๋ ์คํ์ ์ด๋ฉฐ ์ด๋ค ๋ฐฉ์์ผ๋ก๋ ์๋ํ์ง ์์ต๋๋ค.
html2canvas
์์ ๋ ๋์ ํด์๋์ ์ด๋ฏธ์ง๋ฅผ ๋ฐํํ ์ ์๋ ๋ฐฉ๋ฒ์ด ์์ต๋๊น? ๋๋ DOM์ ๋ ๋๋งํ๋ ๋ฐฉ๋ฒ์ ์ ๊ณตํ ์ ์๋ค๊ณ ํด๋ DOM์ ์ฌ์ฉํ๋ ์ผ๋ถ ๋ผ์ด๋ธ๋ฌ๋ฆฌ(๋ชจ๋ ๊ณ์ฐ๋ ์คํ์ผ์ด ์ ์ฉ๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ)๋ฅผ ์ฌ์ฉํ๊ณ ์ํ๋ ์ด๋ฏธ์ง๋ฅผ ์์ฑํ ์ ์์ต๋๋ค.
๋ค๋ฅธ ๋ฌธ์ /์์ฒญ์ ์ด๋ ์์ ์์ ์ด์ ๋ํ ์ด์ผ๊ธฐ๊ฐ ์์๊ณ ๋๊ตฐ๊ฐ๊ฐ pull ์์ฒญ์ ์ ์ถํ๋ค๋ ๊ฒ์ ์๊ณ ์์ง๋ง pull ์์ฒญ์ด ๋ณํฉ๋๋ ๊ฒ์ ๋ณธ ์ ์ด ์์ต๋๋ค.
์ฅ์น ํฝ์ ๋ฐ๋๋ฅผ ํ์ธํ๋ ๋ฐ ์ฌ์ฉํ๋ ์์ ๋ฐฉ๋ฒ์ด ์์ต๋๋ค. ๊ทธ๋ฌ๋ ์ด๊ฒ์ ์ฑ๋ฅ์ ์ํฅ์ ์ค ์ ์์ต๋๋ค. ๋์ ๋ ๋์ dpi๋ก ๋ ๋๋งํ๋๋ก ๋งค๊ฐ๋ณ์๊ฐ ํ์ํ ๊น์?
@missing ์, DPI๋ฅผ ์ง์ ํ๋ ๋งค๊ฐ ๋ณ์๋ ๊ต์ฅํฉ๋๋ค.
๋ํ ์ฅ์น ํฝ์ ๋ฐ๋์ ๋ํ ์์ ๋ฐฉ๋ฒ์ ๊ณต์ ํ๋ ๋ฐ ์ ๊ฒฝ ์ฐ์ง ์๋๋ค๋ฉด ๊ด์ฐฎ์ ๊ฒ์ ๋๋ค. ๋ด ์ฃผ์ ์์ฉ ํ๋ก๊ทธ๋จ์ ์ต๋ 50๊ฐ ๋จ์ด์ ๋จ์ด ๊ตฌ๋ฆ์ png๋ฅผ ๋ด๋ณด๋ด๋ ๊ฒ์ ๋๋ค. ๊ทธ๋์ ๋๋ ์ด๊ฒ์ ๋ํ ์ฑ๋ฅ ํํธ์ ๋ํด ๊ทธ๋ค์ง ๊ฑฑ์ ํ์ง ์์ต๋๋ค.
์ด๋ฏธ์ง์ ํ์ง์ด ๋ฌธ์ ์ ๋๊น ์๋๋ฉด ํ๋ฆฟํ ํจ๊ณผ์ ๋๊น(์ผ๋ถ ์ด๋ฏธ์ง๋ html2canvas์ ์ํด ํ๋ฆฟํ ํจ๊ณผ๋ก ์์ฑ๋จ)?
@brcontainer ์ด๋ฏธ์ง์ ํ์ง์ด ๋ฌธ์ ๋ผ๊ณ ์๊ฐํฉ๋๋ค. ์ ์๊ฐ์๋. ์: 100% ํ๋/์ถ์์์ ์ฌ์ง์ ๊ด์ฐฎ๊ฒ ๋ณด์
๋๋ค. ๊ทธ๋ฌ๋ 5%๋ง ํ๋ํด๋ ์ฌ์ง ํ์ง์ด ๋์ ๋๊ฒ ๋จ์ด์ง๋ ๊ฒ์ ๋ณผ ์ ์์ต๋๋ค. ์ฒจ๋ถ๋ ์ด๋ฏธ์ง๋ฅผ ์ฐธ์กฐํ์ธ์.
๋ฐํ์์ ๋ฌธ์ ์ ์๋ฅผ ๋ณด๋ ๊ฒ๋ง์ผ๋ก ํ์ ํ ์ ์์ต๋๋ค.
http://jsfiddle.net/ ์ ์ฌ์ฉํ์ฌ ๊ฐ์ ์ฅ์๋ฅผ ์๋ํ๊ณ ์ฌ๊ธฐ์ ๋งํฌ๋ฅผ ๊ฒ์ํ์ญ์์ค.
[ํธ์งํ๋ค]
html2canvas์ ์ํด ์์ฑ๋ ์บ๋ฒ์ค์ ์ ์ฉ _zoom_์ ์๋ํ ๊ฐ๋ฅ์ฑ์ด ์๋ ๊ฒฝ์ฐ (์ด๋ฏธ์ง๋ก ์ ์ฅํ๊ธฐ ์ ์) ๋ค์์ ์ฌ์ฉํด ๋ณผ ์ ์์ต๋๋ค.
ctx.webkitImageSmoothingEnabled = false;
ctx.mozImageSmoothingEnabled = false;
ctx.imageSmoothingEnabled = false;
ํ์ด์ ๋น๋๋ค
์๋ ํ์ธ์,
96DPI๋ณด๋ค ๋์ ํด์๋๊ฐ ํ์ํฉ๋๋ค. 300DPI ์ด์์ด ํ์ํฉ๋๋ค.
์ด๊ฒ์ด html2canvas์ _๊ฐ๋ฅ_ํฉ๋๊น?
์ด๋ฏธ์ง์ ํ๋ฆฟํจ๊ณผ ๋์ผํ ๋ฌธ์ ๊ฐ ์์ต๋๋ค. ํ๋ฆฟํจ์ ์ ๊ฑฐํ๊ณ ๋ณด๊ธฐ ์ข์ DPI๋ฅผ ์ ๊ณตํ๋ ์๋ฃจ์ ์ด ํ์ํฉ๋๋ค.
์ด ์์ ์ ์ํํ ์ ์๋ ๋ฐฉ๋ฒ ๋๋ ๋์ผํ ํจ๊ณผ๋ฅผ ์ป์ ์ ์๋ ๋ค๋ฅธ ๋ฐฉ๋ฒ์ ๋ํ ์๊ฐ/์ ์์ด ์์ต๋๊น?
๊ฐ์ฌ ํด์
@brcontainer ์ง๊ธ ํธ์งํ์ต๋๋ค. ๋๋ ๋น์ ์ด ์ ์ํ ๊ฒ์ํ์ง๋ง ์ฌ์ ํ ์ด๋ฏธ์ง ํ์ง์ ์ด์ด ์์ต๋๋ค. ์ฌ๊ธฐ ๋ด๊ฐ ํ ์ผ์ด ์์ต๋๋ค -
var ctx = canvas.getContext('2d');
ctx.webkitImageSmoothingEnabled = false;
ctx.mozImageSmoothingEnabled = false;
ctx.imageSmoothingEnabled = false;
var rawData = canvas.toDataURL("image/png");
์์๊ฐ ์๋ชป๋ ๊ฒฝ์ฐ ์ด๋ฏธ์ง ํฌ๊ธฐ๋ฅผ ์กฐ์ ํ๊ธฐ ์ ์ "ImageSmoothingEnabled"๋ฅผ ์ ์ฉํด์ผ ํฉ๋๋ค.
์ฝ๋ ์ํ์ http://jsfiddle.net์ ๋ฃ์ผ๋ฉด ํธ์งํด ๋ณด๊ฒ ์ต๋๋ค.
์๋ ํ์ธ์ ์ฌ๋ฌ๋ถ,
toDataURL์ 96dpi ์ ์ฝ ์์ด ๊ณ ํด์๋ ์ด๋ฏธ์ง๋ฅผ ์ ๋ก๋ํ๊ณ ์ถ์ต๋๋ค. toDataURLHD๋ ์์ง ์ฌ์ฉํ ์ ์๊ธฐ ๋๋ฌธ์ ์ด๋ป๊ฒ ๋ด ๊ฟ์ ์คํํ ์ ์์ต๋๊น? :-)
์ด๋ค ํํธ๋ผ๋ ๋ฏธ๋ฆฌ ๊ฐ์ฌ๋๋ฆฝ๋๋ค
@brcontainer ์ด๋ฏธ์ง ํฌ๊ธฐ๋ฅผ ์ ํ ์กฐ์ ํ์ง ์๊ธฐ ๋๋ฌธ์ ํฌ๊ธฐ ์กฐ์ ์ ์ ์ค๋ฌด๋ฉ์ ์ ์ฉํ๋ค๋ ๊ฒ์ด ๋ฌด์จ ๋ป์ธ์ง ์ ๋ชจ๋ฅด๊ฒ ์ต๋๋ค. ์ด์จ๋ ๋๋ ๋น์ ์ด http://jsfiddle.net/tankchintan/92mra/4/ ๋ฅผ ๋ณผ ์ ์๋๋ก jsfiddle์ ๋ง๋ค์์ต๋๋ค.
์ด ๋ฌธ์ ๊ฐ ํด๊ฒฐ๋๊ธฐ๋ฅผ ์ ๋ง ๊ธฐ๋ํฉ๋๋ค! :)
๋น์ ์ด ํผ๋์ค๋ฌ์ํ๋ ์น๊ตฌ, ํฌ๊ธฐ๋ฅผ ์กฐ์ ํด์ผ ํ๋ toDataURL
์ด ์์ต๋๋ค. CANVAS
ํฌ๊ธฐ๋ฅผ ์กฐ์ ํด์ผ ํฉ๋๋ค.
์์ ๋ฅผ ๋ง๋ค๋ ค๊ณ ํ์ง๋ง ์ฌ์ ํ ์๋ํ์ง ์์ต๋๋ค.
์๋ ํ์ธ์,
๋๋ ๋ ๋์ ์ด๋ฏธ์ง ํ์ง์ ์ํด ์ด๋ฌํ ์ ์์ ๋ฐ๋ฅด๋ ค๊ณ ๋ ธ๋ ฅํ์ง๋ง ๋์๊ฒ๋ ๋ช ํํ์ง ์์ต๋๋ค.
brcontainer, ๋น์ ์ด ๋งํ๋ ์์ด๋์ด๋ก tankchintan์ด ๋ง๋ JS ๋ฐ์ด์ฌ๋ฆฐ์ ๋ช ํํ ํ๊ฑฐ๋ ๋ณ๊ฒฝ/์์ฑํ ์ ์์ต๋๊น? 2๋ฐฐ ํฌ๊ธฐ์ ์ด๋ฏธ์ง๋ฅผ ์์ฑํ๋๋ผ๋ ์ด๋ฏธ์ง๋ฅผ 192DPI๋ก ๋ณํํ ํ์๋ ์ด๋ฏธ์ง์ ํฝ์ ํ๊ฐ ์ฌ์ ํ ๋จ์ ์์ต๋๋ค.
์๋
ํ์ธ์ ์ฌ๋ฌ๋ถ, ์ด ๋ฌธ์ ์ ๋ํ ํผ๋๋ฐฑ์ด ๋ ์์ต๋๊น? ํ์ง/ํด์๋๋ฅผ ๋์ด๊ธฐ ์ํด zoomFactor
์ค์ ํ ์ ์๋ PhantomJS์ ๋น๊ตํ์ฌ html2canvas๋ก ๋งค์ฐ ํ๋ก ์ด๋ฏธ์ง ํ์ง์ ๊ฒฝํํ๊ณ ์์ต๋๋ค.
๋น์ทํ ๋ฌธ์ ๊ฐ ์์ต๋๋ค. html2canvas๋ฅผ ์ฌ์ฉํ์ฌ div๋ฅผ ์ด๋ฏธ์ง๋ก ๋ณํํ ๋ค์ iTextsharp๋ฅผ ์ฌ์ฉํ์ฌ PDF์ ์ด๋ฏธ์ง๋ฅผ ์ถ๊ฐํ๋ PDF ๋ฌธ์๋ก ์น ํ์ด์ง์ ์ค๋ ์ท์ ๊ฐ์ ธ์์ผ ํ๋ค๋ ์๊ตฌ ์ฌํญ์ด ์์ต๋๋ค. ๊ทธ๋ฌ๋ ์์ฑ๋ ์ด๋ฏธ์ง๊ฐ ์ฝ๊ฐ ํ๋ฆฟํ๊ฒ ๋ณด์ด๋ฉฐ ๋์ผ๋ก ์ง์์ ์ผ๋ก ๋ณด๊ธฐ๊ฐ ์ด๋ ต์ต๋๋ค. html2canvas์์ ์์ฑ ์ ์์ฒด์ ์ผ๋ก ์ง์ ๋ ํด์๋์ ์ด๋ฏธ์ง๋ฅผ ์์ฑํ ์ ์๋์ง ์๊ณ ์ถ์ต๋๋ค.
์๋
ํ์ธ์,
๋๋ ์์ ๋๊ฐ์ ์๊ตฌ ์ฌํญ์ ๊ฐ์ง๊ณ ์์ต๋๋ค. ๊ทธ๋ฆฌ๊ณ ๊ฐ์ ๋ฌธ์ ๊ฐ ์ง๋ฉดํ๊ณ ์์ต๋๋ค.
"๋ด div๋ฅผ ์ด๋ฏธ์ง๋ก ๋ณํํ ๋ค์ ์ด๋ฏธ์ง๋ฅผ PDF์ ์ถ๊ฐํ๊ธฐ ์ํด html2canvas๋ฅผ ์ฌ์ฉํ๋ PDF ๋ฌธ์๋ก ์น ํ์ด์ง์ ์ค๋
์ท ๊ฐ์ ธ์ค๊ธฐ."
๊ทธ๋ฌ๋ ์์ฑ๋ ์ด๋ฏธ์ง๊ฐ ์ฝ๊ฐ ํ๋ฆฟํ๊ฒ ๋ณด์
๋๋ค.
์์ ์ ์์ ๋ฐ๋์ง๋ง ์ฌ์ ํ ํ๋ฆฟํ ์ด๋ฏธ์ง๊ฐ ๋ํ๋ฉ๋๋ค.
์ฌ๊ธฐ ๋ด ์ฝ๋์์: html2canvas๋ ์์คํ
ํด์๋๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ํ๋ ์น ํ์ด์ง์ ์ค๋
์ท์ ์์ฑํฉ๋๋ค.
์์คํ
ํด์๋์ ๋ฐ๋ผ ๋ค๋ฅธ ํฌ๊ธฐ์ ๋์ผํ ์น ํ์ด์ง "์ค๋
์ท"์ด ํ์๋ฉ๋๋ค.
์์ :
์ด๋ฏธ์ง ํฌ๊ธฐ : 816x422
์ด๋ฏธ์ง ํฌ๊ธฐ : 1193x437
์ด๋ฏธ์ง ํฌ๊ธฐ : 1275x437
์ฌ๊ธฐ์ ๋ด ๊ธฐ๋์น๋ 2000 x 1784 ์น์ ์ด์์
๋๋ค.
์ด ์ฐจ์์ ์ด๋ฏธ์ง๋ฅผ ์ป์ ์ ์์ต๋๊น?
์์คํ ์ ์์ ํด์ฃผ์๊ณ ์์คํ ์๊ฐ ๋ด์ฃผ์
์ ๊ฐ์ฌํฉ๋๋ค.
์ด๊ฒ์ ๋ํด +1. PDF์ ์ฝ์ ํ html2canvas๋ฅผ ์ฌ์ฉํ์ฌ ์ด๋ฏธ์ง๋ฅผ ์ป์ผ๋ ค๊ณ ํ์ง๋ง ํ์ง์ด ํ๋ฆฟํฉ๋๋ค.
๋ ๋์ ํด์๋๋ก ๋ด๋ณด๋ด๋ ค๋ ์์์ ๋ํด parentNode์ CSS ๋ณํ ๋งคํธ๋ฆญ์ค๋ฅผ ์ฌ์ฉํด ๋ณด์ จ์ต๋๊น? ์ด๊ฒ์ ๋๋ฅผ ์ํด ์๋ํฉ๋๋ค. ์: "๋ณํ: scale(2, 2)"
@mudcube ๋ ๋ถ๋ถ์ ์ผ๋ก ๋๋ฅผ ์ํด ์ผํ์ต๋๋ค.
@brcontainer ๊ทธ๊ฒ์ ๋๋ฅผ ์ํด ์ ์๋ํฉ๋๋ค
ํด๊ฒฐ์ฑ ์ด ์์ต๋๊น?? ํ๋ฆฟํ ์ด๋ฏธ์ง์ ํด์๋๋ฅผ ๋์ด๋ ๋ฐฉ๋ฒ์ ๊ณต์ ํ์ญ์์ค. ๋๋ ๊ทธ๊ฒ์ pdf๋ฅผ ๋ง๋ค์ด์ผ ํฉ๋๋ค.
+1 ์ด์ ๋ํ ์๋ฃจ์ /์ง์นจ์ด ์์ง ์์ต๋๊น?
์ด๋ค ํด๊ฒฐ์ฑ ์ ์ฐพ์์ต๋๊น?
์ฌ๋ฌ๋ถ, transform: scale(2, 2)
ํ๋ฉด ์ ๋ฉ๋๋ค.
์์ธํ ๋ด์ฉ์ ์ ๊ณตํ ์ ์์ต๋๊น?
@matiasinsaurralde ์คํฌ๋ฆฐ์ท์ ๋ง๋ค๊ธฐ ์ง์ ์ ์์์ css ๊ท์น์ด ํฌํจ๋ css ํด๋์ค .x2
๋ฅผ ์์์ ์ถ๊ฐํ ๋ค์ html2canvas
์ฝ๋ฐฑ์์ ํด๋น ํด๋์ค๋ฅผ ์ ๊ฑฐํฉ๋๋ค. ๋ ๋ฐฐ ํฌ๊ธฐ์ ์์์ ๋ ๋ฐฐ ํฌ๊ธฐ์ ์คํฌ๋ฆฐ์ท๋ ์ป์ ์ ์์ต๋๋ค. ๊ทธ๋ฆฌ๊ณ ๊ทธ๊ฒ์ ๋งค๋๋ฝ๊ธฐ ๋๋ฌธ์ ํฌ๊ธฐ ์กฐ์ ์ ๊ด์ฐฐํ์ง ์์ ๊ฒ์
๋๋ค.
@Ajaxy ์ ์์ ๋ฐ๋ฅด๋ ค๊ณ ํ ๋์ ์คํฌ๋ฆฐ์ท. ๋ด ์ฝ๋์ ๋ฌธ์ ๊ฐ ์๋ค๊ณ ์๊ฐํฉ๋๊น? ํ์ด์ง๋ฅผ ๋ ๋๋งํ๋ ๋ฐ ๋๋ฌด ์ค๋ ๊ฑธ๋ ธ์ต๋๋ค.
์ค์ผ์ผ์ ๋๋ฅผ ์ํด ํด์๋๋ฅผ ์ฆ๊ฐ์ํค์ง ์์์ต๋๋ค. JS๋ก ํด๊ฒฐํด์ผํ์ต๋๋ค -
https://github.com/niklasvh/html2canvas/issues/379
ํ์ด์ ๋น๋๋ค ์ฌ๋ฌ๋ถ?
transform: scale(2, 2);
๋ dygraph.js์ ๋ํ ์๋ฃจ์
๋ ์๋๋๋ค.
@premerddyn , ์ฐ๊ฒฐ๋ ๋ฌธ์ ์์ ๋ด ์๋ฃจ์
์ ์ฐธ์กฐํ์ญ์์ค.
์ ์๋ํ์ง๋ง ์คํฌ๋ฆฐ์ท ์ ์ ํ๋ํด์ผ ํฉ๋๋ค.
๋ด ์๊ฒฌ์ด ๋ช
ํํ์ง ์์ผ๋ฉด ๋ ๋ง์ ์ค๋ช
์ ์ถ๊ฐํ๊ฒ ์ต๋๋ค.
๊ธ์, ๋ด๊ฐ ํ ์ผ์ ๋ ๋ฐฐ ํฌ๊ธฐ์ div๋ฅผ ๋ง๋ค๊ณ ๊ฐ์์ฑ์ ์ถ์ํ๊ณ ์ฌ๊ธฐ์ ์๋ ๋ชจ๋ ์ฝํ ์ธ ๋ฅผ ํด๋น div์ ๊ฒ์ํ๊ณ ์คํฌ๋ฆฐ์ท์ ์ฐ์ ๊ฒ์ ๋๋ค. ๊ทธ๋ฐ ์์ผ๋ก ์ด๋ฏธ์ง ์ ๋ช ๋๊ฐ ์์ค๋์ง ์๊ณ ๊ธ๊ผด ํฌ๊ธฐ ์ฝ๋๋ฅผ ์์ ํ์ฌ ๋ง๋ค์์ต๋๋ค. ์๋ํฉ๋๋ค.์ ์๋ํฉ๋๋ค.ํ์ง๋ง ๋ด ๋ฌธ์ ๋ ํ ์คํธ ์คํธ๋กํฌ ๋ฐ ์ฌ๋ฌ ์ค ํ ์คํธ ๋ฐฐ๊ฒฝ์ ์์ต๋๋ค.
2๋ก ์ค์ผ์ผ๋งํ๋ฉด ํจ๊ณผ๊ฐ ์์ง๋ง ๋ ๋๋ง์ด ์ฐฝ ํด์๋/ํฌ๊ธฐ์ ์ํด ์ ํ๋๋ค๋ ๊ฒ์ ์์์ต๋๋ค. ํฌ๊ธฐ๊ฐ ์กฐ์ ๋ div๊ฐ ์ฐฝ๋ณด๋ค ๋์ผ๋ฉด ์ผ๋ถ๊ฐ ์๋ฆฝ๋๋ค.
๊ทธ๋์ ํ๋ฉด๋ณด๋ค ํฐ ์บ๋ฒ์ค๋ฅผ ์บก์ณํ๋ ๋ฐฉ๋ฒ์ ์๋์?
์, ์ด ์ค๋ ๋์์:
var h = $(element)[0].ownerDocument.defaultView.innerHeight;
$(element)[0].ownerDocument.defaultView.innerHeight = $(element).height();
html2canvas($(element)).then(function(canvas) {
$(element)[0].ownerDocument.defaultView.innerHeight = h;
//Do whatever you want with your canvas
}
https://jsfiddle.net/enjoythedaycsk/9L966sdd/1/
์ด ์์์ ๊ณ ํด์๋๋ฅผ ๋ฌ์ฑํ๋ ค๊ณ ํ์ง๋ง ์ป์ง ๋ชปํ์ต๋๋ค ...
pngx2 ๋ค์ด๋ก๋ ๋ฒํผ์ ํด๋ฆญํ์ธ์..
๋ฒํผ์ ํด๋ฆญํ๋ฉด ์บ๋ฒ์ค๊ฐ ๋ ๋ฐฐ ํฌ๊ธฐ๋ก ๋ฐ๋๊ณ ์ฌ์ง์ด ์บก์ฒ๋๊ณ ๋ค์ ์บ๋ฒ์ค๊ฐ ์ผ๋ฐ ํฌ๊ธฐ๋ก ๋์์ค๋ ๊ฒ๊ณผ ๊ฐ์ ๋ฐฑ์๋์์ ์์ ์ ์ํํ ์ ์์ต๋๊น?
๋ฌผ๋ก ๊ทธ๋ ๊ฒ ํ ์ ์์ต๋๋ค. ๋๋ ๋ด๊ฐ ์ํ๋ ํฌ๊ธฐ์ ์บ๋ฒ์ค๋ฅผ ์ฌ์ฉํ์ฌ
์ฝ๋ ์ ๊ณต. ๊ฐ์ ๊ตฌํ๋ ๊ฒ์ด ๋ถ์ ํํ ์ ์๋ค๋ ๊ฒ์ ์์์ผ๋ฏ๋ก
๋๋น/๋์ด๋ฅผ ์ง์ ์ค์ ํฉ๋๋ค.
2016๋ 5์ 7์ผ ํ ์์ผ์ enjoytheday [email protected] ์ ๋ค์๊ณผ ๊ฐ์ด ์ผ์ต๋๋ค.
https://jsfiddle.net/enjoythedaycsk/9L966sdd/1/
์ด ์์์ ๊ณ ํด์๋๋ฅผ ๋ฌ์ฑํ๋ ค๊ณ ์๋ํ์ง๋ง ์ป์ง ๋ชปํ์ต๋๋ค.
์ ๊ฒ...pngx2 ๋ค์ด๋ก๋ ๋ฒํผ์ ํด๋ฆญํ์ธ์..
๋ฒํผ์ ํด๋ฆญํ ๋์ ๊ฐ์ด ๋ฐฑ์๋์์ ์์ ์ ์ํํ ์ ์์ต๋๊น?
์บ๋ฒ์ค๊ฐ ๋ ๋ฐฐ ํฌ๊ธฐ๋ก ๋ฐ๋๊ณ ์ฌ์ง์ด ์บก์ฒ๋๊ณ ๋ค์
์บ๋ฒ์ค๋ฅผ ๋ค์ ์ผ๋ฐ ํฌ๊ธฐ๋ก ๊ฐ์ ธ์ต๋๋ค..โ
๋น์ ์ด ๋๊ธ์ ๋ฌ์๊ธฐ ๋๋ฌธ์ ์ด๊ฒ์ ๋ฐ๋ ๊ฒ์ ๋๋ค.
์ด ์ด๋ฉ์ผ์ ์ง์ ๋ต์ฅํ๊ฑฐ๋ GitHub์์ ํ์ธํ์ธ์.
https://github.com/niklasvh/html2canvas/issues/241#issuecomment -217634634
์ธ๊ณ์์ ๊ฐ์ฅ ์ค๋ ์ง์๋๋ ์ผ๋ฌ์คํธ๋ ์ด์
ForeverScape.com http://www.foreverscape.com/ | @foreverscape
https://twitter.com/foreverscape | Github์์
https://github.com/vance/foreverscapecore | ๋ด์ค์์
http://www.foreverscape.com/art/reviews/
@vance jsfiddle ์์ ์์ ์ด๊ฒ์ ์ค์ ํ ์ ์์ต๋๊น?
https://jsfiddle.net/enjoythedaycsk/9L966sdd/1/
์๋ํ์ง๋ง ๋ด๊ฐ ์ค์ ํ์ง ์์์ต๋๋ค.
์์ ํ ํธ์งํ๊ฑฐ๋ ์๋ก ๋ง๋ค ์ ์์ต๋๋ค.
๋ง์ ์ฌ๋๋ค์๊ฒ ๋์์ด ๋ ๊ฒ์ ๋๋ค :๋์:
์ฌ๋นจ๋ฆฌ ์กฐ๋กฑํ๋ ค๊ณ ํ์ง๋ง ํ
์คํธ div๋ฅผ ๊ณ ์น ์๊ฐ์ด ์์์ต๋๋ค. div์ ๋ด๋ถ ๋์ด๊ฐ ์ํฅ์ ๋ฐ์ง _NOT_ ๋๋ฌธ์ transform:scale()
๋ฌด์ธ๊ฐ๋ฅผ ์บก์ฒํ๋ ๊ฒ์ ์๋ฌด ์ผ๋ ํ์ง ์์ต๋๋ค. ๊ทธ๋ ๊ธฐ ๋๋ฌธ์ ๋ณํ์
๋๋ค. w/h ์์ฑ์ (๋ด๋ถ์ ์ผ๋ก) ๋ณ๊ฒฝ๋์ง ์์์ผ๋ฉฐ getBoundingClientRect()
์ ๊ฐ์ ธ์ ํ
์คํธํ ์ ์์ต๋๋ค. ๋ถ๋ชจ์ ์ปจํ
์คํธ์์ ๋ณผ ๋ ๋๋น/๋์ด๋ง _actually_ ๋ณ๊ฒฝ๋ฉ๋๋ค. ํฌ๊ธฐ๊ฐ ์กฐ์ ๋ ํ ์ปจํ
์ด๋ div๋ฅผ ๊ฐ์ ธ์์ผ ํฉ๋๋ค.
๋์ผํ ๋ฌธ์ ์ ์ง๋ฉดํด ์์ต๋๋ค. ์คํ ๊ฐ๋ฅํ ์๋ฃจ์ ์ด ์์ต๋๊น?ใพ(ยด๏ฝฅ ๏ฝฅ๏ฝ๏ฝก)ใ"
์ฐฝ๋ณด๋ค ํฐ ์์๋ฅผ ์บก์ฒํ๊ธฐ ์ํด ์๋ํ๋๋ก ํ ์ ์์์ต๋๋ค. ๋ณํ๋ ์์์์ ๋จ์ํ "๋ ํฐ" ์ด๋ฏธ์ง๋ฅผ ์ป์ ์ ์๋ค๋ ๊ฒ์ ๊ธฐ์ตํ์ญ์์ค. ์๋ํ๋ฉด (์์ฒด์ ์ผ๋ก) ์ฌ์ ํ ๋์ผํ ์น์๋ฅผ ๊ฐ๊ธฐ ๋๋ฌธ์ ๋๋ค.
iframe์์ ์์ ์ ์ํํ๊ณ base64 ๋ฐ์ดํฐ๋ฅผ ๋ฉ์์ง๋ก ๋ค์ ๋ณด๋ด์ผ ํ์ต๋๋ค. ์๋ํ๋ฉด ๋ค์์ ์ํํ๋ฉด ์ฐฝ ํฌ๊ธฐ ์กฐ์ ์ด๋ฒคํธ๊ฐ ์ค๋จ๋๊ธฐ ๋๋ฌธ์ ๋๋ค.
๋ค์ ๋๊ธ๋ก:
//store the original size
var h = $(element)[0].ownerDocument.defaultView.innerHeight;
var w = $(element)[0].ownerDocument.defaultView.innerWidth;
//set the document to the element's size
$(element)[0].ownerDocument.defaultView.innerHeight = $(element).height();
$(element)[0].ownerDocument.defaultView.innerWidth = $(element).width();
html2canvas($(element)).then(function(canvas) {
//restore the document size
$(element)[0].ownerDocument.defaultView.innerHeight = h;
$(element)[0].ownerDocument.defaultView.innerWidth = w;
//Do whatever you want with your canvas
}
html2canvas๋ฅผ ์ฌ์ฉํ์ฌ HTML ์์์์ ๋ ๋์ DPI ์คํฌ๋ฆฐ์ท์ ์ฝ๊ฒ ์ป๊ธฐ ์ํด ๋ค์ ํจ์๋ฅผ ์์ฑํ์ต๋๋ค.
srcEl
๋ ๊ธฐ์กด ์์์ฌ์ผ ํฉ๋๋ค.destIMG
๋ ๊ธฐ์กด(๋น) ์ด๋ฏธ์ง ์์์ฌ์ผ ํฉ๋๋ค.dpi
๋ 96์ ๋ฐฐ์์ฌ์ผ ํฉ๋๋ค.var makeHighResScreenshot = function(srcEl, destIMG, dpi) {
var scaleFactor = Math.floor(dpi / 96);
// Save original size of element
var originalWidth = srcEl.offsetWidth;
var originalHeight = srcEl.offsetHeight;
// Save original document size
var originalBodyWidth = document.body.offsetWidth;
var originalBodyHeight = document.body.offsetHeight;
// Add style: transform: scale() to srcEl
srcEl.style.transform = "scale(" + scaleFactor + ", " + scaleFactor + ")";
srcEl.style.transformOrigin = "left top";
// create wrapper for srcEl to add hardcoded height/width
var srcElWrapper = document.createElement('div');
srcElWrapper.id = srcEl.id + '-wrapper';
srcElWrapper.style.height = originalHeight*scaleFactor + 'px';
srcElWrapper.style.width = originalWidth*scaleFactor + 'px';
// insert wrapper before srcEl in the DOM tree
srcEl.parentNode.insertBefore(srcElWrapper, srcEl);
// move srcEl into wrapper
srcElWrapper.appendChild(srcEl);
// Temporarily remove height/width constraints as necessary
document.body.style.width = originalBodyWidth*scaleFactor +"px";
document.body.style.height = originalBodyHeight*scaleFactor +"px";
window.scrollTo(0, 0); // html2canvas breaks when we're not at the top of the doc, see html2canvas#820
html2canvas(srcElWrapper, {
onrendered: function(canvas) {
destIMG.src = canvas.toDataURL("image/png");
srcElWrapper.style.display = "none";
// Reset height/width constraints
document.body.style.width = originalBodyWidth + "px";
document.body.style.height = originalBodyHeight + "px";
}
});
};
์ฉ๋ฒ:
var src = document.getElementById("screenshot-source");
var img = document.getElementById("screenshot-img");
makeHighResScreenshot(src, img, 192); // DPI of 192 is 4x resolution (2x normal DPI for both width and height)
์ด๋ ๊ฒ ํ๋ฉด window.onresize ์ด๋ฒคํธ ํธ๋ค๋ฌ๋ ์ค๋จ๋๋ค๋ ์ฌ์ค์ ์์์ต๋๊น? ์ด๋ฌํ ์ด์ ๋ก iframe ๋ด์์ ์ด ๋ชจ๋ ์์ ์ ์ํํ๊ณ ๋ด์ฉ์ ๋ฐํํ๊ธฐ ์ํด parent.window.postMessage(data)๋ฅผ ์ฌ์ฉํ์ฌ ๊ฒฐ๊ณผ๋ฅผ ๋ค์ ๊ฒ์ํด์ผ ํ์ต๋๋ค. ์ด๊ฒ์ ๋ชจ๋ฐ์ผ ์ฑ์ด๊ธฐ ๋๋ฌธ์ ๋์๊ฒ๋ง ์ค์ํ๋ฉฐ onsize fire๋ฅผ ๊ฐ๋ ๊ฒ์ด ์ค์ํฉ๋๋ค.
@vance : ์ ๊ฒฝ์ฐ์๋ ๊ทธ๋ฐ ๊ฒ๋ค์ด ํ์ํ๊ฑฐ๋ ์ฌ์ฉํ์ง ์์ต๋๋ค. ์ค์ ๋ก HTML-to-PDF ๋ ๋๋ฌ์ ๋ฒ๊ทธ๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด ์ด๊ฒ์ ์ฌ์ฉํ๊ณ ์์ต๋๋ค. ๊ทํ์ ๋ฐฉ๋ฒ์ ๋ํ ์ ์ฒด ์๋ฅผ ๋ณด๊ณ ์ถ์ต๋๋ค. ๋ ์ ์ฐํด ๋ณด์ ๋๋ค.
๋ชธ์ ํฌ๊ธฐ๋ฅผ ์กฐ์ ํ ํ์๊ฐ ์๋ ๊ณ ํด์๋ ์ด๋ฏธ์ง๋ฅผ ์ป๋ ๋ค๋ฅธ ๋ฐฉ๋ฒ์ ์ฐพ์์ต๋๋ค. ๊ทธ๋ฌ๋ html2canvas์ ๋ฒ๊ทธ(#790, #820, #893, #922 ๋ฑ)๋ก ์ธํด ์์ค ์์์ ์์น๋ฅผ โโ์ ๋์ ์ผ๋ก ์ง์ ํด์ผ ํฉ๋๋ค. @MisterLamb ์ ๋ ํฐ๋ ์ฝ๋๋ฅผ ๊ธฐ๋ฐ์ผ๋ก
function takeHighResScreenshot(srcEl, destIMG, scaleFactor) {
// Save original size of element
var originalWidth = srcEl.offsetWidth;
var originalHeight = srcEl.offsetHeight;
// Force px size (no %, EMs, etc)
srcEl.style.width = originalWidth + "px";
srcEl.style.height = originalHeight + "px";
// Position the element at the top left of the document because of bugs in html2canvas. The bug exists when supplying a custom canvas, and offsets the rendering on the custom canvas based on the offset of the source element on the page; thus the source element MUST be at 0, 0.
// See html2canvas issues #790, #820, #893, #922
srcEl.style.position = "absolute";
srcEl.style.top = "0";
srcEl.style.left = "0";
// Create scaled canvas
var scaledCanvas = document.createElement("canvas");
scaledCanvas.width = originalWidth * scaleFactor;
scaledCanvas.height = originalHeight * scaleFactor;
scaledCanvas.style.width = originalWidth + "px";
scaledCanvas.style.height = originalHeight + "px";
var scaledContext = scaledCanvas.getContext("2d");
scaledContext.scale(scaleFactor, scaleFactor);
html2canvas(srcEl, { canvas: scaledCanvas })
.then(function(canvas) {
destIMG.src = canvas.toDataURL("image/png");
srcEl.style.display = "none";
});
};
์ฉ๋ฒ:
var src = document.getElementById("screenshot-src");
var img = document.getElementById("screenshot-img");
takeHighResScreenshot(src, img, 2); // This time we provide desired scale factor directly, no more messing with DPI
ํธ์ง: ์ ์์ ๋ํ @jason-o-matic ๋๋ถ์ ์ค์ ๋ก ์์๋ฅผ ์ด๋ํ๊ณ ์ฌ๋ฐฑ์ ์กฐ์ ํ๋ ๋์ ์ ๋ ์์น๋ฅผ ์ฌ์ฉํ์ฌ ํดํน์ ์ค์์ต๋๋ค.
์ด๊ฒ์ ์ต์ ๋ฒ์ (0.5.0-alpha)์์ ์๋ํฉ๋๋ค. ํ์ง๋ง 0.4.1์ด ์๋๋๋ค.
0.4.1์์ ์ด ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๋ ค๋ฉด ์บ๋ฒ์ค ํฌ๊ธฐ๋ฅผ ๊ฐ์ง๊ณ ๋์์ผ ํฉ๋๋ค.
@airdrummingfool ์ ์์ ์ฌํญ(ํ๋ฅญํ๊ฒ ์๋ํจ)์ ์ฌ์ฉํ๋ ์ฌ๋์ ์ํ ๊ฐ๋จํ ๋ฉ๋ชจ...
xtree๊ฐ ์ผ๋ง๋ ๋ฉ๋ฆฌ ์๋์ง์ ์๊ด์์ด ์คํฌ๋ฆฐ ๋คํํ๋ ค๋ ์์๋ฅผ ๋ํํ๋ "์๋์ " ์์๋ฅผ ๊ฐ์ง ์ ์์ต๋๋ค. ํ๋ฉด ๋คํ ๊ธฐ๊ฐ ๋์ ์ ์ ์ผ๋ก ์ ํํด์ผ ์ํ๋ ์์๊ฐ ์ค์ ๋ก ์ฃผ๋ณ DIV๊ฐ ์๋ ์ฐฝ์ ๊ธฐ์ค์ผ๋ก 0,0์ ๋ํ๋ฉ๋๋ค.
์ด ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๋ ๋ฐ ๋ช ์๊ฐ์ด ๊ฑธ๋ ธ์ผ๋ฏ๋ก ์ด๊ฒ์ด ๋๊ตฐ๊ฐ๊ฐ ๊ฐ์ ๋ฌธ์ ๋ฅผ ํผํ๋ ๋ฐ ๋์์ด ๋๊ธฐ๋ฅผ ๋ฐ๋๋๋ค.
์ข์ ์คํ์
๋๋ค ์ฌ๋ฌ๋ถ,
์๋ฌด๋ @airdrummingfool ์๋ฃจ์
์ jsfiddle์ ๊ฐ์ง๊ณ ์์ต๋๊น? ์ด์ด ์์ผ๋ฉด ๋ด ํ๋ก์ ํธ์์ ๊ตฌํํ๋ ค๊ณ ํฉ๋๋ค. ์ค์ ์์ ๋ ์ด๊ฒ์ด ์ด๋ป๊ฒ ์๋ํ๋์ง ์ดํดํ๋ ๋ฐ ํฐ ๋์์ด ๋ ๊ฒ์ด๋ฉฐ ๋ด ํ๋ก์ ํธ์์ ์ด๋ฅผ ๊ตฌํํ๋ ๋ฐ ํฐ ๋์์ด ๋ ๊ฒ์
๋๋ค.
์ ๊ณตํ ์ ์๋ ๋ชจ๋ ์ง์์ ๋ํด ๋๋จํ ๊ฐ์ฌํฉ๋๋ค.
์๋ ํ์ธ์ ์ฌ๋ฌ๋ถ! @airdrummingfool ์๋ฃจ์ ์ ์ฌ์ฉํ๋ ค๊ณ ํฉ๋๋ค. ํ์ง๋ง ์ง์ฆ๋๋ ์ค๋ฅ๊ฐ ํ๋ ๋ฐ์ํฉ๋๋ค. ์ด๋ฏธ์ง๋ฅผ ๊ฐ์ ธ์ค๋ ค๋ ์์ ๋ด๋ถ์๋ ์์์ ์ ์ฐจ๋ฅผ ์ํํ ๋ img ์์๋ ๊ณต๋ฐฑ์ด ๋๊ณ src๋ ๋ฌด์๋ฉ๋๋ค. ์ด ๋ฌธ์ ๋ฅผ ์ด๋ป๊ฒ ํด๊ฒฐํ ์ ์๋์ง ์์ญ๋๊น? ๋๊ตฌ๋ ์ง html2canvas์์ ์ด ๋ฌธ์ ์ ์ง๋ฉดํ ์ ์ด ์์ต๋๊น?
์ด ์ค๋ ๋์ ๋ฏธ๋ฆฌ ๊ฐ์ฌ๋๋ฆฝ๋๋ค! ๋ ๊ตฌํ๊ณ ์์ด!! :NS
ํธ์ง: ๋ํ ๋ ๋๋ง๋ ์ด๋ฏธ์ง์ ์ ๋ฐ๋ง ์ป๊ณ ์์ต๋๋ค. ํ์ง๋ง ํด์๋๋ ์๋ฒฝํด ๋ณด์ ๋๋ค xD
์ด๋ฏธ์ง๋ฌธ์ ์์ !! useCORS๊ฐ ํ์ฑํ๋์ง ์์์ต๋๋ค! ํ์ง๋ง ์ฌ์ ํ ๋ ๋๋ง๋ ์ด๋ฏธ์ง์ ์ ๋ฐ๋ง ๋ฐ๊ณ ์์ต๋๋ค.
์์ฒญ๋! ์ ๋ฐ ์ด๋ฏธ์ง๋ ์บ๋ฒ์ค ์ธ ๋ ๋๋ง ๋ฌธ์ ๋ก ์ธํ ๊ฒ์ผ ์ ์์ต๋๋ค. ๋ํ html2canvas์ ํด์๋/ํฌ๊ธฐ ์กฐ์ ์ @airdrummingfool ์๋ฃจ์ ๋ณด๋ค ์ฌ์ฉํ๊ธฐ๊ฐ ๋ ์ฝ์ต๋๋ค.
๊ทธ๊ฒ๋ค์ด html2canvas์ ๋ณํฉ๋ ๋๊น์ง ์ฌ๊ธฐ์์ ์ด ๋ ๊ฐ์ง์ ๋ช ๊ฐ์ง ๋ค๋ฅธ ๋ฒ๊ทธ ์์ ์ผ๋ก ๋ด ์ฌ์ฉ์ ์ ์ ๋น๋๋ฅผ ์ป์ ์ ์์ต๋๋ค .
์๋ ํ์ธ์ @eKoopmans์ ๋๋ค. ๋ต๋ณํด ์ฃผ์ ์ ๊ฐ์ฌํฉ๋๋ค. ๋ฐฉ๊ธ ๋์ด์ 2๋ฅผ ๊ณฑํ์ฌ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ์ต๋๋ค. ํ์ง๋ง ์์ ์๋์ ๊ณต๋ฐฑ์ด ์๋ ๋ ํฐ ์ด๋ฏธ์ง๋ฅผ ์ป์ ๊ฒ ๊ฐ์ต๋๋ค... ๊ทธ๋์... ๊ทํ์ ์ด๋ฏธ์ง๋ฅผ ์๋ํ๊ณ ๋ช ๋ถ ํ์ ๋ค์ ๋ณด๊ณ ํ๊ฒ ์ต๋๋ค. !
OM(F)G @eKoopmans .. ๋น์ ์ ๊ฒ์ ์ฆ์ ์๋ํฉ๋๋ค. ๊ณ ๋ง์์. ๊ทธ ํ ๋ฆฌํ์คํธ... ์ง๊ธ ์๋ฝํด์ผ ํฉ๋๋ค. html2canvas์ ์ด dpi ์ต์ ์ ์ํ๋ ์ฌ๋๋ค์ด ๋ง์ด ์์ต๋๋ค.
#1087 ์ฐฌ์ฑ์ผ๋ก ๋ง๊ฐ
@airdrummingfool ... ๊ฐ์ฌํฉ๋๋ค. ์๋ฒฝํ๊ฒ ์๋ํฉ๋๋ค.
https://github.com/cburgmer/rasterizeHTML.js ๋ฅผ ์ฌ์ฉํ ์ ์์ต๋๋ค.
์ต์ ๋ฒ์ ์ html2canvas๋ ํฌ๊ธฐ ์กฐ์ ์ต์ ์ ์ ๊ณตํฉ๋๋ค. ์ ๋ง ์ ์๋ํฉ๋๋ค.
html2canvas(์์, {
๊ท๋ชจ: 2
});
html ๋ฐ ์ด๋ฏธ์ง ์ฝํ
์ธ ์์ ์ฌ๋ฌ ํ์ด์ง pdf ๋ ๋๋ง์ ๊ฒฝ์ฐ scale: 1
์ค์ ํ๋ฉด ํด์๋ ๋ฌธ์ ๊ฐ ํด๊ฒฐ๋๊ณ ๋์์ ์ด๋ฏธ์ง๊ฐ pdf ํ
๋๋ฆฌ๋ฅผ ์ด๊ณผํ๋ ๊ฒ์ ๋ฐฉ์งํ ์ ์์ต๋๋ค.
๋๋ ์ด๊ฒ์ด ๋์์ด๋๋ค๊ณ ์๊ฐํฉ๋๋ค. ๋๋ html2canvas๋ฅผ ์ฌ์ฉํ์ต๋๋ค.
๋ค์ด๋ก๋pdf() {
var ๋ฌธ์ = ์๋ก์ด jsPDF({
ํ์: "a4"
});
html2canvas(document.getElementById("pdf-doc"), {
๊ท๋ชจ: "5"
}).then(์บ๋ฒ์ค => {
this.imgFile = ์บ๋ฒ์ค;
doc.addImage(this.imgFile, "JPEG", 5, 5, 200, 285);
doc.save("ํ์ผ๋ช
" + ".pdf");
});
}
๊ฐ์ฅ ์ ์ฉํ ๋๊ธ
์ด๊ฒ์ ๋ํด +1. PDF์ ์ฝ์ ํ html2canvas๋ฅผ ์ฌ์ฉํ์ฌ ์ด๋ฏธ์ง๋ฅผ ์ป์ผ๋ ค๊ณ ํ์ง๋ง ํ์ง์ด ํ๋ฆฟํฉ๋๋ค.