Html2canvas: λ¬Έμ„œ 본문의 높이가 30,000px 이상인 경우 λͺ¨λ“  μš”μ†Œμ— λŒ€ν•΄ 빈 이미지λ₯Ό λ°˜ν™˜ν•©λ‹ˆλ‹€.

에 λ§Œλ“  2016λ…„ 05μ›” 31일  Β·  16μ½”λ©˜νŠΈ  Β·  좜처: niklasvh/html2canvas

λΌμ΄λΈŒλŸ¬λ¦¬λŠ” λ¬Έμ„œ 본문이 30,000픽셀을 μ΄ˆκ³Όν•˜λ©΄ 빈 이미지λ₯Ό λ°˜ν™˜ν•©λ‹ˆλ‹€. 100 x 100의 μš”μ†Œλ₯Ό μΊ‘μ²˜ν•˜λ €κ³  ν•  κ²ƒμž…λ‹ˆλ‹€. κ·ΈλŸ¬λ‚˜ μš”μ†Œμ˜ 빈 이미지가 ν‚€κ°€ 큰 λͺΈμ²΄μ— μžˆμŠ΅λ‹ˆλ‹€.

λ‹€μŒμ€ 이 였λ₯˜λ₯Ό λ³΄μ—¬μ£ΌλŠ” λ°”μ΄μ˜¬λ¦°μž…λ‹ˆλ‹€.

https://jsfiddle.net/fvo1xh8b/2/

λ°”λ”” μ‚¬μ΄μ¦ˆλŠ” 30,000 μ΄ν•˜λ‘œ λ³€κ²½ν•˜μ‹œλ©΄ 잘 λ©λ‹ˆλ‹€.

Needs More Information

κ°€μž₯ μœ μš©ν•œ λŒ“κΈ€

@niklasvh μ–΄λ €μš΄ μž‘μ—…μ΄μ§€λ§Œ 사싀 μΊ”λ²„μŠ€ 크기의 ν•œκ³„ λ•Œλ¬Έμž…λ‹ˆλ‹€. μ˜¬λ°”λ₯Έ 행동을 κ΅¬ν˜„ν•˜λŠ” 방법을 λ…Όμ˜ν•˜κΈ° μœ„ν•΄ 이것이 λ‹€μ‹œ 열릴 ν•„μš”κ°€ μžˆλ‹€κ³  μƒκ°ν•©λ‹ˆλ‹€. ν™•μ‹€νžˆ ν°μƒ‰μœΌλ‘œ 씻은 μ΄λ―Έμ§€λŠ” μ˜¬λ°”λ₯Έ λ™μž‘μ΄ μ•„λ‹™λ‹ˆλ‹€.

  • μΊ”λ²„μŠ€μ— λŒ€ν•œ λΈŒλΌμš°μ € μš”κ΅¬ 사항에 따라 μ΅œλŒ€ λ„ˆλΉ„/높이λ₯Ό κΈ°λ³Έκ°’μœΌλ‘œ μ„€μ •ν•©λ‹ˆλ‹€.
  • μ—¬λŸ¬ μΊ”λ²„μŠ€ μš”μ†Œλ₯Ό μ‚¬μš©ν•˜μ—¬ λΆ„ν•  및 μ •λ³΅ν•˜κ³  배열을 λ°˜ν™˜ν•©λ‹ˆλ‹€.
  • μΊ”λ²„μŠ€ μ œν•œμ— λŒ€ν•΄ μ‘°μ–Έν•˜λŠ” μ½˜μ†”μ—μ„œ 였λ₯˜λ₯Ό λ°œμƒμ‹œν‚€κ³  이λ₯Ό κ΅¬ν˜„ν•˜λŠ” 방법을 μ œμ•ˆν•©λ‹ˆλ‹€.

제 κ²½μš°μ—λŠ” 전체 본문을 λ³΅μ œν•˜κ³  μ΅œλŒ€ λ„ˆλΉ„/높이λ₯Ό μ„€μ •ν•©λ‹ˆλ‹€: html2canvas(el, {height: 3000, width: 3000}) .

