์๋
, ์๋ค์.
๋ด ๋ํ ์์์ ์ด๋ฏธ์ง๋ฅผ ์์ฑํด์ผ ํฉ๋๋ค.
html2canvas๋ฅผ ์ฌ์ฉํ์ง๋ง ์ด๋ฏธ์ง ์์ฑ ์ ์ง๋๊ฐ ํ์๋์ง ์์ต๋๋ค.
๋ด ์ฝ๋:
function imagem()
{
var html2obj = html2canvas($('#dialogPrint'));
var queue = html2obj.parse();
var canvas = html2obj.render(queue);
var img = canvas.toDataURL();
window.open(img);
};
๋์์ด ํ์ํฉ๋๋ค.
๊ฐ์ฌ ํด์
๋ฌธ์ ๋ Google ์ง๋๊ฐ html2canvas์์ ์์ ํ ๊ตฌํ๋์ง ์์ CSS3 ๋ณํ ๋งคํธ๋ฆญ์ค๋ฅผ ์ฌ์ฉํ๋ค๋ ๊ฒ์ ๋๋ค.
์ด๋ป๊ฒ ํด์ผ ํ๋์?
Google ์ง๋ ์ด๋ฏธ์ง(์ธ๋ถ ์๋ฒ์ ์ด๋ฏธ์ง)?
ํ๋ก์ ์ฌ์ฉ: https://github.com/niklasvh/html2canvas#how -does-it-work
brcontainer: ๋ถ๋ฒ์ด๋ผ๊ณ ์๊ฐํฉ๋๋ค(๋ค๋ฅธ ์ปดํจํฐ /proxy/์์ ์ง์ ์ง๋ ํ์ผ์ ์ก์ธ์ค). ์ ์ผํ ๋ฐฉ๋ฒ์ CORS๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ ๋๋ค.
@bkralik ํ๋ก์๋ "์ฐจ๋จ๋ ์ฌ์ดํธ"์ ์ก์ธ์คํ๊ธฐ ์ํ html2canvas์ฉ ํ๋ก์๊ฐ ์๋ฐ์คํฌ๋ฆฝํธ API๊ฐ ๋ก์ปฌ ์ฌ์ดํธ์ ์๋ ๊ฒ์ฒ๋ผ ์ธ๋ถ ์๋ฒ์์ ์ด๋ฏธ์ง๋ฅผ ์ด ์ ์๋๋ก ํ๋ ๊ฒฝ์ฐ ํ๋ก์ ์ฉ์ด๋ ๋ค๋ฅธ ๊ฒ์ ์๋ฏธํฉ๋๋ค.
ํ๋ก์๋ ๋ค์ด๋ก๋ํ ์ธ๋ถ ์๋ฒ๋ฅผ ๋ง๋ค๊ณ html2canvas๋ ๋ค์ด๋ก๋๊ฐ ์๋ฃ๋ ํ์๋ง ์ด๋ฏธ์ง๋ฅผ ๋ก๋ํฉ๋๋ค.
์ฃผ์ ๋ฅผ ์ดํดํ๋ ค๋ฉด http://en.wikipedia.org/wiki/Same_origin_policy ๋ฅผ ์ฝ์ผ์ญ์์ค.
์ด ํ๋ก์๋ฅผ ์ด๋ป๊ฒ ์ฌ์ฉํฉ๋๊น?
ํ๋ก์ ์ฌ์ฉ์ ๋ํ ๋ชจ๋ ๋งํฌ๋ฅผ ์ฌ์ฉํ ๋งํฌ(php ์ธ์ด , C#(asp.net), python ๋ฐ VB(asp ํด๋์)).
ํ๋ก์์ ๋ํ ๋งํฌ๋ฅผ ๋์น์ฑ์ง ๋ชปํ์ ์๋ ์์ต๋๋ค. ๊ทธ๋ฌ๋ฉด ์ฌ๊ธฐ์์ ์๋ ค ๋๋ฆฌ๊ฒ ์ต๋๋ค.
https://github.com/niklasvh/html2canvas/wiki/Proxies
์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ฌ์ฉํ ๋๋ ํญ์ ์ ์ฒด README๋ฅผ ์ฝ๋ ๊ฒ์ด ์ข์ต๋๋ค.
@brcontainer ์ด ํ๋ก์๊ฐ ํ๋ ์ผ์ ์๊ณ ์์ต๋๋ค. ํด๋ผ์ด์ธํธ๊ฐ ํ์ด์ง๋ฅผ ์คํฌ๋ฆฐ์ทํ๊ณ ์ถ์ ๋ SERVER๊ฐ ๋ชจ๋ ์ฌ์ง์ ๋ก์ปฌ ํด๋์ ๋ค์ด๋ก๋ํ ๋ค์ ํด๋ผ์ด์ธํธ๊ฐ ๋ก๋ํฉ๋๋ค. ํ์ง๋ง ๊ทธ๊ฑด ์๋ชป๋ ๊ฒ์ ๋๋ค. Google์ ํ์ผ ์๋ฒ๋ฅผ ์ง์ ์ฌ์ฉํ๋ ๊ฒ์ ํ์ฉํ์ง ์๊ธฐ ๋๋ฌธ์ ๋๋ค. ๊ทธ๋ฆฌ๊ณ ๊ทธ๋ค์ ๊ด์ ์์ ๋๊ตฐ๊ฐ ์นํ์ด์ง๋ฅผ ๋ณด์ง ์๊ณ ๊ฐ์๊ธฐ ๋ง์ ํ์ผ์ ์๋ฒ์ ๋ค์ด๋ก๋ํ๊ณ ์์ต๋๋ค...
๋๋ ์๋ฐ๋ฅผ ์ฌ์ฉํ๊ณ ์์ต๋๋ค.
ํ๋ก์๋ฅผ ์ฌ์ฉํ๋ ์๊ฐ ์์ต๋๊น?
@brcontainer ๊ทธ๋ฆฌ๊ณ ๋ด๊ฐ ์ธ๊ธํ ๊ฒ์ฒ๋ผ CSS3 ๋ณํ์๋ ์ค์ ๋ก ๋ฌธ์ ๊ฐ ์์ต๋๋ค. Google ํฌ๋กฌ์์ ์คํ๋๋ googlemaps๊ฐ ์ด๋ฅผ ์ฌ์ฉํ๊ธฐ ๋๋ฌธ์ ํ์ฌ ๊ตฌํ์์๋ ๋งต์ ์คํฌ๋ฆฌ๋ํ ์ ์๊ธฐ ๋๋ฌธ์ ๋๋ค. ์ ๋ฅผ ๋ฏฟ์ผ์ธ์. ์ ๊ฐ ์์ฑํ ํ๋ก์ ํธ์ ์ด ๋ฌธ์ ๊ฐ ์์์ต๋๋ค...
@bkralik ๊ทธ๋์, ์ด๋ป๊ฒ ํ ์ ์์ต๋๊น?
์๊ฐ ์์ต๋๊น?
๋๋ ์๋ฐ๋ก ํ๋ก๊ทธ๋๋ฐ์ ํ์ง๋ง(์ด๋ฏธ PHP, C # ๋ฐ VB๋ก ํ๋ก์๋ฅผ ์์ฑํ๋ค) ์๋ฐ๋ก ํ๋ก์๋ฅผ ์์ฑํ ์๊ฐ์ด ์๋๋ค. ์๋ง๋ ์ผ์์ผ์ ํ ์ ์์ ๊ฒ์ด๋ค.
์์ฉ ํ๋ก๊ทธ๋จ์ JSP ๋๋ "Java Desktop"์ ๋๊น?
@brcontainer JSF, Primefaces, Javascript ๋ฐ Java๋ฅผ ์ฌ์ฉํ๋ ์น
@DanielSBelo JSF ํ๋ ์์ํฌ ์ ๋ ํ๋ ์์ํฌ ์์ด ์์ Java๋ก ํ๋ก๊ทธ๋๋ฐํ๋๋ฐ Java ๋ถ๋ถ์ ์ฝ๋๋ก ํ์ฌ ์ฝ๋๋ฅผ ๊ตฌํํ๋ ๊ฒ์ด ์ฌ์ธ์ง ๋ชจ๋ฅด๊ฒ ์ต๋๋ค. ๋๋ ๊ทธ๋ฅผ ๋๊ณ ์ถ์์ง๋ง, ์ ๋ง๋ก ์๊ธฐ์ ์ ํ์ง ์์๋ค.
[ํธ์ง๋จ]
CSS ๋ณํ ์ง์ ์ ๋ณด: https://github.com/niklasvh/html2canvas#contributing
@DanielSBelo ์ด์ ๋ํ ์ข์ ์๋ฃจ์ ์ ์ฐพ์์ต๋๊น? ๊ฐ์ ๋ฌธ์ ๊ฐ ์์ต๋๋ค.
์ง๋๋ฅผ ์บ๋ฒ์ค๋ก ์ ์ฅํ๋ฉด Firefox์์๋ ์ ๋๋ก ์๋ํ์ง๋ง Chrome์์๋ ์ง๋๋ฅผ ์ ์ฅํ์ง ๋ชปํฉ๋๋ค. ๋ณํ๊ณผ ์ง์ ์ ์ธ ๊ด๋ จ์ด ์๋ค๊ณ ์๊ฐํ์ง ์์ง๋ง Chrome์ด COR์ ์ฒ๋ฆฌํ๋ ๋ฐฉ์์ผ ๊ฐ๋ฅ์ฑ์ด ๋ ํฝ๋๋ค. ๊ทธ๋๋ ๋ต์ ์ฐพ์ผ๋ ค๊ณ ์์ ํ ๋งํ์ต๋๋ค.
@TGOlson html2canvas ์ ํ์ฌ ๋ฆด๋ฆฌ์ค๋ "ํ ๋ ๋ฒจ"์ ๋ณํ๋ง ๋ ๋๋งํ ์ ์๊ธฐ ๋๋ฌธ์ CSS3 ๋ณํ์ ์ ๋ง ๋ฌธ์ ๊ฐ ์์ต๋๋ค.
Google ์ง๋๋ฅผ ๊ฐ์ง๊ณ ๋๊ธฐ๋ง ํ๋ฉด ๋ฌธ์ ๊ฐ ๋ณํ์ ์๋์ง ํ์ธํ ์ ์์ต๋๋ค. ์ผ๋ฐ์ ์ผ๋ก ๋ค์๊ณผ ๊ฐ์ ์คํฌ๋ฆฐ์ท์ด ์ ๊ณต๋ฉ๋๋ค.
(css์์๋ ์ ์ฒด ๋งต์ด ์ฌ๋ฐ๋ฅด๊ฒ ๋ฐฐ์น๋์ง๋ง css3์ ๋นํ์ฑํํ ํ ์ด๋ฌํ ์ผ์ด ๋ฐ์ํฉ๋๋ค.)
์ ์ผํ ํด๊ฒฐ์ฑ
์ ์ ์ฒด css3 ๋ณํ ์คํ์ ๊ตฌํํ๋ ๊ฒ์
๋๋ค. ๋๋ ๊ทธ๊ฒ์ด Niklas์ ์ํด ์งํ๋๊ณ ์๋์ง ๋ชจ๋ฅด์ง๋ง ๋๊ตฐ๊ฐ๊ฐ ๊ทธ๊ฒ์ํด์ผํฉ๋๋ค :-)
๊ตฌ๋
์ ๋ ๊ฐ์ ๋ฌธ์ ๊ฐ ์์ต๋๋ค. Chrome์์๋ง ๊ฐ๋ฅํฉ๋๋ค. html2canvas-proxy-php๋ฅผ ์ฌ์ฉํ๊ณ ์์ต๋๋ค. ๋ค๋ฅธ ๋ธ๋ผ์ฐ์ ๋ ์ ์๋ํฉ๋๋ค. ์ง๋์ ์ผ๋ถ๊ฐ ๋๋ฝ๋์์ต๋๋ค.. ์ง๋ ํฌ๊ธฐ ์กฐ์ , ์ค๋ฒ๋ ์ด ์ถ๊ฐ/์ ๊ฑฐ ๋ฑ๊ณผ ๊ด๋ จ๋ ๊ฒ ๊ฐ์ต๋๋ค.
์ฐธ๊ณ - ์ผ๋ถ ์ง๋ ์บก์ฒ ๊ธฐ๋ฅ์ ์ ์ํ๊ฒ ์์ํ๊ณ ์คํํด์ผ ํ๋ ๊ฒฝ์ฐ ์ธ์ ๋ ์ง Google ์คํธ๋ฆฌํธ ๋ทฐ ๋๋ ์ ์ ์ง๋ API๋ฅผ ์ฌ์ฉํ ์ ์์ต๋๋ค. ๊ธฐ๋ณธ์ ์ผ๋ก ํ์ฌ ์ฌ์ฉ์๊ฐ ์ง๋์์ ๋ณด๊ณ ์๋ ๊ฒ์ ์ฌ๊ตฌ์ฑํ ๋ค์( map.getPov
๋ฑ) Google์์ ํด๋น ์ ์ ์ด๋ฏธ์ง๋ฅผ ๊ฐ์ ธ์ต๋๋ค.
๋๋ ๊ทธ ์ ๊ทผ ๋ฐฉ์์ด ์ค๋ฒ๋ ์ด์ ํจ๊ป ์๋ํ๋ค๊ณ ์๊ฐํ์ง ์์ต๋๋ค.
๋๋์ด ๋ฌธ์ ๋ฅผ ์ฐ์ฐํ ๋ฐ๊ฒฌํ์ต๋๋ค. ๋ด๊ฐ ํ๋ฆฌ์ง ์์๋ค๋ฉด ์ด stackoverflow ์ง๋ฌธ์ ์ด ๋ฌธ์ ๊ฐ ํ์๋๋ฉฐ css3 ๋ณํ์ ์ฝ๊ณ ์ผ๋ฐ CSS ์์น๋ก ์ ์ฉํ์ฌ ํด๊ฒฐ ๋ฐฉ๋ฒ์ ์ ๊ณตํ์ต๋๋ค.
var transform=$(".gm-style>div:first>div").css("transform")
var comp=transform.split(",") //split up the transform matrix
var mapleft=parseFloat(comp[4]) //get left value
var maptop=parseFloat(comp[5]) //get top value
$(".gm-style>div:first>div").css({ //get the map container. not sure if stable
"transform":"none",
"left":mapleft,
"top":maptop,
})
์๋ง๋ css3 ๋ณํ์ ํ์ธํ๊ณ ๋ ๋๋งํ๋ ๋์ ์ผ๋ฐ CSS ์์น๋ก ์๋ ๋ณํํ ๋ค์ ๋ ๋๋ง ํ์ ์ ๊ฑฐํ ์ ์์ต๋๋ค.
์ผ์ ํ์ง ์์ ํ๋ฉด ์บก์ฒ ๊ธฐ๋ฅ์ด ์์ต๋๋ค.
ํ์ด์ง๋ฅผ ์์ ํ ์๋ก๊ณ ์นจํ ํ ์๋ํฉ๋๋ค(firefox์์ CTLR+R ์ฌ์ฉ).
์ฌ๊ธฐ ๋ด ์ฝ๋๊ฐ ์์ต๋๋ค. ๊ธฐ๋ณธ์ ์ผ๋ก ์ฐฝ์ ์บก์ฒ๋ printreen์ 64 ๊ธฐ๋ณธ/png ์ด๋ฏธ์ง์ ๋ด๊ฐ ์ ๋ ฅํ ์ต์ข ๊ฒฐ๊ณผ๋ฅผ ์์ฑํ๋ ๊ฒ์ ๋๋ค. ํ๊ทธ๊ฐ ์๋ํ๋์ง ํ์ธํฉ๋๋ค.
์ฌ๊ธฐ ๊ธฐ๋ฅ์ด ์์ต๋๋ค
ํจ์ ebfPrintScreen(๊ตฌ์ฑ ์์ ์ด๋ฆ)
{
html2์นด๋ธ๋์ค
([๋ฌธ์.๋ณธ๋ฌธ],
{
๋ก๊น
: ์ฐธ,
useCORS: ์ฌ์ค,
onrendered: ํจ์(์บ๋ฒ์ค)
{
img = ์บ๋ฒ์ค.toDataURL("์ด๋ฏธ์ง/jpg");
console.log(img.length);
console.log(img);
var imgComp = $c(conponentName);
imgComp.img.src = img
}
}
);
}
์ฃผ์ ๋ชฉํ๋ ์์ฑ๋ ํ Google ์ง๋ ๊ฒฝ๋ก๋ฅผ ์บก์ฒํ๋ ๊ฒ์ด์ง๋ง ๋ด๊ฐ ๋งํ๋ฏ์ด ์๋ํ ๋๋ ์๊ณ ๊ทธ๋ ์ง ์์ ๋๋ ์์ต๋๋ค. ๋ฌด์จ ์ผ์ด ์ผ์ด๋๊ณ ์๋์ง์ ๋ํ ๋จ์๊ฐ ์์ต๋๊น?
๊ฐ์ ๋ฌธ์ ๊ฐ ์์ต๋๋ค. ์ง๋๋ฅผ ํ๋ํ๊ณ ํจ๋ํ ํ ์ด๋ฏธ์ง๋ฅผ ์ฐ์ผ๋ฌ ๊ฐ๋๋ฐ ์ง๋ ์ ์ฒด๊ฐ ๊ฐ์๊ธฐ ์ฐํ ๊ฐ์์ผ๋ก ๋ค๋ฎ์ด๊ฒ ๋ฉ๋๋ค. ๋๊ตฌ๋ ์ง Chrome์์ ์ด์ ๋ํ ์์ ์ฌํญ์ด ์์ผ๋ฉด ์๋ ค์ฃผ์ญ์์ค.
@mfirdaus ์ ์๋ฃจ์ ์ ์๋ํ์ง๋ง
@mfirdaus ์ ์๋ฃจ์ ์ ์ ์ฉํ ํ ์ง๋ ๋ณด๊ธฐ๋ฅผ ์บก์ฒํ ์ ์์์ต๋๋ค. ๊ทธ๋ฌ๋ ์ด๋ป๊ฒ๋ ์๋์ ์ด ์ฝ๋๋ ์ง๋๋ฅผ ์ฌ์ฉํ ์ ์๊ฒ ๋ง๋ญ๋๋ค(๊ทธ๋ฌ๋ html2canvas๋ ์ฌ์ฉํ ์ ์์).
$(".gm-style>div:first>div").css({ //get the map container. not sure if stable
"transform":"none",
"left":mapleft,
"top":maptop,
})
ํด๋น ๋ผ์ธ์ด ์ํํ๋ ์์ ์ "๋ณต์"ํ๋ ๋ฐฉ๋ฒ์ด ์์ต๋๊น? ์ง๊ธ์ ๋ณํ ์ฝ๋์ ํจ๊ป html2canvas ํจ์๋ฅผ ํธ์ถํ ํ ์ง๋๊ฐ ์๋ํ๋๋ก ํ๊ธฐ ์ํด initMap ํจ์๋ฅผ ๋ค์ ํธ์ถํ๊ณ ์์ต๋๋ค.
์์ ์คํฌ๋ฆฝํธ๊ฐ Google Maps v3์์ ์๋ํฉ๋๊น?
์ ์๊ตฌ ์ฌํญ์ ๊ฒฝ๋ก๊ฐ ๊ทธ๋ ค์ง Google Map v3์ ์คํฌ๋ฆฐ์ท์ ์ฐ๋ ๊ฒ์ ๋๋ค.
Firefox์์๋ ์ ์๋ํ์ง๋ง Chrome์๋ ๋ง์ปค๋ ๊ฒฝ๋ก๊ฐ ์์ต๋๋ค. ์ ๋ ์ด๋ฏธ ์ปค์คํ ๋ง์ปค๋ฅผ ์ฌ์ฉํ๊ณ ์์ต๋๋ค.
์ฝ์์ ์ค๋ฅ๊ฐ ์๊ณ ๋ก๊น ์ด ๋๋ฌด ์ ํ๋์ด ๋๋ฒ๊น ์ ์ด๋ ค์์ ๊ฒช์ต๋๋ค.
Chrome์์ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ ์ฌ๋์ด ์์ต๋๊น? ๋ ๊ฐ์ง ์ธ์ด๋ก ํ๋ก์ ์คํฌ๋ฆฝํธ๋ฅผ ์๋ํ์ง๋ง ๋ ๋ค ์ฐจ์ด๊ฐ ์๋ ๊ฒ ๊ฐ์ต๋๋ค.
๋น์ทํ ๋ฌธ์ ๊ฐ ์์ต๋๋ค. ์ธํฐ๋ท์์ ์ด ์ฝ๋๋ฅผ ๋ณต์ฌ/์๋ผ๋ ๋๋ค.
if($.browser.safari) {// Fix for Chrome
var transform=$(".gm-style>div:first>div").css("transform");
var comp=transform.split(","); //split up the transform matrix
var mapleft=parseFloat(comp[4]); //get left value
var maptop=parseFloat(comp[5]); //get top value
$(".gm-style>div:first>div").css({ //get the map container. not sure if stable
"transform":"none",
"left":mapleft,
"top":maptop,
});
}
html2canvas([$("#map")[0]], {
logging: false,
useCORS: true,
onrendered: function (canvas) {
$('#screenshot').after(canvas);
if($.browser.safari) {// Fix for Chrome
$(".gm-style>div:first>div").css({
left:0,
top:0,
"transform":transform
});
}
}
});
์๋ํ์ง๋ง ํธ๋ค๋ฌ๋ก ๋งต์ ์ด๋ํ๋ฉด ์๋ํ์ง ์์ต๋๋ค. ๋ง์ปค, ํด๋ฆฌ๊ณค ๋ฑ์ผ๋ก ์์ ํฉ๋๋ค. ํ์ด์ดํญ์ค์์๋ ์๋ํ์ง๋ง(์ง๋๋ฅผ ์ด๋ํ ์ ์์) ํฌ๋กฌ์์๋ ์๋ํ์ง ์์ต๋๋ค.
์ด๋ค ์๊ฐ?
๊ณ ์ !
๋ด๊ฐ ์ด๋ฆฌ์๊ฒ ๋ณต์ฌ/๋ถ์ฌ๋ฃ๊ธฐํ ํฌ๋กฌ ์์ ์ด ์คํ๋์ง ์์์ต๋๋ค.
๋๋ ์ด๊ฑธํ๋ค :
if(window.chrome) {// Fix for Chrome
var transform=$(".gm-style>div:first>div").css("transform");
var comp=transform.split(","); //split up the transform matrix
var mapleft=parseFloat(comp[4]); //get left value
var maptop=parseFloat(comp[5]); //get top value
$(".gm-style>div:first>div").css({ //get the map container. not sure if stable
"transform":"none",
"left":mapleft,
"top":maptop,
});
}
html2canvas([$("#map > div.g-map-canvas > div > div > div:nth-child(1)")[0]], {
logging: false,
useCORS: true,
onrendered: function (canvas) {
$('#screenshot').after(canvas);
if(window.chrome) {// Fix for Chrome
$(".gm-style>div:first>div").css({
left:0,
top:0,
"transform":transform
});
}
}
});
html2canvas์ ๋งค์ฐ ๊ธด ์ ํ๊ธฐ๋ ๋ฒํผ๊ณผ ์ต์ ์ด ์๋ ๋งต์ ์ํ ๊ฒ์ ๋๋ค.
์ง๊ธ ์ผํฉ๋๋ค. ๊ฐ์ฌํฉ๋๋ค.
@GCorbel ๊ฐ์ฌํฉ๋๋ค. ๊ทํ์ ์๋ฃจ์ ๊ณผ ๋งค์ฐ ์ ์๋ํฉ๋๋ค.
์์ ํด๊ฒฐ ๋ฐฉ๋ฒ์ ์ง๋๋ฅผ ๋ ๋๋งํ๋ ๋ฐ ์ฌ์ฉํ ์ ์์ง๋ง ์๋จ ์ปจํธ๋กค์ด ์๊ฑฐ๋ ์๋ชป๋ ์์น์ ์์ต๋๋ค. ์ด๋ค ์์ด๋์ด?
์ด๊ฒ์ ์ฌ์ ํ v1.0.0 ์ ๋ฌธ์ ์ ๋๊น? ๊ทธ๋ ๋ค๋ฉด jsfiddle์ ๋ํ ์๋ฅผ
์ด ํธ๋ ์์ ์์ ์ถ๊ฐ ์ ๋ณด ์์ฒญ์ ๋ํ ์๋ต์ด ์์๊ธฐ ๋๋ฌธ์ ์๋์ผ๋ก ์ข ๋ฃ๋์์ต๋๋ค. ํ์ฌ ๋ฌธ์ ์ ์๋ ์ ๋ณด๋ง์ผ๋ก๋ ์กฐ์น๋ฅผ ์ทจํ๊ธฐ์ ์ถฉ๋ถํ ์ ๋ณด๊ฐ ์์ต๋๋ค. ๋ ์กฐ์ฌํ ์ ์๋๋ก ํ์ํ ๋ต๋ณ์ด ์๊ฑฐ๋ ์ฐพ์ผ๋ฉด ์ฐ๋ฝํด ์ฃผ์ญ์์ค.
@niklasvh ์ฌ์ ํ ์ต์ ๋ฒ์ ์ ๋ฌธ์ ์์ ํ์ธํ ์ ์์ต๋๋ค. ๋ค์์ ์ด ๋ฌธ์ ๋ฅผ ํ ์คํธํ๋ ๋์ ๋ง๋ ๋ฐ์ด์ฌ๋ฆฐ์ ๋๋ค. http://jsfiddle.net/9agom947/4/
๋ฐ์ด์ฌ๋ฆฐ์ ์ฐ๊ฒฐ๋ stackoverflow ์ง๋ฌธ์ ์ค๋ช ๋ ๋๋ก ๋ฌธ์ ๋ฅผ ๋ณด์ฌ์ฃผ์ง๋ง ๋ฐ๋์ ์ด ์ค๋ ๋์ OP์ ์๋ ๊ฒ์ ์๋๋๋ค. ์ง๋๋ฅผ ํจ๋ํ์ง ์์ผ๋ฉด ์ง๋๋ฅผ ๋ณต์ฌํ๋ ๋ฐ ๋ฌธ์ ๊ฐ ์์ต๋๋ค. Chrome์์๋ ์ง๋๋ฅผ ์ด๋ํ์ง๋ง FireFox์์๋ ์ด๋ํ์ง ์์ผ๋ฉด ๋ณต์ฌ๋ ์ง๋๊ฐ ์ฒ์์ ๋ก๋๋ ์์ญ ์ธ๋ถ์์ ๋น์ด ์๊ฒ ๋ฉ๋๋ค.
์ด ์ค๋ ๋์ ์ ๊ณต๋ ์์ ์ฌํญ์ด ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๋ ๊ฒ ๊ฐ์ต๋๋ค.
@Ananda-Pryana jsFiddle์ ์๋ํ์ง๋ง ์์ ์ฌํญ์ด ๋ ์ด์ ์๋ํ์ง ์๋ ๊ฒ ๊ฐ์ต๋๋ค. ๋ค๋ฅธ ํด๊ฒฐ์ฑ ์ด ์์ต๋๊น?
๋ฏธ๋ฆฌ ๊ฐ์ฌ๋๋ฆฝ๋๋ค.
์ต๊ทผ ์ถ์๋ ์ต์ ๋ฒ์ ์ Google ์ง๋(v3.32)์ ์๋ก์ด ์คํ์ ๋ ๋๋ฌ๊ฐ ์๋ ๊ฒ ๊ฐ์ต๋๋ค.
https://developers.google.com/maps/documentation/javascript/releases
์ด๋ก ์ธํด ์์ ์ฌํญ์ด ์์๋์์ต๋๋ค. ๋๋ ๋จ์ง ๋น ๋ฅธ ํ ์คํธ๋ฅผ ํ์ ๋ฟ์ด์ง๋ง, ์ด์ ๋ ๋ชจ๋ ๋ธ๋ผ์ฐ์ (Chrome๋ฟ๋ง ์๋๋ผ)์์ ๋๋ฑํ๊ฒ ๋ง๊ฐ์ง ๊ฒ ๊ฐ์ผ๋, html2canvas์ ๋ค์ ๋ฒ์ ์์ ๋ ์ฝ๊ฒ ๊ณ ์น ์ ์๊ธฐ๋ฅผ ๋ฐ๋๋๋ค.
๊ทธ๋ฌ๋ ๋น ๋ฅธ ํด๊ฒฐ ๋ฐฉ๋ฒ์ ์์ ์ฌํญ์ด ์ฌ์ ํ ์ ๋๋ก ์๋ํ๋ ์ด์ ๋ฒ์ ์ gmap์ ์ฌ์ฉํ๋ ๊ฒ์ ๋๋ค.
@Ananda-Pryana ์, gmap์ ๋ค์ด๊ทธ๋ ์ด๋ํ์ต๋๋ค. ๊ฐ์ฌํฉ๋๋ค.
@Ananda-Pryana ๊ฐ์ฌํฉ๋๋ค! ์ง๋ ์ฃผ์ ์ด ์์ ์ ์ํํ ๋ค์ ์ ํ๋ซํผ์ผ๋ก ์ฎ๊ฒผ๊ณ ๊ทธ ์์ง์์ด ๋ฌธ์ ๋ผ๊ณ ์๊ฐํ์ต๋๋ค. ๋๋ ์๋ก์ด ํ๊ฒฝ์ด ๋ฒ์ธ์ด๋ผ๊ณ ๊ฐ์ ํ๊ณ ์์ ํ ์ฅ๊ตฌ๋ฉ์ ๋น ์ ธ๋ค๊ณ ์์๋ค. ๋๋ 3.30์ผ๋ก ๋ค์ด ๊ทธ๋ ์ด๋ํ๊ณ ๋ชจ๋ ๊ฒ์ด ์๋ฉ๋๋ค.
Google ์ง๋์ ์ ๋ฒ์ ์์๋ ๋ณํ์ด ๋ค๋ฅธ div์ ์ ์ฉ๋๋ ๊ฒ ๊ฐ์ต๋๋ค. @GCorbel ์ ์๋ฃจ์ ์ ์ฌ์ฉํ์ง๋ง ์ด ์ ํ๊ธฐ์ ํจ๊ป (".gm-style>div:first>div:first>div:last>div") ์๋ํ๋ ๊ฒ ๊ฐ์ต๋๋ค. ์์ง ์์ ํ ํ ์คํธํ์ง๋ ์์์ง๋ง.
@rSensation ํ์ ์ต์ ๋ฒ์ ์์ ๋งค๋ ฅ์ฒ๋ผ ์๋ํ์ต๋๋ค. ๊ฐ์ฌํฉ๋๋ค!
ํ ์ด ๋ฌธ์ ๊ฐ ์ ์๊ฒ ๋์์จ ๊ฒ ๊ฐ์ต๋๋ค. ๋ฌธ์ ๋ฅผ ๋ณด๋ ค๋ฉด ์ง๋๋ฅผ ์ด๋ํด์ผ ํ๊ณ Html2Canvas๋ฅผ ์ด๋ํ์ฌ ํ๋ฉด์ ๊ฐ์ ธ์ค๋ฉด ์ผ๋ถ ์์ญ์ด ๋น ํ์์ผ๋ก ํ์๋ฉ๋๊น?
์ค๋ฒ๋ ์ด ๋ ์ด์ด๊ฐ ์๋ ค์ง๋ ๋ฌธ์ ๋ฅผ ๊ฒช๊ณ ๊ณ์๋ ๋ถ๋ค์๊ฒ --
@GCorbel ์ ์ ํ๊ธฐ๋ Google ์ง๋ ๋ ์ด์ด๋ง ๋ณํํฉ๋๋ค. ๋ค๋ฅธ ์ค๋ฒ๋ ์ด๊ฐ ์๋ ๊ฒฝ์ฐ ํด๋น ์ค๋ฒ๋ ์ด๊ฐ ์๋ div๋ฅผ ์ฐพ์์ผ ํฉ๋๋ค(์: $('.gm-style>div:first>div:first>div:first>div:first>div')
๋ ๋ด ์ค๋ฒ๋ ์ด div ์ค ํ๋์์ผ๋ฉฐ ๋์ผํ ๋ณํ์ CSS์ ์ ์ฉํฉ๋๋ค.
@mylesboone ์ค๋ฒ๋ ์ด ๋ ์ด์ด๊ฐ ์ด๋ค div๋ฅผ ์ฐพ์์ต๋๊น? ๋๋ ํ์ฌ ์ค๋ฒ๋ ์ด ๋ ์ด์ด๊ฐ ์๋ฆฌ๋ ๊ฒ๊ณผ ๊ฐ์ ๋ฌธ์ ๋ก ์ด๋ ค์์ ๊ฒช๊ณ ์์ต๋๋ค.
ํ์ฌ ์ค๋ฒ๋ ์ด ๋ ์ด์ด๋ก GmapMarker์ GmapPolyline์ ์ฌ์ฉํ๊ณ ์์ต๋๋ค.
@sunghunOW
์๋ฃจ์
์ https://github.com/niklasvh/html2canvas/issues/1568 ์์ ์ฐพ์ ์ ์์ต๋๋ค.
๋ธ๋ผ์ฐ์ ์ ๊ฒ์ฌ ๋๊ตฌ๋ฅผ ์ฌ์ฉํ์ฌ ๋ณํ์ด ํ์ํ div๋ฅผ ํ์ธํ ์ ์์ต๋๋ค.
๋ด๊ฐ ์ฐพ์ ์ต๊ณ ์ ์๋ฃจ์ :
html2canvas($('.gm-style>div:eq(0)')[0],{
useCORS: true,
allowTaint: true,
async:false,
}).then(canvas => {document.body.appendChild(canvas)});
html2canvas($('.gm-style>div:eq(0)')[0],{ useCORS: true, allowTaint: true, async:false, }).then(canvas => {document.body.appendChild(canvas)});
์บ๋ฒ์ค๊ฐ ์ ์๋์ง ์์์ต๋๋ค. ํญ๋ชฉ ์ ํ๊ธฐ๊ฐ ์์ ๋ฐ์ผ๋ก ๋์์ผ ํฉ๋๊น?
@hseeda ๊ฐ์ฌํฉ๋๋ค! ๋น์ ์ ์ ํ์๊ฐ ๋๋ฅผ ์ํด ์์์๋ฅผ ์ฐ๊ณ ์์๋ค!
๋ค์์ ์๋ํ๋ ์ฝ๊ฐ ์์ ๋ ์ ํ๊ธฐ์ ๋๋ค(์ ์ด๋ ์ ์๊ฒ๋ ํํ).
const div = document.querySelector('#map > div:first-of-type')
html2canvas(div, {})
๊ทธ๋ฌ๋ ์ด์ ์ด์ฉ์ฝ๊ด์ ์ค์ํ๊ธฐ ์ํด ํญ์ ํ์๋์ด์ผ ํ๋ Google ๋ก๊ณ ๊ฐ ์๋ฆฝ๋๋ค.(
๊ธ์, ๋ ๊ทธ๋ฅ ๋ ธ๋ ๋๋ ๋ญ๊ฐ๋ฅผ ๋ณต์ ํ ๊ฒ์ ๋๋ค. ์ค๋๋ง์ ์ด ๋งต๊ณผ ์ธ์ฐ๋ค์ :D
์ด๊ฒ์ ๋๋ฅผ ์ํด ์๋ํฉ๋๋ค.
$('#snapshot').on('click',function () {
html2canvas(document.querySelector('.gm-style'),
{useCORS:true, allowTaint: true,async:false} ).then(canvas => {
document.body.appendChild(canvas)
});
});
๋น ์ง๋ ๋๋ ์บ๋ฒ์ค ์์ฑ ์ค๋ฅ ๋ฌธ์ ๋ ๊น๋ค๋ก์ ์ง๋ง ๊ฒฐ๊ตญ ์ด ๊ตฌ์ฑ์ ์ถ๊ฐํ๋ ๊ฒ์ด ์ ๋ฅผ ์ํด ํด๊ฒฐ๋์์ต๋๋ค.
ignoreElements: (node) => {
return node.nodeName === 'IFRAME';
}
html2canvas(mapWrapper, {
useCORS: true,
allowTaint: false,
ignoreElements: (node) => {
return node.nodeName === 'IFRAME';
}
}).then(canvas => {
const url = canvas.toDataURL('image/png');
saveAs(url, 'image3.png');
window.URL.revokeObjectURL(url);
});
@imlinus ์ @hseeda ์๊ฒ ๊ฐ์ฌ๋๋ฆฝ๋๋ค! ์ด ์ ํ๊ธฐ๋ ๋๋ฅผ ์ํด ์๋ฒฝํ๊ฒ ์๋ํฉ๋๋ค! Google ๋ก๊ณ ๋ ์ ์ง๋ฉ๋๋ค. ๊ฐ์ฌํฉ๋๋ค!
@hseeda ๊ฐ์ฌํฉ๋๋ค! ๋น์ ์ ์ ํ์๊ฐ ๋๋ฅผ ์ํด ์์์๋ฅผ ์ฐ๊ณ ์์๋ค!
๋ค์์ ์๋ํ๋ ์ฝ๊ฐ ์์ ๋ ์ ํ๊ธฐ์ ๋๋ค(์ ์ด๋ ์ ์๊ฒ๋ ํํ).
const div = document.querySelector('#map > div:first-of-type') html2canvas(div, {})
๊ทธ๋ฌ๋ ์ด์ ์ด์ฉ์ฝ๊ด์ ์ค์ํ๊ธฐ ์ํด ํญ์ ํ์๋์ด์ผ ํ๋ Google ๋ก๊ณ ๊ฐ ์๋ฆฝ๋๋ค.(
๊ธ์, ๋ ๊ทธ๋ฅ ๋ ธ๋ ๋๋ ๋ญ๊ฐ๋ฅผ ๋ณต์ ํ ๊ฒ์ ๋๋ค. ์ค๋๋ง์ ์ด ๋งต๊ณผ ์ธ์ฐ๋ค์ :D
๊ฐ์ฅ ์ ์ฉํ ๋๊ธ
Google ์ง๋์ ์ ๋ฒ์ ์์๋ ๋ณํ์ด ๋ค๋ฅธ div์ ์ ์ฉ๋๋ ๊ฒ ๊ฐ์ต๋๋ค. @GCorbel ์ ์๋ฃจ์ ์ ์ฌ์ฉํ์ง๋ง ์ด ์ ํ๊ธฐ์ ํจ๊ป (".gm-style>div:first>div:first>div:last>div") ์๋ํ๋ ๊ฒ ๊ฐ์ต๋๋ค. ์์ง ์์ ํ ํ ์คํธํ์ง๋ ์์์ง๋ง.