OK, so now I'll answer my own question. The printer in question is an HP D4300. it turns out from the documentation
(http://h20000.www2.hp.com/bizsupport/Te ... =c01420001
that this printer has a 'printable area' for A4 of 203.2 x 283.5 mm.
When GtkPrintOperation hands you a Cairo Context to work with, it's extents might coincide with the A4 page size. You can't tell exactly because of the dead zone.
If you look at the default GtkPageSetup, the left and top margins are reported at 6.35mm - values that don't bear any relationship to the default printer. So you can forget those.
It looks like if you want your application to print accurately, i.e. to the order of +- 1mm, you probably have to provide a printer alignment test menu item. Mine now goes something like this (it's in D, but D is easy to read):
void onDrawTest(PrintContext pc, int pn, PrintOperation po)
double rx = pc.getDpiX();
rx /= 25.4; // to mm
double ry = pc.getDpiY();
ry /= 25.4;
Context c = pc.getCairoContext();
This draws 4 nominal 10mm corners at the top left of the page starting at 2mm from the edge, and progressing in by 2mm each.
Your user then has to check the printed output to see how many of these are visible, and measure them to determine where the actual left and top margins might be. She must then enter the determined values in your settings dialog. These are then applied as a context.translate() before you do any context.scale() to suit your screen-designed stuff to the printer. (Of course in the affine matrix way of doing things, before means after ;=)).
You will then, with a bit of help from your user be able to render something like the grid of a sheet of business cards accurately.
Way to go!