λͺ¨λ“  16 λŒ“κΈ€

λ‚˜λŠ” λ‹Ήμ‹ κ³Ό λ˜‘κ°™μ€ λ¬Έμ œκ°€ μžˆμŠ΅λ‹ˆλ‹€. 이에 λŒ€ν•œ 해결책을 μ°Ύμ•˜μŠ΅λ‹ˆκΉŒ?

음, 같은 λ¬Έμ œκ°€ λ°œμƒν–ˆμ§€λ§Œ λ§ˆμΉ¨λ‚΄ μ•Œμ•„λƒˆμŠ΅λ‹ˆλ‹€!
제 κ²½μš°μ—λŠ” λ‹€μŒκ³Ό 같은 해결책이 μžˆμŠ΅λ‹ˆλ‹€.
λ‹€μŒκ³Ό 같이 body μš”μ†Œμ— iframe을 λ„£μœΌμ‹­μ‹œμ˜€.

<html>
  <head>
  #canvas_handler {
   position:absolute;
   left: -10000px;
  }
  </head>
  <body>
  <iframe id="canvas_handler" />
  </body>
</html>

μΊ”λ²„μŠ€λ‘œ λ³€ν™˜ν•˜λŠ” 데 ν•„μš”ν•œ λͺ¨λ“  μš”μ†Œλ₯Ό β€‹β€‹λ³΅μ‚¬ν•˜μ—¬ 이 iframe에 λ„£κ³  html2canvasλ₯Ό μ‚¬μš©ν•˜μ—¬ λ‹€μŒκ³Ό 같이 μ œκ±°ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

const copy_ele = origin_ele.cloneNode(true);
canvas_handler.appendChild(copy_ele);
canvas_handler.style.height = origin_ele.scrollHeight;
canvas_handler.style.width = origin_ele.scrollWidth;
html2canvas(copy_ele, {
      useCORS: true,
     }).then((canvas) => {
       // do your things
     });
canvas_handler.removeChild(table_ele);

이것은 μ—¬μ „νžˆ v1.0.0 의 λ¬Έμ œμž…λ‹ˆκΉŒ? κ·Έλ ‡λ‹€λ©΄ jsfiddle에 λŒ€ν•œ 예λ₯Ό

이 ν˜ΈλŠ” μ›μ €μžμ˜ μΆ”κ°€ 정보 μš”μ²­μ— λŒ€ν•œ 응닡이 μ—†μ—ˆκΈ° λ•Œλ¬Έμ— μžλ™μœΌλ‘œ μ’…λ£Œλ˜μ—ˆμŠ΅λ‹ˆλ‹€. ν˜„μž¬ λ¬Έμ œμ— μžˆλŠ” μ •λ³΄λ§ŒμœΌλ‘œλŠ” 쑰치λ₯Ό μ·¨ν•˜κΈ°μ— μΆ©λΆ„ν•œ 정보가 μ—†μŠ΅λ‹ˆλ‹€. 더 쑰사할 수 μžˆλ„λ‘ ν•„μš”ν•œ 닡변이 μžˆκ±°λ‚˜ 찾으면 연락해 μ£Όμ‹­μ‹œμ˜€.

μ•ˆλ…•ν•˜μ„Έμš”, λ‚΄λΆ€ IP μΉ΄λ©”λΌλ‘œ iframe을 μŠ€ν¬λ¦¬λ‹ν•˜λ €κ³  ν•˜λ©΄ 무효 이미지가 λ°˜ν™˜λ©λ‹ˆλ‹€. λ„μ™€μ£Όμ‹œκ² μŠ΅λ‹ˆκΉŒ?

