์๋ ํ์ธ์,
๋ค์ ์ฝ๋ ์ด๋ฏธ์ง๋ฅผ ์ฌ์ฉํ๋ฉด ๋๋ฉ์ธ ๊ฐ ๋ ๋๋ง์ด ๋์ง ์์ต๋๋ค.
html2canvas($(".canvas-surround"), {
logging: true,
width: 1920 * getScale(),
height: 1080 * getScale(),
useCORS: false,
onrendered: function(canvas) {
var bottomCtx = canvas.getContext("2d");
var topCtx = canvas.getContext("2d");
var bData = bottomCtx.getImageData(0, 0, canvas.width, canvas.height);
var tData = topCtx.getImageData(0, 0, canvas.width, canvas.height);
var merged = mergeData(bData, tData);
bottomCtx.putImageData(merged, 0, 0);
var newImg = canvas.toDataURL("image/png");
console.log(newImg);
var blob = b64toBlob(newImg, "image/png");
console.log(blob);
var blobUrl = URL.createObjectURL(blob);
console.log(blobUrl);
downloadURI(blobUrl);
}
});
" http://www.playgroundmarkingsdirect.co.uk "์์ " http://www.thermmark.co.uk "์์ ์ด๋ฏธ์ง๋ฅผ ๊ฐ์ ธ์ค๋ ค๊ณ ํ๋ฉด ์ด๋ฏธ์ง๊ฐ ๋ ๋๋ง๋์ง ์์ต๋๋ค.
์ฝ๋๋ฅผ " http://www.thermmark.co.uk " ์น์ฌ์ดํธ๋ก ์ฎ๊ฒผ์ ๋ ๋ ๋๋ง๋ ์ด๋ฏธ์ง(๋ ๋๋ฉ์ธ ๋ชจ๋ ์์ )
์ด๋ค ์์ด๋์ด?
์ด์ฉ๋ฉด useCORS
ptoperty๋ฅผ true๋ก ์ฌ์ฉํด์ผ ํ ์๋ ์์ต๋๋ค. ํฌ๋ก์ค ๋๋ฉ์ธ ์น ์ฝํ
์ธ ๋ฅผ ์ํ ๊ฒ์
๋๋ค.
useCORS
ํ๋ฉด ์ด๋ฏธ์ง ์บก์ฒ๊ฐ ์คํจํฉ๋๋ค. ๋ด๊ฐ ๊ฒช๊ณ ์๋ ๋ฌธ์ ๋ ์ธ๋ถ ๋๋ฉ์ธ์์ ์ด๋ฏธ์ง๋ฅผ ๊ฐ์ ธ์ค๋ ๋ฐ ์คํจํ์ง ์๊ณ ์บก์ฒ์์ ์ด๋ฏธ์ง๋ฅผ ๋ ๋๋งํ์ง ์๊ธฐ ๋๋ฌธ์ ์ด์ํฉ๋๋ค.
๋ด ์์ ์ ์๋ ํ์ต๋๊น? https://github.com/niklasvh/html2canvas/pull/554
allowTaint
๋ฅผ true๋ก ์ค์ ํด์ผ ํ์ง๋ง ๋ ๋๋ง๋ ๊ฒฐ๊ณผ๋ฅผ ๋ด๋ณด๋ผ ์ ์์ต๋๋ค.
userCORS
๋๋ proxy
์ฌ์ฉํ์ง ์๋ ์ด์ ๋ฅผ ์ดํดํ ์ ์์ต๋๋ค. ์ด๋ฌํ ๋ฌธ์ ๋ฅผ ์ํด ๋ง๋ ๊ฒ์
๋๋ค.
@brcontainer ์ต์ ๋ฒ์ ์์๋ ์๋ํ์ง ์์ผ๋ฏ๋ก ๋ด ์์ ์ฌํญ์ ์ฐธ์กฐํ์ธ์ .
@Cristy94 ๋ง์์ !! ํ๋ฅญํ ์์ ! ๊ฐ์ฌ ํด์!
์๋ ํ์ธ์ @Cristy94 ,
๋ด HTML์ CMS(Contentful)์์ ์ด๋ฏธ์ง๋ฅผ ๊ฐ์ ธ์จ ๋ค์ ํด๋น HTML์ PDF๋ฅผ ์์ฑํ๋ ค๊ณ ํฉ๋๋ค.
ํ์ง๋ง ์์ฑ๋ PDF์์ ์ด๋ฏธ์ง๊ฐ ๋๋ฝ๋์์ต๋๋ค.(๊ต์ฐจ ์ถ์ฒ ๋ฌธ์ ์ธ ๊ฒ ๊ฐ์ต๋๋ค).
์ด๋ป๊ฒ ํ๋ฉด ์ด ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ ์ ์๋์ง ์ ์ํด ์ฃผ์ญ์์ค.
์๋๋ ๋ด ์ฝ๋์
๋๋ค.
ํจ์ ๋ค์ด๋ก๋PDF() {
var canvasToImage = ํจ์(์บ๋ฒ์ค){
var img = ์๋ก์ด ์ด๋ฏธ์ง();
var dataURL = ์บ๋ฒ์ค.toDataURL('์ด๋ฏธ์ง/png');
img.crossOrigin = "์ต๋ช
";
img.src = ๋ฐ์ดํฐ URL;
์ด๋ฏธ์ง ๋ฐํ;
};
var canvasShiftImage = ๊ธฐ๋ฅ(oldCanvas,shiftAmt){
shiftAmt = parseInt(shiftAmt) || 0;
if(!shiftAmt){ oldCanvas ๋ฐํ; }
var newCanvas = document.createElement('์บ๋ฒ์ค');
newCanvas.height = oldCanvas.height - shiftAmt;
newCanvas.width = oldCanvas.width;
var ctx = newCanvas.getContext('2d');
ctx.mozImageSmoothingEnabled = ๊ฑฐ์ง;
ctx.webkitImageSmoothingEnabled = ๊ฑฐ์ง;
ctx.msImageSmoothingEnabled = ๊ฑฐ์ง;
ctx.imageSmoothingEnabled = ๊ฑฐ์ง;
var img = CanvasToImage(oldCanvas);
ctx.drawImage(img,0, shiftAmt, img.width, img.height, 0, 0, img.width, img.height);
๋ฐํ newCanvas;
};
var canvasToImageSuccess = ๊ธฐ๋ฅ(์บ๋ฒ์ค){
var pdf = ์๋ก์ด jsPDF('l','px'),
pdfInternals = pdf.internal,
pdfPageSize = pdfInternals.pageSize,
pdfScaleFactor = pdfInternals.scaleFactor,
pdfPageWidth = pdfPageSize.width,
pdfPageHeight = pdfPageSize.height,
์ด PDF ๋์ด = 0,
htmlํ์ด์ง ๋์ด = ์บ๋ฒ์ค.๋์ด,
htmlScaleFactor = canvas.width / (pdfPageWidth * pdfScaleFactor),
์์ ๋ง = 0;
๋์(totalPdfHeight < htmlPageHeight && SafetyNet < 15){
var newCanvas = canvasShiftImage(์บ๋ฒ์ค, totalPdfHeight);
pdf.addImage(newCanvas, 'png', 0, 0, pdfPageWidth, 0, null, '์์');
// var alias = Math.random().toString(35);
// pdf.addImage(newCanvas, 0, 0, pdfPageWidth, 0, 'png', alias, 'NONE');
totalPdfHeight += (pdfPageHeight * pdfScaleFactor * htmlScaleFactor);
if(์ดPdfHeight < htmlํ์ด์ง ๋์ด){
pdf.addPage();
}
์ธ์ดํํฐ๋ท++;
}
var pageName = document.location.pathname.match(/[^/]+$/)[0];
pdf.save(ํ์ด์ง์ด๋ฆ + '.pdf');
};
html2canvas($('๋ฐ๋')[0],
{
๋ ๋๋ง: ํจ์(์บ๋ฒ์ค){
CanvasToImageSuccess(์บ๋ฒ์ค);
}
});
}
์ด๋ด, ๊ฑฐ๊ธฐ์ ๋ํ ์์ ์ฌํญ์ด ์์ต๋๊น? ์ฌ๊ธฐ์์๋ ๋ ๋๋ง๋์ง ์์ CORS ์ด๋ฏธ์ง :(
์๋ ํ์ธ์ ๋ฃจ์ฝํ์ ๋๋ค.
html2canvas ํจ์์์ ์ต์ ์ค ํ๋๋ฅผ ์ ๋ฌํ๋ฉด ๋ฉ๋๋ค. ๊ทธ๋ฆฌ๊ณ ์ด๊ฒ์ด ํ์คํ ํจ๊ณผ๊ฐ ์์ ๊ฑฐ๋ผ๊ณ ๋ฏฟ์ผ์ธ์ :)
html2canvas($('#div_pdf')[0],
{
useCORS: true, // ํจ์์์ ์ด ์ต์
์ ์ ๋ฌํ๋ฉด Cross origin ์ด๋ฏธ์ง๊ฐ ๋ค์ด๋ก๋๋ PDF ๋ฒ์ ์์ ์ ๋๋ก ๋ ๋๋ง๋ฉ๋๋ค.
onrendered: ํจ์(์บ๋ฒ์ค) {
CanvasToImageSuccess(์บ๋ฒ์ค);
}
});
์ถ๊ฐ ์ ๋ณด๋ ์๋ URL์์ html2canvas ๋ผ์ด๋ธ๋ฌ๋ฆฌ ๋ฌธ์๋ฅผ ์ฐธ์กฐํ์ธ์.
https://html2canvas.hertzen.com/documentation.html
์๋ ํ์ธ์ @gauravmishra24 , ๋ถํํ๋ ์ด๊ฒ์ ์๋ํ์ง ์์ต๋๋ค. ๋ฌธ์ ๋ ์๋ฒ์ ํ๋๊ทธ๊ฐ ์๋ ์๋ฒ์ ์ด๋ฏธ์ง๋ฅผ ํฌํจํ๊ณ ์ถ๋ค๋ ๊ฒ์ ๋๋ค.
Access-Control-Allow-Origin: *
์ค์ ๋์ง ์์
:(
์๋ ํ์ธ์ ๋ฃจ์ฝํ์ ๋๋ค.
์ฝ๋ ์ค๋ํซ์ ๊ฒ์ํด ์ฃผ์๊ฒ ์ต๋๊น?
๊ฐ์ ๋ชจ์ต์ ๋ ์ ๋ณผ ์ ์๋๋ก.....
์๋ ํ์ธ์,
์ด์ ๋ํ ์์ ์ฌํญ์ด ์์ต๋๊น? useCORS๋ฅผ true๋ก ์ค์ ํด๋ ์ด๋ฏธ์ง๊ฐ ๋ค์ด๋ก๋๋์ง ์์ต๋๋ค. ์์์ ์ธ๊ธํ ๊ฒ์ฒ๋ผ ์ฌ์ ํ ๊ต์ฐจ ์ถ์ฒ ์ค๋ฅ๊ฐ ๋ฐ์ํฉ๋๋ค.
๋ํ ๋ถ์ฐ html2Canvas.js ํ์ผ์ Cristy94 ์๋ฃจ์ ์ ๋ํด ์ ๋ชจ๋ฅด๊ฒ ์ต๋๋ค. ๋ถ์ฐ ํ์ผ์์ ์ฝ๋๋ฅผ ๋ณ๊ฒฝํ ํ์๋ https://github.com/niklasvh/html2canvas/pull/554/commits/87d44359be73075ba4d5f36d6e1c8b88b7444402์ ๋ฐ๋ผ ์๋ํ์ง ์์ต๋๋ค.
ํ๋ก์ ์ค์ ์ ์ฌ์ฉํ๋ ๋ค๋ฅธ ๋์์ ๊ฒฝ์ฐ Angular 2 ์ ํ๋ฆฌ์ผ์ด์
์ ๋ํ ์๋ฃจ์
์ด ์์ต๋๊น?
ํ์ฌ ์ฌ์ดํธ(https://github.com/niklasvh/html2canvas/wiki/Proxies) ๋ชฉ๋ก์ ์์ต๋๋ค!
์ด๊ฒ์ ์ฌ์ ํ v1.0.0 ์ ๋ฌธ์ ์ ๋๊น? ๊ทธ๋ ๋ค๋ฉด jsfiddle์ ๋ํ ์๋ฅผ
์ด ํธ๋ ์์ ์์ ์ถ๊ฐ ์ ๋ณด ์์ฒญ์ ๋ํ ์๋ต์ด ์์๊ธฐ ๋๋ฌธ์ ์๋์ผ๋ก ์ข ๋ฃ๋์์ต๋๋ค. ํ์ฌ ๋ฌธ์ ์ ์๋ ์ ๋ณด๋ง์ผ๋ก๋ ์กฐ์น๋ฅผ ์ทจํ๊ธฐ์ ์ถฉ๋ถํ ์ ๋ณด๊ฐ ์์ต๋๋ค. ๋ ์กฐ์ฌํ ์ ์๋๋ก ํ์ํ ๋ต๋ณ์ด ์๊ฑฐ๋ ์ฐพ์ผ๋ฉด ์ฐ๋ฝํด ์ฃผ์ญ์์ค.
@niklasvh ๋ค์์ v1.0.0์ด ํฌํจ๋ codepen์ ์์
๋๋ค.
https://codepen.io/Onlylonger/pen/ppjPKX
๊ฐ์ ์ง๋ฌธ . ๋น์ ์๊ฒ
๋ค๋ฅธ ์ฌ๋์ด ์๊ณ ์๋ ํ๋ฌ๊ทธ์ธ์ด ์์ต๋๊น? ์ด๊ฒ์ ๋ค๋ฅธ ์๋ฒ ์์ฒญ์์ ์๋ํ์ง ์์์ต๋๋ค. ํ๋ก์์ ๋ํ ์ ์ ํ ์๊ฐ ์์ต๋๋ค.
@vinayistar ๋ด ๋ณ๊ฒฝ ์ฌํญ์ ์๋ํ ์ ์์ต๋๋ค https://github.com/niklasvh/html2canvas/issues/1544#issuecomment -435640901 ๋งํฌ
useCORS
๋ฐ img ์์ฑ crossOrigin:anonymous
{ useCORS: false, allowTaint: true }
์ด๊ฒ์ ๋๋ฅผ ์ํด ์ผํ์ต๋๋ค
์ด ๋ฌธ์ ์ ๋ํ ๋์ ํด๊ฒฐ์ฑ ์ ์ด๋ฏธ์ง src๋ฅผ Base64๋ก ๋ณํํ๋ ๊ฒ์ ๋๋ค.
const img = document.querySelector('#img')
fetch(img.src)
.then(res => res.blob())
.then(blob => new Promise((resolve, reject) => {
const reader = new FileReader;
reader.onerror = reject;
reader.onload = () => {
resolve(reader.result);
};
reader.readAsDataURL(blob);
})
)
.then(dataURL => {
img.src = dataURL
return html2canvas(element)
} )
@todoi ์ด ์ํ์
@nishanta454
์ ๊ฐ ์์ฑํ ์์์
๋๋ค. html2canvas๋ ๊ต์ฐจ ์์ ์ด๋ฏธ์ง๋ฅผ ๋ ๋๋ง ํฉ๋๋ค.
์ด ์์์๋ cors-anywhere ๋ฅผ ์ฌ์ฉํ์ฌ CORS ํค๋๋ฅผ ํ๋ก์ ์ด๋ฏธ์ง ์์ฒญ์ ์ถ๊ฐํฉ๋๋ค.
๊ฐ์ฅ ๋จผ์ ํ์ํ ๊ฒ์ ์ด๋ฏธ์ง ํ์ผ์ ๋ํ ๊ต์ฐจ ์ถ์ฒ ์ก์ธ์ค๋ฅผ ํ์ฉํ๋๋ก ๊ตฌ์ฑ๋ Access-Control-Allow-Origin ํค๋๋ฅผ ์ฌ์ฉํ์ฌ ์ด๋ฏธ์ง๋ฅผ ํธ์คํ ํ๋๋ก ๊ตฌ์ฑ๋ ์๋ฒ์ ๋๋ค.
CORS_enabled_image์์
๊ฐ์ฅ ์ ์ฉํ ๋๊ธ
์ด์ฉ๋ฉด
useCORS
ptoperty๋ฅผ true๋ก ์ฌ์ฉํด์ผ ํ ์๋ ์์ต๋๋ค. ํฌ๋ก์ค ๋๋ฉ์ธ ์น ์ฝํ ์ธ ๋ฅผ ์ํ ๊ฒ์ ๋๋ค.