[cairo] Size of PDF when splitting a PDF surface

M Joonas Pihlaja jpihlaja at cc.helsinki.fi
Wed Aug 18 04:42:00 PDT 2010


On Wed, 18 Aug 2010, Thomas Petazzoni wrote:

> In the new version of MapOSMatic we're developing, we are implementing
> a "booklet" rendering mode: instead of having the city map rendered on
> a single, large PDF file that is hard to print on common printers, we
> will split the map on different (A5, A4, etc.) pages.

Wonderful.

> To do this, we ask Mapnik to render the full map in a single large 
> Cairo PDFSurface, and then create another Cairo PDFSurface of the 
> destination size
[...]
> to render on each page a part of the original Cairo PDFSurface.

You can do that, but it's much better if you restrict the geometry 
sent to cairo at the application level. Separating the geometry 
fetched for the extents of interest from the actual rendering will 
also let you scale to much larger maps.

> Is our way of extracting parts of a surface into another surface 
> incorrect ?

It's not incorrect, just inefficient.  The key here is IMHO to think 
of clipping and culling in your app where it can be done much more 
efficiently than within cairo.  In fact, for the kind of rendering 
you're doing, I suggest you treat cairo as a limited precision output 
device capable of rendering only small geometries to a small area of 
interest.

> Is there a way of making sure that Cairo includes only once in the 
> final PDF the contents of the original surface ?

Cairo could create a group for your entire map I suppose and then 
merely convert your fill operations to something that refs the group.  
Printers would likely try to render each primitive for every page, 
however, so with larger booklets printing may become intolerably slow 
or impossible.

Joonas


More information about the cairo mailing list