javascript를 사용하여 HTML 페이지의 div를 pdf로 다운로드


91

ID가 "content"인 콘텐츠 div가 있습니다. 콘텐츠 div에는 그래프와 테이블이 있습니다. 사용자가 다운로드 버튼을 클릭하면 해당 div를 pdf로 다운로드하고 싶습니다. javascript 또는 jQuery를 사용하여 수행하는 방법이 있습니까?


1
code.google.com/p/jspdf 는 내가 아는 최고의 라이브러리입니다.
AlvinArulselvan

특정 div에서 콘텐츠를 다운로드하기 위해 jsPDF를 어떻게 사용할 수 있습니까? 내가 그들의 사이트의 예에서 보는 것에서 그것은 할 수 없습니다.
Midhun 매튜

답변:


112

jsPDF를 사용하여 할 수 있습니다.

HTML :

<div id="content">
     <h3>Hello, this is a H3 tag</h3>

    <p>A paragraph</p>
</div>
<div id="editor"></div>
<button id="cmd">generate PDF</button>

자바 스크립트 :

var doc = new jsPDF();
var specialElementHandlers = {
    '#editor': function (element, renderer) {
        return true;
    }
};

$('#cmd').click(function () {
    doc.fromHTML($('#content').html(), 15, 15, {
        'width': 170,
            'elementHandlers': specialElementHandlers
    });
    doc.save('sample-file.pdf');
});

25
여기에 문제가 있습니다. 여기에 추가 한 CSS가 pdf 파일에 적용되지 않습니다. 또한 몇 가지 그래프도 있습니다.. pdf에 포함되지 않는 r. 그것들을 얻으려면 어떻게해야합니까?
Midhun Mathew 2013

14
jsPDF는 표의 형식을 제대로 지정하지 않고 td / th를 display : block으로 해석합니다.
Dave

2
위의 코드를 사용하면 pdf를 한 번만 만들 수 있습니다. 그러나 두 번째로 작동하지 않습니다. 작동하려면 @ kristof-feys 의이 답변 을 확인 doc하십시오. click 함수 내부에 변수 를 선언해야 합니다.
Mahendran Sakkarai

4
이것은 좋은 것입니다. CSS가 렌더링되지 않는 것은 부끄러운
Nicholas

1
인코딩 문제에 직면했습니다
ema

19

안에있는 콘텐츠는 jspdfhtml2canvas를<div class='html-content'>....</div> 사용하여 스타일이있는 pdf로 다운로드 할 수 있습니다 .

두 js 라이브러리를 모두 참조해야합니다.

<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.js"></script>

그런 다음 아래 함수를 호출하십시오.

//Create PDf from HTML...
function CreatePDFfromHTML() {
    var HTML_Width = $(".html-content").width();
    var HTML_Height = $(".html-content").height();
    var top_left_margin = 15;
    var PDF_Width = HTML_Width + (top_left_margin * 2);
    var PDF_Height = (PDF_Width * 1.5) + (top_left_margin * 2);
    var canvas_image_width = HTML_Width;
    var canvas_image_height = HTML_Height;

    var totalPDFPages = Math.ceil(HTML_Height / PDF_Height) - 1;

    html2canvas($(".html-content")[0]).then(function (canvas) {
        var imgData = canvas.toDataURL("image/jpeg", 1.0);
        var pdf = new jsPDF('p', 'pt', [PDF_Width, PDF_Height]);
        pdf.addImage(imgData, 'JPG', top_left_margin, top_left_margin, canvas_image_width, canvas_image_height);
        for (var i = 1; i <= totalPDFPages; i++) { 
            pdf.addPage(PDF_Width, PDF_Height);
            pdf.addImage(imgData, 'JPG', top_left_margin, -(PDF_Height*i)+(top_left_margin*4),canvas_image_width,canvas_image_height);
        }
        pdf.save("Your_PDF_Name.pdf");
        $(".html-content").hide();
    });
}

참조 : html canvas 및 jspdf에서 pdf 생성 .

이것이 누군가를 도울 수 있습니다.


4
이것은 나를 위해 잘 작동했습니다, 감사합니다. 모든 스타일을 유지하지만 몇 가지 제한 사항이 있습니다 (PDF를 이미지로 생성하므로 검색 할 수 없으며 약간 흐릿하게 보입니다).
jramm

