DEV Community

Alin Climente
Alin Climente

Posted on • Updated on

How trigger browser to make a PDF from HTML using window.print()

Here is how you can create a pdf from html/css on the client side (no backend or external libraries involved). We will take advantage of the window.print() and some specific CSS.

Unfortunately, this will not work on mobile browsers (as pointed out in the comments).

Needed styles for the window.print() function:

* {
    font-family: Arial, Helvetica, sans-serif;
    color: rgb(65, 65, 65);
    -webkit-print-color-adjust: exact !important;
    color-adjust: exact !important;
    print-color-adjust: exact !important;
}

@media print {
   @page {
     margin-left: 0.8in;
     margin-right: 0.8in;
     margin-top: 0;
     margin-bottom: 0;
   }
}

#container {
    width: 800px;
    margin: 0 auto;
}

Enter fullscreen mode Exit fullscreen mode

Of course, you can set other values for font-family, color and #container. Add the rest of the styles for your custom pdf.

Next, we need to trigger the window.print() function which is native to the browser. So add below js in a script tag.

document.addEventListener("DOMContentLoaded", () => {
    let printLink = document.getElementById("print");
    let container = document.getElementById("container");

    printLink.addEventListener("click", event => {
        event.preventDefault();
        printLink.style.display = "none";
        window.print();
    }, false);

    container.addEventListener("click", event => {
        printLink.style.display = "flex";
    }, false);

}, false);
Enter fullscreen mode Exit fullscreen mode

Here is a basic html:

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <!-- Add here the styles and script we described up -->
    <title>This will be the title of the pdf file</title>
</head>

<body id="container">

    <a href="#" id="print">GENERATE PDF!</a>

    <h1>Super cool custom pdf</h1>

    <p>This pdf is generated from the client side without any external libraries!</p>

</body>

</html>

Enter fullscreen mode Exit fullscreen mode

And... that's it!

Here is how what we did up will work:

generate-pdf-gif

Oldest comments (41)

Collapse
 
sampadsarker profile image
Sampad Sarker

OOh, that is very interesting!!!
keep it up

Collapse
 
shbz profile image
Shahbaz

Nice you have shared a good content!

Collapse
 
maame-codes profile image
Maame Afia Fordjour

Didn't know this was possible. Thanks for sharing.

Collapse
 
amircahyadi profile image
Amir-cahyadi

Nice πŸ‘β€οΈ

Collapse
 
jonrandy profile image
Jon Randy πŸŽ–οΈ • Edited

Kind of a misleading article. This really doesn't have anything to do with generating a PDF - it just tells you how to kick your browser to print the current page. The fact that the print dialog may have an option to "Print to PDF" is entirely separate to anything you are doing here - and will likely be dependent on your browser and system. You'll still have to select 'Print to PDF' manually

Collapse
 
varshithvhegde profile image
Varshith V Hegde

But still this is a great article πŸ‘ Keep it up

Collapse
 
good3n profile image
Tom Gooden✨

No, it’s not.

Thread Thread
 
climentea profile image
Alin Climente

tough crowd

Collapse
 
climentea profile image
Alin Climente

Fixed, modified title. Hopefully it's more clear now.

Would be nice if browsers would have some native api's for pdf generation..

Collapse
 
shifi profile image
Shifa Ur Rehman

No. It's better this way. There are other ways you can manage "pdfs" while this tool does all of that and much more. i.e. Print as well.

Not everything needs changing. You wrote a good article. Sure had a wrong title, I wont call it misleading personally. Misleading would be when you'd do that knowingly. Just stick to your findings. Don't defend yourself when you find contradicting information proving you wrong. But don't back down either if otherwise.

Happy dev'ing.

Collapse
 
devarshishimpi profile image
Devarshi Shimpi

Fr. We have Print to PDF in the browser itself. And most modern browsers support it.

Collapse
 
imdkbj profile image
imdkbj • Edited

Why to use js to toggle print button.
This can be achieved by something like as below

Β Β @media print
        #PrintoutΒ { 
 Β Β Β Β Β Β Β Β display:Β none; 
 Β Β Β Β Β Β }
Enter fullscreen mode Exit fullscreen mode

So basically we can assign a new value to css in print selector.

Collapse
 
climentea profile image
Alin Climente

nice one!

Collapse
 
imdkbj profile image
imdkbj

And this would be great related to header if u can share, how to programmatically save the pdf which is required to hit by browser pdf action button.

Collapse
 
climentea profile image
Alin Climente

Unfortunately this is not possible with this method..

Collapse
 
anuoluwapoae profile image
Anuoluwapo Balogun

Amazing!

Collapse
 
defite profile image
Nikita Makhov • Edited

Never ever style id's in your css. id's are for js only, classes are good for styling. If for some reason you will need the same functionality in other place it will be better to assign a class for it.

The same goes to !important notation. Usually there is no reason to use it because it's hard to override it.

Collapse
 
climentea profile image
Alin Climente

I agree, styling id's is not a good practice. The !important is needed in this case for window.print() otherwise the browser will not show the pdf as in the html page.

Collapse
 
ryanguitar profile image
Ryan Els

Very interesting article πŸ‘

Collapse
 
golfman484 profile image
Driving change

I thought this was going to be about a true HTML to PDF library like the most excellent Flying Saucer which is discussed in this article:

medium.com/javarevisited/html-to-p...

Collapse
 
climentea profile image
Alin Climente

You need a backend for that.

Collapse
 
poopa profile image
poopa

wrong title

Collapse
 
siddharthdb profile image
Siddharth B

Dear Author,
This article falls in the grey area of click bait based on the title of the article. I would suggest to put some effort in writing a well thought out article by researching on the topic.

For others who felt betrayed by the title, here are some pointers
medium.com/@ayusharma.in/generate-...
bannerbear.com/blog/how-to-convert...

Collapse
 
climentea profile image
Alin Climente

You need a backend for that.

Collapse
 
zodman profile image
Andres 🐍 in πŸ‡¨πŸ‡¦ • Edited

and here when the client said! Nooo I want download the pdf file, not print it!

and now you understand its better implement wkhtmltopdf instead of explain.

Collapse
 
climentea profile image
Alin Climente

You need a backend for that. Sometimes this simple things will do the job.

Collapse
 
itsdonnix profile image
Don Alfons • Edited

I did the same thing using puppeteer and end EJS to generate PDF.
Also with pdflib to change the title of the document.

Checkout on gist ->
gist.github.com/donnisnoni/a9fdf25...

Collapse
 
climentea profile image
Alin Climente

You need a backend for that.