[javascript] Is it possible to save HTML page as PDF using JavaScript or jquery?

Is it possible to save HTML page as PDF using JavaScript or jquery?

In Detail:

I generated one HTML Page which contains a table . It has one button 'save as PDF'. If user clicks that button then that HTML page has to convert as PDF file.

Is it possible using JavaScript or jquery?

This question is related to javascript jquery jquery-ui

The answer is


I used jsPDF and dom-to-image library to export HTML to PDF.

I post here as reference to whom concern.

$('#downloadPDF').click(function () {
    domtoimage.toPng(document.getElementById('content2'))
      .then(function (blob) {
          var pdf = new jsPDF('l', 'pt', [$('#content2').width(), $('#content2').height()]);
          pdf.addImage(blob, 'PNG', 0, 0, $('#content2').width(), $('#content2').height());
          pdf.save("test.pdf");
      });
});

Demo: https://jsfiddle.net/viethien/md03wb21/27/


This might be a late answer but this is the best around: https://github.com/eKoopmans/html2pdf

Pure javascript implementation. Allows you to specify just a single element by ID and convert it.


It is much easier and reliable to convert html to pdf server side. We are using Google Puppeteer. It is well maintained with wrappers for any server side language of your choosing. Puppeteer uses headless Chrome to generate screenshots and/or PDF files. It will save you a LOT of headache especially if you need to generate complex PDF files with tables, images, graphs, multiple pages and so

https://developers.google.com/web/tools/puppeteer/


Ya its very easy to do with javascript. Hope this code is useful to you.

You'll need the JSpdf library.

<div id="content">
     <h3>Hello, this is a H3 tag</h3>

    <p>a pararaph</p>
</div>
<div id="editor"></div>
<button id="cmd">Generate PDF</button>

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

    // This code is collected but useful, click below to jsfiddle link.
</script>

jsfiddle link here


In short: no. The first problem is access to the filesystem, which in most browsers is set to no by default due to security reasons. Modern browsers sometimes support minimalistic storage in the form of a database, or you can ask the user to enable file access.

If you have access to the filesystem then saving as HTML is not that hard (see the file object in the JS documentation) - but PDF is not so easy. PDF is a quite advanced file-format that really is ill suited for Javascript. It requires you to write information in datatypes not directly supported by Javascript, such as words and quads. You also need to pre-define a dictionary lookup system that must be saved to the file. Im sure someone could make it work, but the effort and time involved would be better spent learning C++ or Delphi.

HTML export however should be possible if the user gives you non restricted access


Yes, Use jspdf To create a pdf file.

You can then turn it into a data URI and inject a download link into the DOM

You will however need to write the HTML to pdf conversion yourself.

Just use printer friendly versions of your page and let the user choose how he wants to print the page.

Edit: Apparently it has minimal support

So the answer is write your own PDF writer or get a existing PDF writer to do it for you (on the server).


_x000D_
_x000D_
$('#cmd2').click(function() {_x000D_
   var options = {_x000D_
  //'width': 800,_x000D_
   };_x000D_
   var pdf = new jsPDF('p', 'pt', 'a4');_x000D_
   pdf.addHTML($("#content2"), -1, 220, options, function() {_x000D_
     pdf.save('admit_card.pdf');_x000D_
   });_x000D_
});
_x000D_
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>_x000D_
<script src="https://cdnjs.cloudflare.com/ajax/libs/html2canvas/0.4.1/html2canvas.min.js"></script>_x000D_
<script src="https://cdnjs.cloudflare.com/ajax/libs/jspdf/1.3.5/jspdf.min.js"></script>_x000D_
_x000D_
<div id="content2" style="background: #fff;border-bottom: 1px solid #ffffff;">_x000D_
                     <div class="tokenDet" style="padding: 15px;border: 1px solid #000;width: 80%;margin: 0 auto;position: relative;overflow: hidden;">_x000D_
                         <div class="title" style="text-align: center;border-bottom: 1px solid #000;margin-bottom: 15px;">_x000D_
                             <h2>Entrance Exam Hall Ticket</h2>_x000D_
                            </div>_x000D_
                            <div class="parentdiv" style="display: inline-block;width: 100%;position: relative;">_x000D_
                             <div class="innerdiv" style="width: 80%;float: left;">_x000D_
                              <div class="restDet">_x000D_
                                        <div class="div">_x000D_
                                            <div class="label" style="width: 30%;float: left;">_x000D_
                                                <strong>Name</strong>_x000D_
                                            </div>_x000D_
                                            <div class="data" style="width: 70%;display: inline-block;">_x000D_
                                                <span>Santanu Patra</span>_x000D_
                                            </div>_x000D_
                                            <div class="label" style="width: 30%;float: left;">_x000D_
                                                <strong>D.O.B.</strong>_x000D_
                                            </div>_x000D_
                                            <div class="data" style="width: 70%;display: inline-block;">_x000D_
                                                <span>17th April, 1995</span>_x000D_
                                            </div>_x000D_
                                            <div class="label" style="width: 30%;float: left;">_x000D_
                                                <strong>Address</strong>_x000D_
                                            </div>_x000D_
                                            <div class="data" style="width: 70%;display: inline-block;">_x000D_
                                                <span>P.S. Srijan Corporate Park, Saltlake, Sector 5, Kolkata-91</span>_x000D_
                                            </div>_x000D_
                                            <div class="label" style="width: 30%;float: left;">_x000D_
                                                <strong>Contact Number</strong>_x000D_
                                            </div>_x000D_
                                            <div class="data" style="width: 70%;display: inline-block;">_x000D_
                                                <span>9874563210</span>_x000D_
                                            </div>_x000D_
                                            <div class="label" style="width: 30%;float: left;">_x000D_
                                                <strong>Email Id</strong>_x000D_
                                            </div>_x000D_
                                            <div class="data" style="width: 70%;display: inline-block;">_x000D_
                                                <span>[email protected]</span>_x000D_
                                            </div>_x000D_
                                            <div class="label" style="width: 30%;float: left;">_x000D_
                                                <strong>Parent(s) Name</strong>_x000D_
                                            </div>_x000D_
                                            <div class="data" style="width: 70%;display: inline-block;">_x000D_
                                                <span>S. Patra</span><br /><span>7896541230</span>_x000D_
                                            </div>_x000D_
                                            <div class="label" style="width: 30%;float: left;">_x000D_
                                                <strong>Exam Center</strong>_x000D_
                                            </div>_x000D_
                                            <div class="data" style="width: 70%;display: inline-block;">_x000D_
                                                <span>Institute of Engineering & Management</span>_x000D_
                                            </div>_x000D_
                                            <div class="label" style="width: 30%;float: left;">_x000D_
                                                <strong>Hall Number</strong>_x000D_
                                            </div>_x000D_
                                            <div class="data" style="width: 70%;display: inline-block;">_x000D_
                                                <span>COM-32</span>_x000D_
                                            </div>_x000D_
                                        </div>_x000D_
                                    </div>_x000D_
                             </div>_x000D_
                                <div class="sideDiv" style="width: 20%;float: left;">_x000D_
                                 <div class="atts" style="float: left;width: 100%;">_x000D_
                                     <div class="photo" style="width: 115px;height: 150px;float: right;">_x000D_
                                         <img src="images/candidateImg.gif" style="width: 100%;"/>_x000D_
                                        </div>_x000D_
                                        <div class="sign" style="position: absolute;bottom: 0;right: 0;border-top: 1px dashed #000;left: 80%;text-align: right;">_x000D_
                                         <small>Self Attested</small>_x000D_
                                        </div>_x000D_
                                    </div>_x000D_
                                </div>_x000D_
                            </div>_x000D_
                        </div>_x000D_
                    </div>_x000D_
                    <button class="btn btn-info" id="cmd2">Download Token</button>
