Reactjs

[React] html2Canvas를 이용하여 화면 스크린샷 및 저장 기능 구현하기

didue 2024. 9. 8. 18:41
반응형

 

 

 

SI프로젝트에서는 아직 많은 환경이 폐쇄망에서 이루어 진다.

내가 있는 금융권 프로젝트는 특히 더더욱 그러함😂🤣

 

그래서 이러한 요구사항이 나온적이 있다. 단위테스트/통합테스트 단계에서 결함 이미지를 따서 이미지를 반입요청하고, 이를 프로젝트 관리시스템(PMS)에 업로드하기까지 너무 번거롭다는 것이다..!

 

그래서 테스트기간 중 화면에 챗봇버튼처럼 플로팅 버튼을 두어 

클릭하면 해당 화면을 캡처하면 해당 프로그램에 대한 정보로 PMS업로드 까지 연결해달라는 것! 

 

 

그래서 알아보았다!

화면을 캡처하고 이미지로 내려받게하는 아주 요긴한 라이브러리~

이름하여 'html2Canvas' !

 

 


이미지 캡처를 도와주는 라이브러리에는 html2canvas, dom-to-image, html-to-image 등 여러개가 있지만,

html2canvas 라이브러리가 npm trends에서 가장 인기가 있고 최신 업데이트 패치도 해주기 때문에 선택하게 되었다!

 

더보기

💡 html2Canvas 스크립트를 사용하면 사용자 브라우저에서 직접 웹 페이지 또는 일부의 "스크린샷"을 찍을 수 있습니다. 스크린샷은 DOM을 기반으로 하며 실제 스크린샷을 만드는 것이 아니라 페이지에서 사용 가능한 정보를 기반으로 스크린샷을 빌드하기 때문에 실제 표현과 100% 정확하지 않을 수 있습니다.

 


 

 

Install

npm install --save html2canvas
or
yarn add html2canvas

 

 

1. target element를 지정하기

//App.tsx
const App = () => {
	
    const appRef = useRef<HTMLDivElement>(null);
    
      const onClickCapture = async () => {
        if(!appRef.current) return;

        try{
          const app = appRef.current;
          const canvas = await html2canvas(app);

          canvas.toBlob((blob) => {
            if(blob !== null){

              console.log('blob :', blob);
              console.log('blob url : ', URL.createObjectURL(blob));

			  //a태그 버튼 만들어서 이미지 다운로드
              const aTag = document.createElement('a');
              document.body.appendChild(aTag);
              aTag.href = URL.createObjectURL(blob); //blob url주소 사용
              aTag.download = 'capture.png';
              aTag.click();
              document.body.removeChild(aTag);
            }
          });

        }catch(error){
          console.error('Error on Converting div to Image. :', error);
        }
      }


     return (
        <div className="App">
          <div ref={appRef}>
          <header className="App-header">
            <img src={logo} className="App-logo" alt="logo" />
            <p>~ 리액트 스크린샷 이미지 다운로드 해보기 ~ </p>
            
            <button onClick={onClickCapture}>Screen Capture</button>
          </div>
        </div>
    );

}

 

 

 

2. 화면 전체 DOM 저장하기

//App.tsx
const App = () => {
	
      const onClickCapture = () => {
        html2canvas(document.body)
          .then((canvas: HTMLCanvasElement) => {
          const dataUrl = canvas.toDataURL('image/png');
          console.log('canvas :', canvas);
          console.log('canvas blob url :', dataUrl);

          const aTag = document.createElement('a');
          document.body.appendChild(aTag);
          aTag.href = dataUrl;
          aTag.download = 'capture.png';
          aTag.click();      
          document.body.removeChild(aTag);

        }).catch(error => {
          console.error('Error on Converting div to Image. :', error);
        });
      }

     return (
        <div className="App">
          <div ref={appRef}>
          <header className="App-header">
            <img src={logo} className="App-logo" alt="logo" />
            <p>~ 리액트 스크린샷 이미지 다운로드 해보기 ~ </p>
            
            <button onClick={onClickCapture}>Screen Capture</button>
          </div>
        </div>
    );

}

 

 

base64 URL 을 사용할 경우 

const canvas = await html2canvas(document.body);

canvas.toBlob((blob) => {
  if(blob !== null) return;

  const render = new FileReader();
  render.readAsDataURL(blob);
  
  render.onload = () => {
    const aTag = document.createElement('a');
    document.body.appendChild(aTag);
    aTag.href = render.result as string;
    aTag.download = 'capture.png';
    aTag.click();
    document.body.removeChild(aTag);
  }

});

 

 

 

 


참고링크

반응형