Завантажте div на HTML-сторінці у форматі pdf за допомогою JavaScript


91

У мене є вміст div з ідентифікатором як "вміст". У div div у мене є кілька графіків та таблиць. Я хочу завантажити цей div у форматі PDF, коли користувач натискає кнопку завантаження. Чи є спосіб зробити це за допомогою JavaScript або jQuery?


1
code.google.com/p/jspdf - найкраща бібліотека, яку я знаю, і яка може це зробити.
AlvinArulselvan

Як я можу використовувати jsPDF для завантаження вмісту у певний div? з того, що я бачу в прикладах на їхньому сайті, цього робити не можна.
Midhun Mathew

Відповіді:


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>

JavaScript:

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. Крім того, у мене теж є кілька графіків .. ці r не входять у pdf. Що я повинен зробити, щоб отримати їх?
Midhun Mathew

14
jsPDF теж не форматує таблиці належним чином, він просто інтерпретує td / th як display: block;
Дейв

2
Використовуючи наведений вище код, ми можемо створити PDF лише один раз. Але вдруге це не працює. Щоб це працювало, перевірте цю відповідь @ kristof-feys, нам потрібно оголосити docзмінну всередині функції click.
Mahendran Sakkarai

4
Це приємно, просто шкода, що css не відображається: /
Ніколас

1
Я зіткнувся з проблемою кодування
ema,

19

Вміст усередині a <div class='html-content'>....</div>можна завантажити у форматі PDF зі стилями за допомогою jspdf & html2canvas .

Вам потрібно звернутися до обох бібліотек 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();
    });
}

Посилання: генерація pdf з HTML-полотна та jspdf .

Можливо, це комусь допоможе.


4
Це мені вдалося, дякую. Він зберігає всі стилі, але має деякі обмеження (створює PDF як зображення, тому його не можна шукати; здається, він також трохи розмитий).
jramm

як встановити розрив сторінки, якщо половина вмісту не вміщується на одній сторінці?
SHEKHAR SHETE

Мені працювали дуже добре. Єдина проблема полягала в тому, що деякі мої піктограми SVG не відображались!
Феліпе Н Моура,

2

Ваше рішення вимагає деякого методу ajax для передачі html на внутрішній сервер, який має функцію html в pdf, а потім повертає вихідні дані pdf назад у браузер.

Спочатку налаштувавши код на стороні клієнта, ми встановимо код 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 Mathew

це нормально посилатися на ту саму URL-адресу, чи я повинен її змінити?
Midhun Mathew

Вам знадобиться трохи інша URL-адреса, щоб ви могли розрізняти два
вмісти

як має бути ця URL-адреса? Можете навести приклад ??
Midhun Mathew

2
Якщо CSS буде зв’язано, вам буде неприємно, оскільки ваша внутрішня програма не знатиме, де знайти стилі, якщо не зможе захопити файл CSS і застосувати стилі всередині файлу.
TheRealChx101

1

AFAIK не існує жодної функції jquery, яка б це робила. Найкращим варіантом буде обробка перетворення на сервері. Як ви це робите, залежить від того, якою мовою ви користуєтесь (.net, php тощо). Ви можете передати вміст div функції, яка обробляє перетворення, яка поверне користувачеві pdf.


-1

Так, у JS можна записати div як PDF-файли. Ви можете перевірити рішення, яке надає https://grabz.it . Вони мають приємний і чистий JavaScript API, який дозволить вам захопити вміст одного елемента HTML, такого як div або span.

Отже, ви використовуєте його, вам знадобиться і ключ + app, і безкоштовний 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>

Щоб зафіксувати те, що знаходиться під ідентифікатором функцій, вам потрібно:

//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-адресу і#feature відповідно до вашого селектора CSS.

Це все. Тепер, коли сторінку завантажено, знімок екрана буде створено в тому ж місці, що і тег скрипта, який буде містити весь вміст div і більше нічого.

Інші налаштування та налаштування, які ви можете зробити за допомогою механізму скріншоту div, перегляньте їх тут


2
Думаю, ви отримуєте лише 1000 безкоштовних знімків та 100 безкоштовних «подряпин» за допомогою grabz.it. Тож не постійне рішення, якщо ви не готові за нього платити.
BrettC 01.03.18
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.