@niklasvh μ–΄λ €μš΄ μž‘μ—…μ΄μ§€λ§Œ 사싀 μΊ”λ²„μŠ€ 크기의 ν•œκ³„ λ•Œλ¬Έμž…λ‹ˆλ‹€. μ˜¬λ°”λ₯Έ 행동을 κ΅¬ν˜„ν•˜λŠ” 방법을 λ…Όμ˜ν•˜κΈ° μœ„ν•΄ 이것이 λ‹€μ‹œ 열릴 ν•„μš”κ°€ μžˆλ‹€κ³  μƒκ°ν•©λ‹ˆλ‹€. ν™•μ‹€νžˆ ν°μƒ‰μœΌλ‘œ 씻은 μ΄λ―Έμ§€λŠ” μ˜¬λ°”λ₯Έ λ™μž‘μ΄ μ•„λ‹™λ‹ˆλ‹€.

  • μΊ”λ²„μŠ€μ— λŒ€ν•œ λΈŒλΌμš°μ € μš”κ΅¬ 사항에 따라 μ΅œλŒ€ λ„ˆλΉ„/높이λ₯Ό κΈ°λ³Έκ°’μœΌλ‘œ μ„€μ •ν•©λ‹ˆλ‹€.
  • μ—¬λŸ¬ μΊ”λ²„μŠ€ μš”μ†Œλ₯Ό μ‚¬μš©ν•˜μ—¬ λΆ„ν•  및 μ •λ³΅ν•˜κ³  배열을 λ°˜ν™˜ν•©λ‹ˆλ‹€.
  • μΊ”λ²„μŠ€ μ œν•œμ— λŒ€ν•΄ μ‘°μ–Έν•˜λŠ” μ½˜μ†”μ—μ„œ 였λ₯˜λ₯Ό λ°œμƒμ‹œν‚€κ³  이λ₯Ό κ΅¬ν˜„ν•˜λŠ” 방법을 μ œμ•ˆν•©λ‹ˆλ‹€.

제 κ²½μš°μ—λŠ” 전체 본문을 λ³΅μ œν•˜κ³  μ΅œλŒ€ λ„ˆλΉ„/높이λ₯Ό μ„€μ •ν•©λ‹ˆλ‹€: html2canvas(el, {height: 3000, width: 3000}) .

@toadkicker ν˜•μ œ, 였늘 λ‚΄ μ½”λ“œ/μž‘μ—…μ„ μ €μž₯ν•©λ‹ˆλ‹€ ν•˜ν•˜ν•˜ν•˜ν•˜ν•˜ν•˜ κ°μ‚¬ν•©λ‹ˆλ‹€

@toadkicker κ°μ‚¬ν•©λ‹ˆλ‹€!

음, 같은 λ¬Έμ œκ°€ λ°œμƒν–ˆμ§€λ§Œ λ§ˆμΉ¨λ‚΄ μ•Œμ•„λƒˆμŠ΅λ‹ˆλ‹€!
제 κ²½μš°μ—λŠ” λ‹€μŒκ³Ό 같은 해결책이 μžˆμŠ΅λ‹ˆλ‹€.
λ‹€μŒκ³Ό 같이 body μš”μ†Œμ— iframe을 λ„£μœΌμ‹­μ‹œμ˜€.

<html>
  <head>
  #canvas_handler {
   position:absolute;
   left: -10000px;
  }
  </head>
  <body>
  <iframe id="canvas_handler" />
  </body>
</html>

μΊ”λ²„μŠ€λ‘œ λ³€ν™˜ν•˜λŠ” 데 ν•„μš”ν•œ λͺ¨λ“  μš”μ†Œλ₯Ό β€‹β€‹λ³΅μ‚¬ν•˜μ—¬ 이 iframe에 λ„£κ³  html2canvasλ₯Ό μ‚¬μš©ν•˜μ—¬ λ‹€μŒκ³Ό 같이 μ œκ±°ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

const copy_ele = origin_ele.cloneNode(true);
canvas_handler.appendChild(copy_ele);
canvas_handler.style.height = origin_ele.scrollHeight;
canvas_handler.style.width = origin_ele.scrollWidth;
html2canvas(copy_ele, {
      useCORS: true,
     }).then((canvas) => {
       // do your things
     });
canvas_handler.removeChild(table_ele);

이 방법을 μ‹œλ„ν–ˆμ§€λ§Œ μ •ν™•νžˆ μž‘λ™ν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€. λ‚΄ λ°©μ‹μœΌλ‘œ μ•„λž˜ μ½”λ“œμ™€ ν•¨κ»˜ μž‘λ™ν•©λ‹ˆλ‹€.

