본문 바로가기
개발/JavaScript

[JavaScript] html2pdf.js 사용해서 pdf 파일 만들기

by 코딩하는 흰둥이 2025. 8. 9.

해당 사이트

https://ekoopmans.github.io/html2pdf.js/

 

html2pdf.js

Client-side HTML-to-PDF rendering using pure JS.

ekoopmans.github.io

 

 

 

html2pdf.jshtml2canvasjsPDF 를 이용하여

웹페이지의 화면이나 특정 html 의 태그를 pdf 파일로 변환해 주는 Javascript 라이브러리

 

 

Java 에서 Openhtmltopdf PDF Rendering dependency 를 추가해서 

PdfRendererBuilder 를 이용하여 pdf 를 만들려고 했는데

html 내의 데이터가 영어 외의 언어면 ######## 로 깨지는 문제가 발생하였고

font 를 추가하여 설정하면 된다고 하는데 잘 되지 않아서

Javascript 로 제어할 수 있는 html2pdf.js 을 사용하게 되었다

 

 

 

Javascript
function pdfDownLoad(){
    // javascript
    //const element = document.querySelector("#pdfDown");

    // jquery
    const element = $("#pdfDown")[0];
    
    /*
        html2pdf 자체 옵션, html2canvas 옵션, jsPDF 옵션 세가지로 나뉜다
     */

    /*
        html2pdf 옵션

        margin: 0                               // pdf 여백(html2pdf 자체 옵션)
        filename: 'download.pdf'                // 파일 저장 명(html2pdf 자체 옵션)
        image: { type: 'jpeg', quality: 0.95 }  // pdf 에 넣을 이미지 확장자와 품질
        enableLinks: true                       // html 내의 링크를 pdf 에서도 클릭 가능하게 여부
        pagebreak: // 태그를 기준으로 페이지를 나누는 방식(여기선 정리하지 않겠음)
        등등
    */

    /*
        html2canvas 옵션

        scale: 2                    // 해상도 배율(2~3권장)
        useCORS: false              // 외부이미지(CORS) 허용 여부 기본값 false
        allowTaint: false           // cross-origin 이미지 그리기 허용 기본값 false
        backgroundColor: #ffffff    // 배경색 기본값 #ffffff
        등등
     */

    /*
        jsPDF

        unit: 'mm'              // 'pt', 'mm', 'cm'. 'in', 'px' 의 단위를 나타냄 기본값은 'mm'
        format: 'a4'            // 용지크기
        orientation: 'portrait' // 페이지 방향 portrait, landscape
        compressPDF: false      // pdf 압축 여부 기본값 false
        등등
     */

    html2pdf().set({
        margin: 0.5,
        filename: 'download.pdf',
        html2canvas: { scale: 2, useCORS: true },
        jsPDF: { unit: 'in', format: 'a4', orientation: 'portrait' }
    }).from(element).save();

}

 

 

 

html
<body>
        <div class="d-sm-flex align-items-center justify-content-between mb-4">
            <h1 class="h3 mb-0 text-gray-800">사내 일정</h1>
            <button type="button" onclick="pdfDownLoad()">PDF DownLoad</button>
        </div>

        <div id="pdfDown">
            <!-- DataTales Example -->
            <div class="card shadow mb-4">
                <div class="card-header py-3"  style="text-align: left">
                    <h5 class="m-0 font-weight-bold text-dark">달력</h5>
                </div>
                <div class="card-body">
                    <div id="calendar-container">
                        <div id="calendar"></div>
                    </div>
                </div>
            </div>
        </div>
</body>
        
<!-- html2pdf cdn -->
<script src="https://cdnjs.cloudflare.com/ajax/libs/html2pdf.js/0.10.1/html2pdf.bundle.min.js"></script>

 

html2pdf.js 을 사용할 임의의 태그에 id="pdfDown" 을 지정해 주었다

 

 

 

 

 

TEST

임의 화면

 

PDF DownLoad 버튼을 클릭하면 

from(element).save() 코드로 인하여 파일로 바로 저장된다

 

 

저장된 pdf

 

 

 


 

 

 

pdf 로 만들려는 태그의 크기를 따로 설정을 하지 않으면

현재 웹페이지에서 보여지는 크기로 파일을 생성한다

 

위의 저장된 pdf 의 경우 브라우저의 크기를 줄여서 작아진 상태일 때 pdf 파일을 만든 경우이고

아래의 이미지의 경우 전체화면 브라우저 상태에서 pdf 파일을 만든 경우 다

 

원래 달력의 크기가 화면의 80%의 크기였고 pdf의 a4 크기가 이를 담지 못한다

 

이런 식으로 태그의 내용이 잘려서 파일이 생성되기 때문에 pdf 를 생성할 때 크기를 계산해야 한다

각각의 프로젝트마다 화면 구조 및 구현하려는 방식이 다르고, 

css 도 제각기 이기 때문에 크기 계산에 대한 코드는 정리하지 않겠다

 

 

 

참고로 pdf 를 만들려는 태그 또는 화면을 이미지와 하여 pdf 로 만드는 경우

pdf 에 맞는 크기로 만들어질 수 있으나,

태그 또는 화면에 링크 기능이 있다면 해당 기능은 이미지 화 되어 동작하지 않으니 참고할 것

 

 

댓글