jsPDF can't get any styling to work

63,611

Solution 1

I think the problem is that you use media="print" instead of media="screen". Try making two seperate files, one for print and one for the screen:

<link rel="stylesheet" href="print.css" type="text/css" media="print"/>
<link rel="stylesheet" href="screen.css" type="text/css" media="screen"/>

The screen one will contain the styling for the page as seen in a browser. The print one will contain the styling for when you print your page, or in this case saving it as a PDF.

EDIT

I checked the jsPDF website but I think they don't support CSS. You could do something like this to create a document with different text colors though:

doc.setFontSize(22);
doc.setTextColor(255, 0, 0);
doc.text(20, 20, 'This is a title');

doc.setFontSize(16);
doc.setTextColor(0, 255, 0);
doc.text(20, 30, 'This is some normal sized text underneath.');

Put this code right under var doc = new jsPDF('landscape'); in your script.

Solution 2

you can try this option, that uses jsPDF, html2canvas and html2pdf libraries

from its README:

include this files:

<script src="jspdf.min.js"></script>
<script src="html2canvas.min.js"></script>
<script src="html2pdf.js"></script>

and then you can generate your pdf by running:

html2pdf($('body').get(0), {
   margin:       1,
   filename:     'myfile.pdf',
   image:        { type: 'jpeg', quality: 0.98 },
   html2canvas:  { dpi: 192, letterRendering: true },
   jsPDF:        { unit: 'in', format: 'letter', orientation: 'portrait' }
});

Solution 3

You can capture a screenshot with jsPDF, but you'll need html2canvas as well. Use html2canvas to convert the html to canvas and grab the image content. Create an empty pdf with jsPDF and add the html image content into the pdf and save:

html2canvas(*html*, {
  onrendered: function(canvas) {
    const contentDataURL = canvas.toDataURL('image/png')
    let pdf = new jsPDF()
    pdf.addImage(contentDataURL, 'JPEG', 20, 20)
    pdf.save('form.pdf')
  }
})

This will retain all CSS but the quality will suffer a little (blurry).

Share:
63,611
samuraiseoul
Author by

samuraiseoul

Updated on May 07, 2020

Comments

  • samuraiseoul
    samuraiseoul almost 4 years

    I'm new to using jsPDF but and for the life of me I can't get any css to apply to this thing! I've tried inline, internal, and external all to no avail! I read in another SO post that since it's technically printing stuff to a file I need a print style sheet, and that didn't work either.

    I have a very basic page that I'm just trying to get any CSS to work with: JS:

    <script src="//ajax.googleapis.com/ajax/libs/jquery/1.10.2/jquery.min.js"></script>
    <script type="text/javascript" src="jspdf.js"></script>
    <script type="text/javascript" src="./libs/FileSaver.js/FileSaver.js"></script>
    <script type="text/javascript" src="./libs/Blob.js/BlobBuilder.js"></script>
    <script type="text/javascript" src="jspdf.plugin.standard_fonts_metrics.js"></script> 
    <script type="text/javascript" src="jspdf.plugin.split_text_to_size.js"></script>               
    <script type="text/javascript" src="jspdf.plugin.from_html.js"></script>
    <script>
        $(document).ready(function(){
            $('#dl').click(function(){
            var specialElementHandlers = {
                '#editor': function(element, renderer){
                    return true;
                }
            };
            var doc = new jsPDF('landscape');
            doc.fromHTML($('body').get(0), 15, 15, {'width': 170,   'elementHandlers': specialElementHandlers});
            doc.output('save');
            });
        });
    </script>
    

    HTML:

    <body>
        <div id="dl">Download Maybe?</div>
        <div id="testcase">
            <h1>  
                We support special element handlers. Register them with jQuery-style 
            </h1>
        </div>
    </body>
    

    And finally the stylesheet that is external:

    h1{
        color: red;
    }
    div{
        color: red;
    }
    

    I'm sure all is getting included correctly, and that there are no errors, already checked all of that. Is there like some extra function I need to call to get the css to work as well? Let me know please! Thanks alot! Any other tips you may have are also appreciated!

    EDIT: This is the exact webpage:

    <html>
        <head>
            <link rel="stylesheet" href="print.css" type="text/css" media="print"/>
            <script src="//ajax.googleapis.com/ajax/libs/jquery/1.10.2/jquery.min.js"></script>
            <script type="text/javascript" src="jspdf.js"></script>
            <script type="text/javascript" src="./libs/FileSaver.js/FileSaver.js"></script>
            <script type="text/javascript" src="./libs/Blob.js/BlobBuilder.js"></script>
            <script type="text/javascript" src="jspdf.plugin.standard_fonts_metrics.js"></script>
            <script type="text/javascript" src="jspdf.plugin.split_text_to_size.js"></script>               
            <script type="text/javascript" src="jspdf.plugin.from_html.js"></script>
            <script>
                $(document).ready(function(){
                    $('#dl').click(function(){
                    var specialElementHandlers = {
                        '#editor': function(element, renderer){
                            return true;
                        }
                    };
                    var doc = new jsPDF('landscape');
                    doc.fromHTML($('body').get(0), 15, 15, {'width': 170,   'elementHandlers': specialElementHandlers});
                    doc.output('save');
                    });
                });
            </script>
        </head>
        <body>
            <div id="dl">Download Maybe?</div>
            <div id="testcase">
                <h1>  
                    We support special element handlers. Register them with jQuery-style 
                </h1>
            </div>
        </body>
    </html>
    
  • samuraiseoul
    samuraiseoul over 10 years
    I just tried this and while it styles the page normally, I still can't get it to style the pdf when I save it as a pdf. :(
  • Jarno
    Jarno over 10 years
    I think they don't support CSS, check my updated answer.
  • samuraiseoul
    samuraiseoul over 10 years
    Well, JSPDF is useless to me if I can't apply CSS, do you know of any libraries that let me take a picture of a subset of the DOM? Image or PDF? The format isn't very important if I can capture a sub-element of the dom by Id!
  • Evan Plaice
    Evan Plaice over 10 years
    @Samuraisoulification Not on the client-side but CasperJS can take a screenshot of a specific element on a page (docs.casperjs.org/en/latest/modules/casper.html#capturesele‌​ctor) on the server-side.
  • liftarn
    liftarn about 10 years
    @Samuraisoulification You could use something like html2canvas.hertzen.com to take a screenshot and then print it.
  • Mohammad Faizan khan
    Mohammad Faizan khan about 9 years
    i too want to display some css but it is not working did any solution found? i am also not getting image
  • John Samuel
    John Samuel about 6 years
    @samuraiseoul I think its easy for one to comment than we trying to fix it. JSPDF does work for simple html rendering :)