const copy_ele = origin_ele.cloneNode(true);
canvas_handler.contentDocument.body.appendChild(copy_ele);
canvas_handler.height = origin_ele.scrollHeight;
canvas_handler.width = origin_ele.scrollWidth;
html2canvas(canvas_handler.contentDocument.body, {
  useCORS: true,
}).then((canvas) => {
  // do your things
  canvas_handler.removeChild(copy_ele);
});

그리고 CSS μŠ€νƒ€μΌμ„ ν˜„μž¬ λ¬Έμ„œμ™€ λ™μΌν•˜κ²Œ μ μš©ν•˜λ €λ©΄ μŠ€νƒ€μΌμ„ iframe에 볡사해야 ν•©λ‹ˆλ‹€.

// add style
const link = document.createElement('link');
link.rel = 'stylesheet';
link.href = 'your_style_file_url.css';
canvas_handler.contentDocument.head.appendChild(link);

const copy_ele = origin_ele.cloneNode(true);
canvas_handler.contentDocument.body.appendChild(copy_ele);
canvas_handler.height = origin_ele.scrollHeight;
canvas_handler.width = origin_ele.scrollWidth;
html2canvas(canvas_handler.contentDocument.body, {
  useCORS: true,
}).then((canvas) => {
  // do your things
  canvas_handler.removeChild(copy_ele);
});

λ‹€μ‹œ λ§ν•˜μ§€λ§Œ 이것은 λΈŒλΌμš°μ € 자체의 ν•œκ³„μ΄λ©° 이 λΌμ΄λΈŒλŸ¬λ¦¬λŠ” 였λ₯˜λ₯Ό μ˜¬λ°”λ₯΄κ²Œ μ²˜λ¦¬ν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€. 캑처된 ν”½μ…€ 수λ₯Ό μ œν•œν•˜λŠ” 것 μ™Έμ—λŠ” μ½”λ”© μ†”λ£¨μ…˜μ΄ λ³€κ²½λ˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€.

음, 같은 λ¬Έμ œκ°€ λ°œμƒν–ˆμ§€λ§Œ λ§ˆμΉ¨λ‚΄ μ•Œμ•„λƒˆμŠ΅λ‹ˆλ‹€!
제 κ²½μš°μ—λŠ” λ‹€μŒκ³Ό 같은 해결책이 μžˆμŠ΅λ‹ˆλ‹€.
λ‹€μŒκ³Ό 같이 body μš”μ†Œμ— iframe을 λ„£μœΌμ‹­μ‹œμ˜€.

<html>
  <head>
  #canvas_handler {
   position:absolute;
   left: -10000px;
  }
  </head>
  <body>
  <iframe id="canvas_handler" />
  </body>
</html>

μΊ”λ²„μŠ€λ‘œ λ³€ν™˜ν•˜λŠ” 데 ν•„μš”ν•œ λͺ¨λ“  μš”μ†Œλ₯Ό β€‹β€‹λ³΅μ‚¬ν•˜μ—¬ 이 iframe에 λ„£κ³  html2canvasλ₯Ό μ‚¬μš©ν•˜μ—¬ λ‹€μŒκ³Ό 같이 μ œκ±°ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

const copy_ele = origin_ele.cloneNode(true);
canvas_handler.appendChild(copy_ele);
canvas_handler.style.height = origin_ele.scrollHeight;
canvas_handler.style.width = origin_ele.scrollWidth;
html2canvas(copy_ele, {
      useCORS: true,
     }).then((canvas) => {
       // do your things
     });
canvas_handler.removeChild(table_ele);

이 방법을 μ‹œλ„ν–ˆμ§€λ§Œ μ •ν™•νžˆ μž‘λ™ν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€. λ‚΄ λ°©μ‹μœΌλ‘œ μ•„λž˜ μ½”λ“œμ™€ ν•¨κ»˜ μž‘λ™ν•©λ‹ˆλ‹€.

