Unduh div di halaman HTML sebagai pdf menggunakan javascript

91

Saya memiliki div konten dengan id sebagai "konten". Di div konten saya memiliki beberapa grafik dan beberapa tabel. Saya ingin mengunduh div itu sebagai pdf ketika pengguna mengklik tombol unduh. Apakah ada cara untuk melakukannya menggunakan javascript atau jQuery?

Midhun Mathew
sumber
1
code.google.com/p/jspdf adalah perpustakaan terbaik yang saya tahu yang dapat melakukan ini.
AlvinArulselvan
Bagaimana saya bisa menggunakan jsPDF untuk mengunduh konten di div tertentu? dari apa yang saya lihat di contoh di situs mereka itu tidak dapat dilakukan.
Midhun Mathew

Jawaban:

112

Anda dapat melakukannya dengan menggunakan 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');
});
ilyes kooli
sumber
25
Saya punya masalah di sini. Css yang saya tambahkan di sini tidak diterapkan dalam file pdf. Juga saya punya beberapa grafik juga .. r yang tidak datang dalam pdf. Apa yang harus saya lakukan untuk mendapatkannya?
Midhun Mathew
14
jsPDF juga tidak memformat tabel dengan benar, ia hanya mengartikan td / th sebagai display: block;
Dave
2
Menggunakan kode di atas kita dapat membuat pdf hanya satu kali. Tetapi untuk kedua kalinya itu tidak berhasil. Untuk membuatnya bekerja, periksa jawaban ini dengan @ kristof-feys, Kita perlu mendeklarasikan docvariabel di dalam fungsi klik.
Mahendran Sakkarai
4
Ini bagus, hanya sayang css tidak diberikan: /
Nicholas
1
Saya menghadapi masalah encoding
ema
19

Konten di dalam a <div class='html-content'>....</div>dapat diunduh sebagai pdf dengan gaya menggunakan jspdf & html2canvas .

Anda perlu merujuk kedua pustaka 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>

Kemudian panggil fungsi di bawah ini,

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

Referensi: pdf genration dari html canvas dan jspdf .

Mungkin ini akan membantu seseorang.

Wisnu S
sumber
4
Ini bekerja dengan baik untuk saya, terima kasih. Ini mempertahankan semua gaya tetapi memiliki beberapa batasan (membuat PDF sebagai gambar sehingga tidak dapat dicari; tampaknya juga sedikit buram).
jramm
bagaimana cara mengatur hentian halaman jika setengah dari konten gagal muat pada satu halaman?
SHEKHAR SHETE
Bekerja dengan sangat baik untuk saya. Satu-satunya masalah adalah beberapa ikon SVG saya tidak dirender!
Felipe N Moura
2

Solusi Anda memerlukan beberapa metode ajax untuk meneruskan html ke server back-end yang memiliki fasilitas html ke pdf dan kemudian mengembalikan keluaran pdf yang dihasilkan kembali ke browser.

Pertama mengatur kode sisi klien, kita akan mengatur kode jquery sebagai

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

Kemudian intersep data dari skrip pembuatan html2pdf sebagai berikut

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

 

DevZer0
sumber
Apa yang Anda maksud dengan "memiliki fasilitas htmltopdf" ??
Midhun Mathew
apakah boleh merujuk url yang sama atau haruskah saya mengubahnya?
Midhun Mathew
Anda akan memerlukan url yang sedikit berbeda sehingga Anda dapat membedakan antara kedua konten
DevZer0
bagaimana seharusnya url itu? Bisakah Anda memberi contoh ??
Midhun Mathew
2
Anda akan kacau jika CSS ditautkan karena program back-end Anda tidak akan tahu di mana menemukan gaya kecuali dapat mengambil file CSS dan menerapkan gaya dari dalam file.
TheRealChx101
1

AFAIK tidak ada fungsi jquery asli yang melakukan ini. Pilihan terbaik adalah memproses konversi di server. Bagaimana Anda melakukannya tergantung pada bahasa apa yang Anda gunakan (.net, php dll.). Anda bisa meneruskan konten div ke fungsi yang menangani konversi, yang akan mengembalikan pdf ke pengguna.

reggaemahn
sumber
-1

Ya, itu mungkin untuk menangkap div sebagai PDF di JS. Anda dapat memeriksa solusi yang disediakan oleh https://grabz.it . Mereka memiliki API JavaScript yang bagus dan bersih yang akan memungkinkan Anda untuk menangkap konten dari satu elemen HTML seperti div atau span.

Jadi, Anda menggunakannya, Anda akan membutuhkan aplikasi + kunci dan SDK gratis . Penggunaannya adalah sebagai berikut:

Misalkan Anda memiliki 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>

Untuk menangkap apa yang ada di bawah id fitur, Anda perlu:

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

Anda perlu mengganti http://www.example.com/my-page.htmldengan url target Anda dan #featuresesuai dengan pemilih CSS Anda.

Itu saja. Sekarang, ketika halaman dimuat, screenshot gambar sekarang akan dibuat di lokasi yang sama dengan tag skrip, yang akan berisi semua konten div fitur dan tidak ada yang lain.

Konfigurasi dan penyesuaian lain yang dapat Anda lakukan pada mekanisme div-screenshot, silakan periksa di sini

Johnny
sumber
2
Saya pikir Anda hanya mendapatkan 1.000 tangkapan gratis dan 100 "goresan" gratis dengan grabz.it. Jadi bukan solusi permanen kecuali Anda bersedia membayarnya.
BrettC