Here is a little snippet that shows how to use
Cairo module, to output pdf files. It is basically the same as the demo script which comes with the module, but the output is pdf instead of png. (The docs don't show how to do it, because it is still a new feature and the API may change). But here it is. :-)
#!/usr/bin/perl
use strict;
use warnings;
use Cairo;
# requires you have the latest Cairo c-libs
# built with --enable-pdf
use constant
{
IMG_WIDTH => 640,
IMG_HEIGHT => 480,
M_PI => 3.14159265,
};
die "pdf backend not supported" unless (Cairo::HAS_PDF_SURFACE);
my $pdf_out = "$0.pdf";
my $surf = Cairo::PdfSurface->create ($pdf_out, IMG_WIDTH, IMG_HEIGHT)
+;
my $cr = Cairo::Context->create ($surf);
$cr->rectangle (0, 0, IMG_WIDTH, IMG_HEIGHT);
$cr->set_source_rgba (1, 1, 1, 0.5);
$cr->fill;
# black
$cr->save;
$cr->set_source_rgba (0, 0, 0, 0.5);
$cr->translate (IMG_WIDTH / 2, IMG_HEIGHT - (IMG_HEIGHT / 4));
do_star ();
$cr->restore;
# red
$cr->save;
$cr->set_source_rgba (1, 0, 0, 0.5);
$cr->translate (IMG_WIDTH / 2, IMG_HEIGHT / 4);
do_star ();
$cr->restore;
# green
$cr->save;
$cr->set_source_rgba (0, 1, 0, 0.5);
$cr->translate (IMG_WIDTH / 4, IMG_HEIGHT / 2);
do_star ();
$cr->restore;
# blue
$cr->save;
$cr->set_source_rgba (0, 0, 1, 0.5);
$cr->translate (IMG_WIDTH - (IMG_WIDTH / 4), IMG_HEIGHT / 2);
do_star ();
$cr->restore;
$cr->show_page;
###############################################################
sub do_star
{
my $mx = IMG_WIDTH / 3.0;
my $count = 100;
foreach (0..$count-1)
{
$cr->new_path;
$cr->move_to (0, 0);
$cr->rel_line_to (-$mx, 0);
$cr->stroke;
$cr->rotate ((M_PI * 2) / $count);
}
}