Cách sử dụng thư viện jsPDF đúng cách


84

Tôi muốn chuyển đổi một số div của mình thành PDF và tôi đã thử thư viện jsPDF nhưng không thành công. Có vẻ như tôi không thể hiểu những gì tôi cần nhập để làm cho thư viện hoạt động. Tôi đã xem qua các ví dụ và tôi vẫn không thể tìm ra nó. Tôi đã thử những cách sau:

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

Sau jQuery và:

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

cho mục đích thử nghiệm nhưng tôi nhận được:

"Cannot read property '#smdadminbar' of undefined"

nơi #smdadminbarlà div đầu tiên ra khỏi cơ thể.


cái đã làm việc cho tôi github.com/devrajatverma/jsPdfExample
Rajat

1
Lưu ý cho tất cả những ai đến đây đang cố gắng tìm hiểu fromHTMLhoặc tại sao nó không được ghi lại trong tài liệu jsPDF: " Chúng tôi sắp kết thúc vấn đề này, bởi vì chúng tôi sẽ không hỗ trợ từHTML và addHTML nữa. " ( Từ số 516 )
toraritte

Câu trả lời:


133

bạn có thể sử dụng pdf từ html như sau,

Bước 1: Thêm tập lệnh sau vào tiêu đề

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

hoặc tải xuống cục bộ

Bước 2: Thêm tập lệnh HTML để thực thi mã jsPDF

Tùy chỉnh điều này để chuyển số nhận dạng hoặc chỉ thay đổi #content thành số nhận dạng bạn cần.

 <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>

Bước 3: Thêm nội dung cơ thể của bạn

<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>

Tham khảo hướng dẫn gốc

Xem một trò chơi làm việc


4
Cảm ơn bạn đã đăng bài này, nhưng tôi đã thử mã chính xác ở trên (cục bộ) và nó tạo ra một tài liệu pdf trống. Nó hoàn toàn không hoạt động với jquery 1.11.0 vì vậy tôi đã sử dụng cùng một phiên bản jquery như được sử dụng trên github.com/MrRio/jsPDF/blob/master/examples/js/jquery/…
user1063287

Đã thử mã của bạn @Well Wisher, nó cho tôi lỗi sau, đối với tệp thư viện - Không thể đọc thuộc tính 'length' của không xác định jspdf.plugin.from_html.js: 500
Người học

1
Vâng, điều này thực sự tốt ,,, Nhưng đầu ra của JSPdf bị chồng chéo với các phần tử khác trong các phần tử bảng của tôi, Tôi có thể giải quyết nó như thế nào? .... Tôi đã thay đổi kích thước của phông chữ và đặt nó ở chế độ ngang, tôi đã thử hầu hết các thay đổi, Nhưng không có gì đang làm việc
Sudhir Belagali

1
Tôi chỉ có thể làm cho ví dụ này hoạt động bằng cách sử dụng CloudFlare CDN: <script src = " cdnjs.cloudflare.com/ajax/libs/jspdf/1.2.61/… > hoặc <script src =" cdnjs.cloudflare.com /ajax/libs/jspdf/1.2.61/… > Nhưng tôi đồng ý, tài liệu và các biến thể chung trong mã nguồn, góp phần gây ra khó khăn khi sử dụng plugin này. Ngay cả những CDN này (mà JSfiddle sử dụng) cũng khác với liên kết "tải xuống cục bộ" @Well tham chiếu khôn ngoan hơn ở trên.
Scott

1
@Scott i họ loại bỏ các liên kết
Vâng Wisher

17

Bạn chỉ cần liên kết này jspdf.min.js

Nó có tất cả mọi thứ trong đó.

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

2
Cảm ơn, điều này đã khiến tôi phát điên lên! Sử dụng phiên bản gỡ lỗi của jspdf hoạt động, trong khi các phiên bản khác trong bất kỳ cấu hình nào thì không. Có lẽ sự thu nhỏ đang phá vỡ nó bằng cách nào đó? hoặc tôi đang làm sai.
jookyone