_x000D_
_x000D_
_x000D_


You can use Phantomjs. Download here and use the following example to test the html->pdf conversion feature https://github.com/ariya/phantomjs/blob/master/examples/rasterize.js

Example code:

phantomjs.exe examples/rasterize.js http://www.w3.org/Style/CSS/Test/CSS3/Selectors/current/xhtml/index.html sample.pdf

There is another very obvious way to convert HTML to PDf using JavaScript: use an online API for that. This will work fine if you don't need to do the conversion when the user is offline.

PdfMage is one option that has a nice API and offers free accounts. I'm sure you can find many alternatives (for example, here)

For PdfMage API you'd have something like this:

 $.ajax({
    url: "https://pdfmage.org/pdf-api/v1/process",
    type: "POST",
    crossDomain: true,
    data: { Html:"<html><body>Hi there!</body></html>" },
    dataType: "json",
    headers: {
        "X-Api-Key": "your-key-here" // not very secure, but a valid option for non-public domains/intranet
    },
    success: function (response) {
        window.location = response.Data.DownloadUrl;
    },
    error: function (xhr, status) {
        alert("error");
    }
});

Here is how I would do it, its an idea not bulletproof design, you need to modify it

  • The user clicks the save as PDF button
  • The server is sent a call using ajax
  • The server responds with a URL for PDF generated using HTML, I have used Apache FOP very succssfully
  • The js handling the ajax response does a location.href to point the URL send by JS and as soon as that URL loads, it sends the file using content disposition header as attachment forcing user to download the file.

Yes. For example you can use the solution by https://grabz.it.

It's got a Javascript API which can be used in different ways to grab and manipulate the screenshot. In order to use it in your app you will need to first get an app key and secret and download the free Javascript SDK.

So, let's see a simple example for using it:

//first include the grabzit.min.js library in the web page
<script src="grabzit.min.js"></script>
//include the code below to add the screenshot to the body tag    
<script>
//use secret key to sign in. replace the url.
GrabzIt("Sign in to view your Application Key").ConvertURL("http://www.google.com").Create();
</script>

Then simply wait a short while and the image will automatically appear at the bottom of the page, without you needing to reload the page.

That's the simplest one. For more examples with image manipulation, attaching screenshots to elements and etc check the documentation.


Examples related to javascript

need to add a class to an element How to make a variable accessible outside a function? Hide Signs that Meteor.js was Used How to create a showdown.js markdown extension Please help me convert this script to a simple image slider Highlight Anchor Links when user manually scrolls? Summing radio input values How to execute an action before close metro app WinJS javascript, for loop defines a dynamic variable name Getting all files in directory with ajax

Examples related to jquery

How to make a variable accessible outside a function? Jquery assiging class to th in a table Please help me convert this script to a simple image slider Highlight Anchor Links when user manually scrolls? Getting all files in directory with ajax Bootstrap 4 multiselect dropdown Cross-Origin Read Blocking (CORB) bootstrap 4 file input doesn't show the file name Jquery AJAX: No 'Access-Control-Allow-Origin' header is present on the requested resource how to remove json object key and value.?

Examples related to jquery-ui

How to auto adjust the div size for all mobile / tablet display formats? jQuery not working with IE 11 JavaScript Uncaught ReferenceError: jQuery is not defined; Uncaught ReferenceError: $ is not defined Best Practice to Organize Javascript Library & CSS Folder Structure Change table header color using bootstrap How to get HTML 5 input type="date" working in Firefox and/or IE 10 Form Submit jQuery does not work Disable future dates after today in Jquery Ui Datepicker How to Set Active Tab in jQuery Ui How to use source: function()... and AJAX in JQuery UI autocomplete