pdf-generationweasyprint

How to set WeasyPrint’s PDF resolution?


I need to create PDF’s based on designs from Sketch.com, where dimensions like font sizes and positions are given in pixels, and it seems to be using the standard resolution of 72dpi (A4 being 595×842).

It seems that WeasyPrint uses 96dpi for sizes given in pixels, when generating PDF’s.

The command-line API documentation indicates that there is a resolution parameter, but it only applies for PNG (and appears to be deprecated).

I see there is also a zoom parameter in the python API but it does not seem to be available in command-line, and anyway that would break dimensions given in physical units like cm and also my target page size, A4.

So how do I set the resolution to 72dpi? Or should I convert all units instead, applying a 4/3 factor on them?


Solution

  • I found a workaround inspired by the 62.5% font-size CSS trick – make 1rem in WeasyPrint = 1px in Sketch:

    html {
        /*
         Make 1px on Sketch = 1rem in pdf
         Normally we should set font-size: 1px, but we multiply by 4/3
         as we are in 96dpi instead of the 72dpi from Sketch.
        */
        font-size: 1.3333px;
    }
    
    body {
        /* restore a decent default font-size */
        font-size: 10rem;
    }
    

    After that I can use rem everywhere I would normally use px.

    For people who prefer to keep the more usual 1rem = 10px, just multiply the html font-size by 10 above, or use font-size = 83.333% (i.e. 62.5% * 4/3).