Điều này thực sự đã giúp tôi. Tôi đang sử dụng tệp jspdf.js gốc và nó không hoạt động. Sử dụng jspdf.debug.js đã thực hiện được công việc.
Francisco Quintero

Thật thú vị tại sao phiên bản sản xuất không hoạt động ... Tôi đã bao gồm tất cả các plugin trong trang html nhưng chỉ có phiên bản gỡ lỗi này mới giúp được.
İlter

Xin chào, tôi đã thử điều này nhưng tôi gặp lỗi Error in function FileSaver@http://mrrio.github.io/jsPDF/dist/jspdf.debug.js:5875:18: get_URL(...).createObjectURL is not a function, điều tương tự nếu tôi sử dụng phiên bản bower. Có manh mối nào không?
dbr

Kiểm tra phiên bản mới nhất trên GitHub và thay đổi URL ở trên cho phù hợp. Mới nhất là 1.3.5.
pasx

8

Đây cuối cùng là những gì đã làm cho tôi (và gây ra một sự định đoạt):

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>

Và đối với những người có khuynh hướng KnockoutJS, một chút ràng buộc:

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);
    }
};

Có nhiều hơn cho đoạn mã này? Khi tôi cố gắng chạy cái này, tôi gặp lỗi cho biết 'pdf.canvas' là không xác định. "Uncaught TypeError: Không thể đặt thuộc tính 'height' là undefined"
Ryan Gibbs

Không chắc chắn những gì bạn có ý nghĩa? Đoạn mã thực thi bằng cách sử dụng cùng một mã. Vì vậy, có lẽ điều gì đó không ổn trong quá trình triển khai của bạn. Bạn có thể console.log (pdf) và chia sẻ đầu ra.
pim

Nó hẳn là một vấn đề bộ nhớ đệm hoặc một cái gì đó, khi tôi thử nó ngay bây giờ với console.log () trong đó, mã được thực thi chính xác. Tôi vẫn gặp sự cố trang trống, nhưng đó là một câu chuyện khác. Cảm ơn.
Ryan Gibbs

tôi cũng gặp lỗi "Không thể đọc thuộc tính 'addEventListener'"
Manjitha Teshara

Tôi thích thư viện jsPDF () này. BTW nếu bất cứ ai khác thấy tôi hữu ích này chỉ tìm ra cú pháp để gắn một callback để chạy sau khi PDF đã được tạo ra:pdf.save("myfile.pdf", function(){ alert("pdf generation/save finished!"); });
Christopher D. Emerson

3

Bạn cũng nên sử dụng thư viện jspdf.plugin.from_html.js? Ngoài thư viện chính (jspdf.js), bạn phải sử dụng các thư viện khác cho "hoạt động đặc biệt" (như jspdf.plugin.addimage.js để sử dụng hình ảnh). Kiểm tra https://github.com/MrRio/jsPDF .


3
Jspdf.source.js dường như bao gồm tất cả các thư viện khác.
whossname

3

trước tiên, bạn phải tạo một trình xử lý.

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

sau đó viết mã này trong sự kiện nhấp chuột:

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

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

giả sử bạn đã khai báo biến doc. Và Sau đó, bạn đã lưu tệp pdf này bằng File-Plugin.


3

Theo phiên bản mới nhất (1.5.3) không có fromHTML()phương pháp nào nữa. Thay vào đó, bạn nên sử dụng plugin HTML jsPDF, hãy xem: https://rawgit.com/MrRio/jsPDF/master/docs/module-html.html#~html

Bạn cũng cần thêm thư viện html2canvas để nó hoạt động bình thường: https://github.com/niklasvh/html2canvas

JS (từ tài liệu API):

var doc = new jsPDF();   

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

Bạn cũng có thể cung cấp chuỗi HTML thay vì tham chiếu đến phần tử DOM.


Dường như không còn hoạt động nữa - jQuery.Deferred exception: doc.html không phải là một hàm TypeError: doc.html không phải là một hàm
DropHit

1

làm thế nào về vuejs làm thế nào nó được áp dụng?

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>


Cảm ơn đã gửi bài ví dụ của việc sử dụng vuejs jdpsf
Shane G
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.