html의 화면을 캡쳐해서 이미지로 변경하는 html2canvas와 pdf로 저장하는 jsPDF 라이브러리 소개

web/javaScript|2018. 6. 29. 23:21

회사에서 업무를 진행하면서 현재 화면을 pdf로 만들어야하는 일이 있었다.

기존에 html을 pdf로 스프링에서 만드는 업무는 진행을 했었다. 이때는 이전에 포스팅을 했었으니 참고 하시면 좋을 것 같다. (Spring에서 html2pdf를 사용해서 pdf파일 만들기)

우선 현재 화면을 딱 캡쳐해서 image로 만드는 작업이 필요했다. 그 작업을 제공해주는 라이브러리가 바로 html2canvas이다.

 

html2canvas

우선 html2canvas를 사용하기 위해 파일을 받아보자.

npm install --save html2canvas

캡처를 진행하기 위해서는 캡처하고자 하는 영역을 selector로 위치를 받아서 지정할 수 있다.

우선 캡처를 진행할 화면을 간단하게 만들어보자.

<div id="capture" style="padding: 10px; background: #f5da55">
    <h4 style="color: #000; ">Hello world! Wedul Capture Test!</h4>
</div>

<button id="captureBtn" style="padding:20px;margin-top:15px;">Capture Start!!</button>

<script src="./node_modules/jquery/dist/jquery.min.js"></script>
<script src="./node_modules/html2canvas/dist/html2canvas.min.js"></script>
<script src="./index.js"></script>

하단에 captureBtn 버튼을 누를 경우에 capture영역이 image로 떨어지도록 javascript를 만들어보자.

// 버튼 클릭할 시 캡처한 내용 body에 붙혀보기
$('#captureBtn').click((e) => {
  html2canvas(document.querySelector("#capture")).then(canvas => {
    document.body.appendChild(canvas)
  });
});

캡처 방식이 생각보다 너무 간단하다. querySelector로 영역을 선택하고 html2canvas라이브러리를 호출하면 프로미스를 사용하여 나온 canvas객체를 조작하여 image로 넣을수도 있고 특정 파일로 변경할 수도 있다. 결과는 다음과 같이 버튼을 눌렀을 때 바로 밑에 이미지가 추가되는 것을 확인할 수 있다.

 

jsPDF

그럼 html2canvas로 출력된 image를 pdf 파일로 빼고 싶다면 어떻게 해야할까? 바로 jsPDF 라이브러리를 사용하면 된다.

홈페이지에 들어가면 자세하게 샘플코드가 나와있다. 그럼 간단하게 한번 만들어보자. 

우선 pdf파일로 빼내기 위해서는 jsPDF 라이브러리가 필요하니 설치부터 진행하자.

npm i jspdf --save

// import
<script src="./node_modules/jspdf/dist/jspdf.min.js"></script>

그리고 위에 html2canvas에서 사용한 문장을 그대로 사용하고 출력되서 나온 canvas를 사용하여 pdf로 만들어보자.

// 버튼 클릭할 시 캡처한 내용 body에 붙혀보기
$('#captureBtn').click((e) => {
  html2canvas(document.querySelector("#capture")).then(canvas => {
    // jsPDF 객체 생성 생성자에는 가로, 세로 설정, 페이지 크기 등등 설정할 수 있다. 자세한건 문서 참고.
    // 현재 파라미터는 기본값이다 굳이 쓰지 않아도 되는데 저것이 기본값이라고 보여준다.
    var doc = new jsPDF('p', 'mm', 'a4');

    // html2canvas의 canvas를 png로 바꿔준다.
    var imgData = canvas.toDataURL('image/png'); //Image 코드로 뽑아내기

    // image 추가
    doc.addImage(imgData, 'PNG', 0, 0);

    // pdf로 저장
    doc.save('sample-file.pdf');
  });
});

 

버튼을 클릭해보면 짠하고 pdf가 우선은 다운로드 된 것을 확인할 수 있다. 그럼 pdf 파일을 열어보자!

오호 잘나온다. 참 좋은 시대다 좋은 오픈소스 라이브러리도 많고 공부할 것도 많고 참 본받을 것이 많은 사람들이다.

추가적인 옵션은 문서에 보면 자세히 나와있다.

여기서 참고할만한 내용이 하나 있어서 적어놓았다. 만약에 캡처한 이미지가 출력하는 pdf 페이지보다 클 경우에는 페이지 별로 짤라서 이미지를 붙혀넣으면 자연스럽게 pdf 파일이 만들어진다. 코드는 아래 내용을 참고!

var imgData = canvas.toDataURL('image/png');

var imgWidth = 210; 
var pageHeight = 295;  
var imgHeight = canvas.height * imgWidth / canvas.width;
var heightLeft = imgHeight;

var doc = new jsPDF('p', 'mm');
var position = 0;

doc.addImage(imgData, 'PNG', 0, position, imgWidth, imgHeight);
heightLeft -= pageHeight;

while (heightLeft >= 0) {
  position = heightLeft - imgHeight;
  doc.addPage();
  doc.addImage(imgData, 'PNG', 0, position, imgWidth, imgHeight);
  heightLeft -= pageHeight;
}
doc.save(filename + '.pdf');

 

 

자세한 문서는 https://rawgit.com/MrRio/jsPDF/master/docs/index.html에서 확인해보자.

댓글()
  1. 2018.08.08 00:53 댓글주소  수정/삭제  댓글쓰기

    안녕하세요! 혹시 소스파일 받아볼 수 가 있을까요?

  2. 김삿갓 2019.01.10 15:49 댓글주소  수정/삭제  댓글쓰기

    body에 이미지를 보여짖말고 바로 다운이 가능한가요?
    pdf처럼요

  3. 호잇 2019.03.27 16:18 댓글주소  수정/삭제  댓글쓰기

    정말 너무너무 감사합니다~
    덕분에 회사업무를 잘 처리할 수 있었습니다 ㅠㅠ!
    유용하게 잘 사용했습니다. 다시한번 감사합니다 ^^

  4. Jack 2020.02.07 13:14 댓글주소  수정/삭제  댓글쓰기

    고맙습니다! 많은 도움이 되었습니다!
    정말 깔끔한 설명과 소스 덕분에 너무 간단하게 처리했습니다.
    둘러보니 정말 좋은 글들이 많네요.
    즐겨찾기 하고 자주 놀러오겠습니다.
    감사합니다!
    애드블럭끄고 광고도 누르고 왔읍니다! ㅋㅋ

    *참고(html2canvas, jspdf CDN)
    <script src="https://html2canvas.hertzen.com/dist/html2canvas.js"></script>
    <script src="https://html2canvas.hertzen.com/dist/html2canvas.min.js"></script>
    <script src="https://cdnjs.cloudflare.com/ajax/libs/jspdf/1.5.3/jspdf.min.js"></script>