[cairo] Printing/Creating PDf/Postscript

Jeff Hallock Jhallock at WBandA.com
Thu Jun 3 12:54:19 PDT 2010

I am attempting to create reports using (the perl bindings for) Gtk2/Cairo/Pango. I don't think it should be too hard to read my code if you aren't familiar with perl though.  Not knowing which was the best place to post this, I sent this to both the Gtk and the Cairo mailing lists.

 My reports should be able to write to a print operation, or a cairo surface. This seems simple enough - just pass  in the Cairo context you want to write to.  The problem I am running into is when draw text on a context from a  print operation - the text appears extremely tiny on the page (look at print_op.pdf).

When drawing to a Cairo Surface - the output is as expected (see surface.pdf/surface.ps).

surface_po_diff.pl is the script that created these files so you can run it yourself.

What is going on here? I know that the suggested way of printing text to a print operation is get a pango layout from the GtkPrintContext using gtk_print_context_create_pango_layout ()   ($print_context->create_pango_layout from perl) and then use that.

But I really don't want my reports to need to know about a GtkPrintContext - ideally they should be able to operate with just a CairoContext.

My gut says there is some sort of transformation going on here, but I'm not sure where are how to alter it. (I'm rather new to Cairo/Pango programming). I have tried playing with the set_matrix and set_font_matrix of the cairo context but didn't yield any results. I may not be using them correctly.

How can write this code, so the print_text function prints the same size on the print operation and a cairo surface that I create myself.

Thanks in advance for any input!

-          Jeffrey Ray

# prints to print driver - text is tiny
my $window = Gtk2::Window->new;
my $po = Gtk2::PrintOperation->new;
$po->set_n_pages( 1 );

$po->signal_connect('draw-page' => sub {
    my ($po, $print_context, $number) = @_;
    my $cr = $print_context->get_cairo_context;
$po->run('print-dialog', $window);

# creates a pdf file, text is large
my $surface = Cairo::PdfSurface->create ( 'surface.pdf', 612, 792);
my $cr = Cairo::Context->create( $surface );

# creates a ps file, text is large
$surface = Cairo::PdfSurface->create ( 'surface.ps', 612, 792);
$cr = Cairo::Context->create( $surface );

sub print_text {
    my $cr = shift;

    my $layout = Pango::Cairo::create_layout( $cr );
    $layout->set_markup( 'Foo:Bar' );

    my $attrlist = Pango::AttrList->new;
    my $font = Pango::AttrFontDesc->new( Pango::FontDescription->from_string('calibri,arial 10') );
    $layout->set_attributes( $attrlist );

    Pango::Cairo::update_layout( $cr, $layout );
    Pango::Cairo::show_layout( $cr, $layout );

-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.cairographics.org/archives/cairo/attachments/20100603/dd8217a1/attachment.htm>
-------------- next part --------------
A non-text attachment was scrubbed...
Name: surface.pdf
Type: application/pdf
Size: 9439 bytes
Desc: surface.pdf
URL: <http://lists.cairographics.org/archives/cairo/attachments/20100603/dd8217a1/attachment-0002.pdf>
-------------- next part --------------
A non-text attachment was scrubbed...
Name: surface.ps
Type: application/postscript
Size: 9439 bytes
Desc: surface.ps
URL: <http://lists.cairographics.org/archives/cairo/attachments/20100603/dd8217a1/attachment-0001.ps>
-------------- next part --------------
A non-text attachment was scrubbed...
Name: surface_po_diff.pl
Type: application/octet-stream
Size: 1234 bytes
Desc: surface_po_diff.pl
URL: <http://lists.cairographics.org/archives/cairo/attachments/20100603/dd8217a1/attachment-0001.obj>
-------------- next part --------------
A non-text attachment was scrubbed...
Name: print_op.pdf
Type: application/pdf
Size: 27553 bytes
Desc: print_op.pdf
URL: <http://lists.cairographics.org/archives/cairo/attachments/20100603/dd8217a1/attachment-0003.pdf>

More information about the cairo mailing list