jQuery

[jQuery] HTML 페이지 PDF로 다운로드

은둔한량 2024. 2. 20. 16:53
반응형

html 영역을 PDF 다운로드 할수 있는 소스 입니다.
최상단에는 jspdf.js 와 html2canvas.min.js 가 필요함.

div id="report" 부분을 전체영역으로 설정했으며, 그 안에 영역도 세분화 하였습니다.  (a,b,c,d)
스크립트 all_area_array 전체 영역을 잡았으며, pdf 다운영역은 b영역을 제외한 a,c,d 부분만 다운로드 처리 하였습니다.
간단한 소스 이므로 직접 해보시면 될것 같습니다.

<html>
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.2.1/jquery.min.js"></script>
<script type="text/javascript" src="https://cdnjs.cloudflare.com/ajax/libs/jspdf/1.5.3/jspdf.min.js"></script>
<script type="text/javascript" src="https://html2canvas.hertzen.com/dist/html2canvas.min.js"></script>
<body>
	<div class="report">
		<div id="a">
			<h1>A 영역 입니다.</h1>
		</div>

		<div id="b">
			<h1>B 영역 입니다.</h1>
		</div>
		 
		<div id="c">
			<h1>C 영역 입니다.</h1>
		</div>

		<div id="d">
			<h1>D 영역 입니다.</h1>
		</div>
	</div>

	<button type="button" id="pdf">pdf 다운</button>

	<script type="text/javascript">
    let all_area_array = ['#a','#b','#c','#d']; //전체영역 area
    let area_array = ['#a','#c','#d']; //pdf 다운 영역

    $('#pdf').on("click", function () {
      let difference = all_area_array.filter(x => !area_array.includes(x));

      $.each(difference,function(index, item){
        $(item).attr('data-html2canvas-ignore', true);
      });
      setTimeout(pdfMake(),500);
    });

    const pdfMake = () => {
      html2canvas($('.report')[0]).then(function(canvas) {
        let imgData = canvas.toDataURL('image/png');

        let imgWidth = 210; // 이미지 가로 길이(mm) A4 기준
        let pageHeight = imgWidth * 1.414;  // 출력 페이지 세로 길이 계산 A4 기준
        let imgHeight = canvas.height * imgWidth / canvas.width;
        let heightLeft = imgHeight;

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

        // 첫 페이지 출력
        doc.addImage(imgData, 'PNG', 0, position, imgWidth, imgHeight);
        heightLeft -= pageHeight;

        // 한 페이지 이상일 경우 루프 돌면서 출력
        while (heightLeft >= 20) {
            position = heightLeft - imgHeight;
            doc.addPage();
            doc.addImage(imgData, 'PNG', 0, position, imgWidth, imgHeight);
            heightLeft -= pageHeight;
        }

        let today = new Date();
        let year = today.getFullYear();
        let month = ('0' + (today.getMonth() + 1)).slice(-2);
        let day = ('0' + today.getDate()).slice(-2);
        let hours = ('0' + today.getHours()).slice(-2);
        let minutes = ('0' + today.getMinutes()).slice(-2);

        let dateString = year + month + day + hours + minutes;

        // 파일 저장
        doc.save("Report_"+dateString+'.pdf');
      });
    }
	</script>
</body>
</html>
반응형