Як правильно використовувати бібліотеку 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: " Ми закриваємо це питання, оскільки більше не підтримуватимемо HTML та addHTML. " ( З випуску № 516 )
toraritte

Відповіді:


133

ви можете використовувати pdf з html наступним чином,

Крок 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 1.11.0, тому я використовував ту саму версію jquery, що і на github.com/MrRio/jsPDF/blob/master/examples/js/jquery/…
user1063287

Спробував ваш код @Well Wisher, він видав мені таку помилку для бібліотечного файлу itdself - Не вдається прочитати властивість 'length' невизначеного jspdf.plugin.from_html.js: 500
Учень

1
Так, це дійсно добре ,,, але результат JSPdf перекривається іншими елементами моїх елементів таблиці, як я можу це вирішити? .... Я змінив розмір шрифтів і зробив це як альбомний режим, я спробував більшість модифікацій, але нічого не працює
Судхір Белагалі

1
Мені вдалося змусити цей приклад працювати лише за допомогою CDN CloudFlare: <script src = " cdnjs.cloudflare.com/ajax/libs/jspdf/1.2.61/… > або <script src =" cdnjs.cloudflare.com /ajax/libs/jspdf/1.2.61/… > Але я погоджуюсь, що документація та загальні зміни у джерелі коду сприяють складності використання цього плагіна. Навіть ці CDN-адреси (які використовують JSfiddle) відрізняються від посилання "завантажити локально" за посиланням @Well Wisher.
Скотт

1
@Scott i, вони видалили посилання
Ну Wisher

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 зробило свою роботу.
Франсіско Квінтеро

Цікаво, чому робоча версія не працює ... Я включив усі плагіни на сторінку html, і все ж допомогла лише ця версія налагодження.
ilter

Привіт, я спробував це, але я отримую помилку Error in function FileSaver@http://mrrio.github.io/jsPDF/dist/jspdf.debug.js:5875:18: get_URL(...).createObjectURL is not a function, те саме, якщо я використовую версію bower. Будь-яка підказка?
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>

А для тих, хто схиляється до НокаутJS, трохи обов’язково:

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: Не вдається встановити властивість 'height' для undefined"
Райан Гіббс,

Не знаєте, що ви маєте на увазі? Фрагмент виконується за допомогою того самого коду. Тож, можливо, щось не вдається у вашій реалізації. Чи можете ви console.log (pdf) та поділитися результатами.
пім

Це, мабуть, була проблема кешування або щось інше, коли я спробував це зараз, маючи там console.log (), код був виконаний правильно. Я все ще отримую випуск порожніх сторінок, але це вже інша історія. Дякую.
Райан Гіббс,

також у мене помилка "Не вдається прочитати властивість 'addEventListener'"
Манджита Тешара,

Мені подобається ця бібліотека jsPDF (). До речі, якщо хтось ще вважає це корисним, я просто з'ясував синтаксис для приєднання зворотного виклику для запуску після створення PDF:pdf.save("myfile.pdf", function(){ alert("pdf generation/save finished!"); });
Крістофер Д. Емерсон,

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. А потім ви збережете цей pdf-файл за допомогою модуля File-Plugin.


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

Ви також можете вказати рядок HTML замість посилання на елемент DOM.


Здається, це теж вже не працює - 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>


Дякуємо, що опублікували приклад vuejs використання jdpsf
Shane G
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.