I spent all yesterday evening adding graphics primitives support into PDFLib.pm, my OO layer over pdflib_pl.pm - the perl module that ships with pdflib. Despite the fact that pdflib isn't quite open source (It's the Aladdin public license), it's probably the best option for producing PDFs in Perl, being XS/C based it's very fast and lightweight.
Unfortunately PAUSE seems to be down, or not responding for me, so you'll have to wait to get your hands on it.
The reason I started hacking on PDFLib again was that I needed string_width (which is a core pdflib function), and once I'd added that I noticed a few other things I wanted to clean up, and then it just started snowballing. I'm at the point now where PDFLib almost covers all of the core pdflib functions, with the exception of some of the linking/embedding options, and the PDI (PDF Import) stuff, which would be nice to have for editing PDFs, but you have to pay for that. I may download the demo though and play with it a bit.
Anyway, I keep digressing...
I need string_width because I'm trying to do something that's proving very hard indeed - how to layout centred or right-aligned text that may or may not mix different fonts, styles and so on. And do it based on a stream (this is from XML, so I may see a bold title, but I get that as separate chunks). I think it can be done, by using a stack of what I have to layout, and lay things out a line at a time, based on working out the string_width of a word at a time. But it's probably one of the harder things I've ever tackled. But it's always good to learn new things, so in a way I'm quite looking forward to this.