Re: Size of PDF with lots of images

Simon Sapin <[email protected]>
Newsgroups gmane.comp.lib.cairo
Message-ID <[email protected]>
On 16/01/2014 03:44, Behdad Esfahbod wrote:
> Back in 2007 Carl and I developed Slippy a GUADEC to do our cairo slides.  I
> have used it since for many presentations.  It's a pycairo-based tool where
> you express slides as Python functions.  It's very handy, specially if you
> want to use cairo drawing in your slides.
>
> Back in the days, if I had a huge background image, it was replicated in each
> slide, so I was getting, like, 240MB PDFs for a simple presentation.
> Fortunately that has long been fixed.
>
> Now, for my GLyphy talk [2], the source images are 14MB [3], but the generated
> PDF [4] is 18MB.  Does anyone feel like taking a look?
>
> [1] http://github.com/behdad/slippy
> [2] https://vimeo.com/83732058
> [3] https://github.com/behdad/slippy/tree/master/glyphy
> [4] http://behdad.org/glyphy_slides.pdf


Hi Behdad,

Cairo’s default way of storing raster images in PDF is raw pixel data 
compressed as deflate with zlib’s default compression level [1].

Even though PNG also uses deflate, PDF’s encoding is not PNG so the 
images are decompressed and re-compressed. I’m not too surprised to see 
the size increase. You could try a build of cairo that uses zlib’s 
maximum compression level and see what happens. Of course, this is a 
compromise with compression speed. Maybe it’s worth adding API to change 
this level.

If your images were in a format that the PDF backend supports [2] (which 
includes JPEG but not PNG), you could use cairo_surface_set_mime_data() 
to have cairo store the original image data (almost) as-is in PDF, 
without re-compressing. Although I expect that lossy JPEG may not look 
nice for these specific images.

pycairo does not support Surface.set_mime_data(), but cairocffi does 
[3]. It also includes some glue code to load images (including JPEG) 
into an ImageSurface, using GDK-PixBuf [4].


[1] 
http://cgit.freedesktop.org/cairo/tree/src/cairo-deflate-stream.c?id=b56b971141bf22ee3452b7f6f5e2dfd373b99e13#n143

[2] 
http://cgit.freedesktop.org/cairo/tree/src/cairo-pdf-surface.c?id=b56b971141bf22ee3452b7f6f5e2dfd373b99e13#n179

[3] http://pythonhosted.org/cairocffi/

[4] http://pythonhosted.org/cairocffi/pixbuf.html

Cheers,
-- 
Simon Sapin
-- 
cairo mailing list
[email protected]
http://lists.cairographics.org/mailman/listinfo/cairo
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.