jsPDF 라이브러리를 올바르게 사용하는 방법


84

내 div 중 일부를 PDF로 변환하고 jsPDF 라이브러리를 시도했지만 성공하지 못했습니다. 라이브러리 작동을 위해 무엇을 가져와야하는지 이해할 수없는 것 같습니다. 나는 예제를 통해 보았지만 여전히 이해할 수 없습니다. 나는 다음을 시도했다 :

<script type="text/javascript" src="js/jspdf.min.js"></script>

jQuery 이후 :

$("#html2pdf").on('click', function(){
    var doc = new jsPDF();
    doc.fromHTML($('body').get(0), 15, 15, {
        'width': 170
    });
    console.log(doc);
});

테스트 목적이지만 다음을받습니다.

"Cannot read property '#smdadminbar' of undefined"

#smdadminbar본문의 첫 번째 div는 어디에 있습니까 ?


나를 위해 일한 사람 github.com/devrajatverma/jsPdfExample
라자

1
여기 fromHTML에 도착한 모든 사람이 jsPDF 문서에 문서화되지 않은 이유 또는 이유 를 파악하려는 모든 사용자를위한 참고 사항 : " 더 이상 fromHTML 및 addHTML을 지원하지 않을 것이므로이 문제를 종료합니다. "( from issue # 516 )
toraritte

답변:


133

다음과 같이 html에서 pdf를 사용할 수 있습니다.

1 단계 : 헤더에 다음 스크립트 추가

<script src="https://cdnjs.cloudflare.com/ajax/libs/jspdf/1.3.2/jspdf.min.js"></script>

또는 로컬로 다운로드

2 단계 : HTML 스크립트를 추가하여 jsPDF 코드 실행

이를 사용자 정의하여 식별자를 전달하거나 #content를 필요한 식별자로 변경하십시오.

 <script>
    function demoFromHTML() {
        var pdf = new jsPDF('p', 'pt', 'letter');
        // source can be HTML-formatted string, or a reference
        // to an actual DOM element from which the text will be scraped.
        source = $('#content')[0];

        // we support special element handlers. Register them with jQuery-style 
        // ID selector for either ID or node name. ("#iAmID", "div", "span" etc.)
        // There is no support for any other type of selectors 
        // (class, of compound) at this time.
        specialElementHandlers = {
            // element with id of "bypass" - jQuery style selector
            '#bypassme': function (element, renderer) {
                // true = "handled elsewhere, bypass text extraction"
                return true
            }
        };
        margins = {
            top: 80,
            bottom: 60,
            left: 40,
            width: 522
        };
        // all coords and widths are in jsPDF instance's declared units
        // 'inches' in this case
        pdf.fromHTML(
            source, // HTML string or DOM elem ref.
            margins.left, // x coord
            margins.top, { // y coord
                'width': margins.width, // max width of content on PDF
                'elementHandlers': specialElementHandlers
            },

            function (dispose) {
                // dispose: object with X, Y of the last line add to the PDF 
                //          this allow the insertion of new lines after html
                pdf.save('Test.pdf');
            }, margins
        );
    }
</script>

3 단계 : 신체 콘텐츠 추가

<a href="javascript:demoFromHTML()" class="button">Run Code</a>
<div id="content">
    <h1>  
        We support special element handlers. Register them with jQuery-style.
    </h1>
</div>

원본 튜토리얼 참조

작동하는 바이올린보기


4
이것을 게시 해 주셔서 감사합니다.하지만 위의 정확한 코드를 (로컬에서) 시도했고 빈 pdf 문서를 생성합니다. 에 사용되는 내가 같은 JQuery와 버전을 사용 있도록 JQuery와 1.11.0와 전혀 일을하지 않는 github.com/MrRio/jsPDF/blob/master/examples/js/jquery/...
user1063287

코드를 시도했습니다 @Well Wisher, 라이브러리 파일 자체에 대해 다음 오류가 발생했습니다.-정의되지 않은 jspdf.plugin.from_html.js : 500의 속성 '길이'를 읽을 수 없습니다.
학습자

1
네, 정말 좋습니다.하지만 JSPdf의 출력이 내 테이블 요소의 다른 요소와 겹칩니다. 어떻게 해결할 수 있습니까? .... 글꼴 크기를 변경하고 가로 모드로 만들었습니다. 수정의 대부분,하지만 아무것도 작동하지 않습니다
수 디르 Belagali

1
CloudFlare CDN : <script src = " cdnjs.cloudflare.com/ajax/libs/jspdf/1.2.61/… > 또는 <script src =" cdnjs.cloudflare.com 을 사용해서 만이 예제를 작동시킬 수있었습니다. /ajax/libs/jspdf/1.2.61/… >하지만 동의합니다. 문서화 및 코드 소스의 일반적인 변형이이 플러그인 사용의 어려움에 기여합니다. JSfiddle이 사용하는 이러한 CDN조차도 위의 @Well wisher 참조에서 "로컬 다운로드"링크와 다릅니다.
Scott

1
i를 @Scott 그들은 링크를 제거
그럼 희망자

17

이 링크 jspdf.min.js 만 필요합니다.

그 안에 모든 것이 있습니다.

<script src="https://cdnjs.cloudflare.com/ajax/libs/jspdf/1.3.2/jspdf.min.js"></script>

2
고마워, 이것은 나를 미치게 만들었다! jspdf의 디버그 버전을 사용하면 작동했지만 모든 구성의 다른 버전은 작동하지 않았습니다. 축소가 어떻게 든 그것을 깨뜨리고 있습니까? 또는 내가 잘못하고 있습니다.
jookyone

이것은 정말 나를 도왔습니다. 원래 jspdf.js 파일을 사용하고 있었는데 작동하지 않았습니다. jspdf.debug.js를 사용하여 작업을 수행했습니다.
Francisco Quintero 2015 년

프로덕션 버전이 작동하지 않는 이유가 흥미 롭습니다. 모든 플러그인을 html 페이지에 포함 시켰지만이 디버그 버전 만 도움이되었습니다.
ilter

안녕하세요, 나는 이것을 시도했지만 Error in function FileSaver@http://mrrio.github.io/jsPDF/dist/jspdf.debug.js:5875:18: get_URL(...).createObjectURL is not a functionbower 버전을 사용하면 같은 오류가 발생 합니다. 단서가 있습니까?
dbr

GitHub에서 최신 버전을 확인하고 그에 따라 위의 URL을 변경하십시오. 최신 버전은 1.3.5입니다.
pasx

8

이것이 마침내 나를 위해 한 일입니다 (그리고 처분을 유발합니다).

function onClick() {
  var pdf = new jsPDF('p', 'pt', 'letter');
  pdf.canvas.height = 72 * 11;
  pdf.canvas.width = 72 * 8.5;

  pdf.fromHTML(document.body);

  pdf.save('test.pdf');
};

var element = document.getElementById("clickbind");
element.addEventListener("click", onClick);
<h1>Dsdas</h1>

<a id="clickbind" href="#">Click</a>
<script src="https://cdnjs.cloudflare.com/ajax/libs/jspdf/1.3.3/jspdf.min.js"></script>

그리고 KnockoutJS 성향의 경우 약간의 바인딩이 있습니다.

ko.bindingHandlers.generatePDF = {
    init: function(element) {

        function onClick() {
            var pdf = new jsPDF('p', 'pt', 'letter');
            pdf.canvas.height = 72 * 11;
            pdf.canvas.width = 72 * 8.5;

            pdf.fromHTML(document.body);

            pdf.save('test.pdf');                    
        };

        element.addEventListener("click", onClick);
    }
};

이 스 니펫에 더 많은 것이 있습니까? 이것을 실행하려고 할 때 'pdf.canvas'가 정의되지 않았다는 오류가 발생합니다. "Uncaught TypeError : Cannot set property '
Ryan Gibbs

당신이 무슨 뜻인지 확실하지? 스 니펫은 동일한 코드를 사용하여 실행됩니다. 그래서 아마도 당신의 구현에서 뭔가 벗어났습니다. console.log (pdf)를 사용하고 출력을 공유 할 수 있습니다.
pim

캐싱 문제 또는 무언가 였을 것입니다. 방금 console.log ()를 사용하여 시도했을 때 코드가 올바르게 실행되었습니다. 여전히 빈 페이지 문제가 발생하지만 이는 다른 이야기입니다. 감사.
Ryan Gibbs

또한 나는 오류가 "속성 '또는 addEventListener'읽을 수 없습니다"
Manjitha Teshara

이 jsPDF () 라이브러리가 마음에 듭니다. BTW 다른 사람이 유용하다고 생각하면 PDF가 생성 된 후 실행할 콜백을 첨부하는 구문을 알아 냈습니다.pdf.save("myfile.pdf", function(){ alert("pdf generation/save finished!"); });
Christopher D. Emerson

3

jspdf.plugin.from_html.js 라이브러리도 사용해야하지 않습니까? 메인 라이브러리 (jspdf.js) 외에 "특수 작업"을 위해 다른 라이브러리를 사용해야합니다 (예 : 이미지 사용을위한 jspdf.plugin.addimage.js). https://github.com/MrRio/jsPDF를 확인 하십시오 .


3
jspdf.source.js는 다른 모든 라이브러리를 포함하는 것 같습니다.
whossname

3

먼저 핸들러를 만들어야합니다.

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

그런 다음 클릭 이벤트에 다음 코드를 작성하십시오.

doc.fromHTML($('body').get(0), 15, 15, {
    'width': 170, 
    'elementHandlers': specialElementHandlers
        });

var pdfOutput = doc.output();
            console.log(">>>"+pdfOutput );

이미 doc 변수를 선언했다고 가정합니다. 그런 다음 File-Plugin을 사용하여이 pdf 파일을 저장했습니다.


3

최신 버전 (1.5.3)에 따르면 fromHTML()더 이상 방법이 없습니다. 대신 jsPDF HTML 플러그인을 사용해야합니다. https://rawgit.com/MrRio/jsPDF/master/docs/module-html.html#~html을 참조하십시오.

또한 제대로 작동하려면 html2canvas 라이브러리를 추가해야합니다 : https://github.com/niklasvh/html2canvas

JS (API 문서에서) :

var doc = new jsPDF();   

doc.html(document.body, {
   callback: function (doc) {
     doc.save();
   }
});

DOM 요소에 대한 참조 대신 HTML 문자열을 제공 할 수도 있습니다.


더 이상 작동하지 않는 것 같습니다-jQuery.Deferred 예외 : doc.html은 함수가 아닙니다 TypeError : doc.html은 함수가 아닙니다
DropHit

1

vuejs에서는 어떻게 적용 할 수 있습니까?

function onClick() {
  var pdf = new jsPDF('p', 'pt', 'letter');
  pdf.canvas.height = 72 * 11;
  pdf.canvas.width = 72 * 8.5;

  pdf.fromHTML(document.body);

  pdf.save('test.pdf');
};

var element = document.getElementById("clickbind");
element.addEventListener("click", onClick);
<h1>Dsdas</h1>

<a id="clickbind" href="#">Click</a>
<script src="https://cdnjs.cloudflare.com/ajax/libs/jspdf/1.3.3/jspdf.min.js"></script>


jdpsf 사용의 vuejs 예제를 게시 해 주셔서 감사합니다
Shane G
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.