const copy_ele = origin_ele.cloneNode(true);
canvas_handler.contentDocument.body.appendChild(copy_ele);
canvas_handler.height = origin_ele.scrollHeight;
canvas_handler.width = origin_ele.scrollWidth;
html2canvas(canvas_handler.contentDocument.body, {
  useCORS: true,
}).then((canvas) => {
  // do your things
  canvas_handler.removeChild(copy_ele);
});

그리고 CSS μŠ€νƒ€μΌμ„ ν˜„μž¬ λ¬Έμ„œμ™€ λ™μΌν•˜κ²Œ μ μš©ν•˜λ €λ©΄ μŠ€νƒ€μΌμ„ iframe에 볡사해야 ν•©λ‹ˆλ‹€.

// add style
const link = document.createElement('link');
link.rel = 'stylesheet';
link.href = 'your_style_file_url.css';
canvas_handler.contentDocument.head.appendChild(link);

const copy_ele = origin_ele.cloneNode(true);
canvas_handler.contentDocument.body.appendChild(copy_ele);
canvas_handler.height = origin_ele.scrollHeight;
canvas_handler.width = origin_ele.scrollWidth;
html2canvas(canvas_handler.contentDocument.body, {
  useCORS: true,
}).then((canvas) => {
  // do your things
  canvas_handler.removeChild(copy_ele);
});

제 κ²½μš°μ—λŠ” λͺ¨λ“  μš”μ†Œκ°€ svg λ˜λŠ” 인라인 μŠ€νƒ€μΌμ΄λ―€λ‘œ μŠ€νƒ€μΌμ‹œνŠΈλ₯Ό μΆ”κ°€ν•  ν•„μš”κ°€ μ—†μŠ΅λ‹ˆλ‹€. ν•˜μ§€λ§Œ 예, ν•„μš”ν•œ 경우 μŠ€νƒ€μΌμ‹œνŠΈλ₯Ό μΆ”κ°€ν•΄μ•Ό ν•©λ‹ˆλ‹€.

λ‚˜λŠ” 같은 λ¬Έμ œμ— μ§λ©΄ν–ˆλ‹€. λͺ¨λ‹¬ μ°½(κ³ μ • μœ„μΉ˜)μ—μ„œ 이미지λ₯Ό λ§Œλ“€μ–΄μ•Ό ν–ˆμŠ΅λ‹ˆλ‹€. λ‚˜λŠ” 항상 흰색 이미지λ₯Ό λ°›μ•˜μŠ΅λ‹ˆλ‹€. λ¬Έμ œλŠ” 슀크둀 μœ„μΉ˜μ— μžˆμ—ˆμŠ΅λ‹ˆλ‹€. 이 μ½”λ“œλŠ” μ €μ—κ²Œ νš¨κ³Όμ μž…λ‹ˆλ‹€.

const el = document.getElementById('html-to-canvas-area')
const area = el.getBoundingClientRect()
html2canvas(el, {
  scrollX: 0,
  scrollY: 0,
  width: area.width,
  height: area.height
})

맀λ ₯처럼 λ‚˜λ₯Ό μœ„ν•΄ μΌν–ˆμŠ΅λ‹ˆλ‹€! μ˜λ¦¬ν•œ μ†”λ£¨μ…˜μ— κ°μ‚¬λ“œλ¦½λ‹ˆλ‹€!

@invisor 생λͺ…μ˜ 은인! 그것이 λ‚˜λ₯Ό μœ„ν•΄ μΌν•œ μœ μΌν•œ κ²ƒμž…λ‹ˆλ‹€.

이 μ˜΅μ…˜μ€ κ΄€λ ¨ 사둀λ₯Ό μŠ€ν¬λ‘€ν•˜κΈ° μœ„ν•œ μ†”λ£¨μ…˜μΌ μˆ˜λ„ μžˆμŠ΅λ‹ˆλ‹€.

{
  scrollX: 0,
  scrollY: -window.scrollY
}

이 νŽ˜μ΄μ§€κ°€ 도움이 λ˜μ—ˆλ‚˜μš”?
0 / 5 - 0 λ“±κΈ‰