콘텐츠의 절반이 한 페이지에 맞지 않으면 페이지 나누기를 설정하는 방법은 무엇입니까?
SHEKHAR SHETE

나에게 아주 잘했습니다. 유일한 문제는 내 SVG 아이콘 중 일부가 렌더링되지 않았다는 것입니다!
Felipe N Moura

2

솔루션에는 html to pdf 기능이있는 백엔드 서버에 html을 전달한 다음 생성 된 pdf 출력을 다시 브라우저에 반환하는 ajax 메소드가 필요합니다.

먼저 클라이언트 측 코드를 설정하고 jquery 코드를 다음과 같이 설정합니다.

   var options = {
            "url": "/pdf/generate",
            "data": "data=" + $("#content").html(),
            "type": "post",
        }
   $.ajax(options)

그런 다음 다음과 같이 html2pdf 생성 스크립트에서 데이터를 가로 챕니다.

   $html = $_POST['data'];
   $pdf = html2pdf($html);

   header("Content-Type: application/pdf"); //check this is the proper header for pdf
   header("Content-Disposition: attachment; filename='some.pdf';");
   echo $pdf;

 


"htmltopdf 기능이 있음"이란 무엇을 의미합니까 ??
Midhun 매튜

동일한 URL을 참조해도 괜찮습니까, 아니면 변경해야합니까?
Midhun 매튜

당신이이 개 내용을 구별 할 수 있도록 약간 다른 URL을 필요
DevZer0

그 URL은 어떻게되어야합니까? 예를 들어 줄 수 있습니까 ??
Midhun 매튜

2
백엔드 프로그램이 CSS 파일을 가져 와서 파일 내에서 스타일을 적용 할 수없는 경우 스타일을 찾을 수 없기 때문에 CSS가 연결되어 있으면 엉망이 될 것입니다.
TheRealChx101

1

AFAIK에는이를 수행하는 기본 jquery 함수가 없습니다. 가장 좋은 방법은 서버에서 변환을 처리하는 것입니다. 이를 수행하는 방법은 사용중인 언어 (.net, php 등)에 따라 다릅니다. div의 내용을 변환을 처리하는 함수에 전달할 수 있으며, 그러면 사용자에게 pdf가 반환됩니다.


-1

예, JS에서 div를 PDF로 캡처 할 수 있습니다. https://grabz.it에서 제공하는 솔루션을 확인할 수 있습니다 . div 또는 span과 같은 단일 HTML 요소의 콘텐츠를 캡처 할 수있는 멋지고 깨끗한 JavaScript API가 있습니다.

그래서, 당신은 그것을 사용하고 app + key 및 무료 SDK 가 필요합니다 . 사용법은 다음과 같습니다.

HTML이 있다고 가정 해 보겠습니다.

<div id="features">
    <h4>Acme Camera</h4>
    <label>Price</label>$399<br />
    <label>Rating</label>4.5 out of 5
</div>
<p>Cras ut velit sed purus porttitor aliquam. Nulla tristique magna ac libero tempor, ac vestibulum felisvulput ate. Nam ut velit eget
risus porttitor tristique at ac diam. Sed nisi risus, rutrum a metus suscipit, euismod tristique nulla. Etiam venenatis rutrum risus at
blandit. In hac habitasse platea dictumst. Suspendisse potenti. Phasellus eget vehicula felis.</p>

기능 ID 아래에있는 것을 캡처하려면 다음을 수행해야합니다.

//add the sdk
<script type="text/javascript" src="grabzit.min.js"></script>
<script type="text/javascript">
//login with your key and secret. 
GrabzIt("KEY", "SECRET").ConvertURL("http://www.example.com/my-page.html",
{"target": "#features", "format": "pdf"}).Create();
</script>

http://www.example.com/my-page.html대상 URL 및 #featureCSS 선택기 로 바꿔야합니다 .

그게 다야. 이제 페이지가로드 될 때 이미지 스크린 샷이 스크립트 태그와 동일한 위치에 생성되며, 여기에는 기능 div의 모든 콘텐츠 만 포함됩니다.

div 스크린 샷 메커니즘에 대해 수행 할 수있는 다른 구성 및 사용자 정의는 여기에서 확인 하십시오.


2
grabz.it으로 1,000 개의 무료 캡처와 100 개의 무료 "스크랩"을 얻을 수 있다고 생각합니다. 따라서 비용을 지불하지 않는 한 영구적 인 해결책은 아닙니다.
BrettC
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.