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
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");
});
});
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
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>
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).
$('#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_
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
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.
Source: Stackoverflow.com