본문 바로가기
웹 프로그래밍

[HTML/JS] HTML to PDF download

by Ratataca 2023. 9. 19.

SVG 태그가 PDF 변환에 문제를 일으키는 경우, SVG 요소를 이미지로 변환한 다음 PDF에 추가할 수 있습니다. 아래 코드에서는 SVG를 이미지로 변환하고 jsPDF를 사용하여 PDF에 추가하는 방법을 보여줍니다.

<!DOCTYPE html>
<html lang="ko">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>HTML을 PDF로 변환하여 다운로드</title>
    <script src="https://cdnjs.cloudflare.com/ajax/libs/jspdf/2.4.0/jspdf.umd.min.js"></script>
    <script src="https://cdnjs.cloudflare.com/ajax/libs/html2canvas/0.4.1/html2canvas.min.js"></script>
</head>
<body>
    <h1>Hello, World!</h1>
    <p>This is a sample content.</p>
    <button onclick="generatePDF()">Generate PDF</button>

    <script>
        function generatePDF() {
            const { jsPDF } = window.jspdf;
            const pdf = new jsPDF();
            const element = document.body;

            html2canvas(element).then(canvas => {
                const imageData = canvas.toDataURL('image/png');
                pdf.addImage(imageData, 'PNG', 0, 0, pdf.internal.pageSize.getWidth(), pdf.internal.pageSize.getHeight());
                pdf.save('output.pdf');
            });
        }
    </script>
</body>
</html>​

 

 

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>HTML to PDF</title>
    <script src="https://cdnjs.cloudflare.com/ajax/libs/jspdf/2.4.0/jspdf.umd.min.js"></script>
</head>
<body>
    <!-- 여기에 화면 내용을 추가합니다. -->
    <h1>Hello, World!</h1>
    <p>This is a sample content.</p>
    <!-- SVG를 이미지로 변환하여 추가할 div 요소 -->
    <div id="svgContainer">
        <svg xmlns="http://www.w3.org/2000/svg" width="100" height="100">
            <circle cx="50" cy="50" r="40" stroke="black" stroke-width="2" fill="red" />
        </svg>
    </div>
    <button onclick="generatePDF()">Generate PDF</button>

    <script>
        async function generatePDF() {
            const { jsPDF } = window.jspdf;
            const pdf = new jsPDF();
            const element = document.body; // 화면 내용을 포함하는 요소
            const svgContainer = document.getElementById('svgContainer');

            // SVG를 이미지로 변환하고 PDF에 추가
            const svgElement = svgContainer.querySelector('svg');
            const svgData = new XMLSerializer().serializeToString(svgElement);

            const canvas = document.createElement('canvas');
            const img = new Image();
            img.src = 'data:image/svg+xml;base64,' + btoa(svgData);

            img.onload = function() {
                canvas.width = img.width;
                canvas.height = img.height;
                const ctx = canvas.getContext('2d');
                ctx.drawImage(img, 0, 0);

                const imageData = canvas.toDataURL('image/jpeg');
                pdf.addImage(imageData, 'JPEG', 10, 150, 100, 100);

                // jsPDF의 html2pdf 모듈을 사용하여 HTML을 PDF로 변환
                pdf.html(element, {
                    callback: function (pdf) {
                        // 생성된 PDF를 다운로드
                        pdf.save('output.pdf');
                    }
                });
            };
        }
    </script>
</body>
</html>

 

댓글