diff -up gtk+-2.22.1.orig/gtk/gtkprintcontext.h gtk+-2.22.1/gtk/gtkprintcontext.h
--- gtk+-2.22.1.orig/gtk/gtkprintcontext.h	2010-11-15 04:13:10.000000000 -0800
+++ gtk+-2.22.1/gtk/gtkprintcontext.h	2011-02-23 13:57:59.809229900 -0800
@@ -59,6 +59,7 @@ gboolean      gtk_print_context_get_hard
 PangoFontMap *gtk_print_context_get_pango_fontmap    (GtkPrintContext *context);
 PangoContext *gtk_print_context_create_pango_context (GtkPrintContext *context);
 PangoLayout  *gtk_print_context_create_pango_layout  (GtkPrintContext *context);
+PangoLayout  *gtk_print_context_get_pango_layout     (GtkPrintContext *context);
 
 /* Needed for preview implementations */
 void         gtk_print_context_set_cairo_context     (GtkPrintContext *context,
diff -up gtk+-2.22.1.orig/gtk/gtkprintcontext.c gtk+-2.22.1/gtk/gtkprintcontext.c
--- gtk+-2.22.1.orig/gtk/gtkprintcontext.c	2010-11-15 04:13:10.000000000 -0800
+++ gtk+-2.22.1/gtk/gtkprintcontext.c	2011-03-21 12:30:17.416507300 -0700
@@ -38,6 +38,7 @@ struct _GtkPrintContext
   GtkPrintOperation *op;
   cairo_t *cr;
   GtkPageSetup *page_setup;
+  PangoLayout *layout;
 
   gdouble surface_dpi_x;
   gdouble surface_dpi_y;
@@ -97,6 +98,7 @@ _gtk_print_context_new (GtkPrintOperatio
 
   context->op = op;
   context->cr = NULL;
+  context->layout = NULL;
   context->has_hard_margins = FALSE;
   
   return context;
@@ -120,7 +122,8 @@ _gtk_print_context_get_fontmap (GtkPrint
  * This function is intended to be used when implementing
  * an internal print preview, it is not needed for printing,
  * since GTK+ itself creates a suitable cairo context in that
- * case.
+ * case (except for in Win32 where this function IS used to 
+ * set the cairo context for the print operation). 
  *
  * Since: 2.10 
  */
@@ -505,17 +508,37 @@ PangoLayout *
 gtk_print_context_create_pango_layout (GtkPrintContext *context)
 {
   PangoContext *pango_context;
-  PangoLayout *layout;
 
   g_return_val_if_fail (GTK_IS_PRINT_CONTEXT (context), NULL);
 
   pango_context = gtk_print_context_create_pango_context (context);
-  layout = pango_layout_new (pango_context);
+  context->layout = pango_layout_new (pango_context);
 
   pango_cairo_update_context (context->cr, pango_context);
   g_object_unref (pango_context);
 
-  return layout;
+  return context->layout;
+}
+
+/**
+ * gtk_print_context_get_pango_layout:
+ * @context: a #GtkPrintContext
+ *
+ * Returns the #PangoLayout created for the context by 
+ * #gtk_print_context_create_pango_layout
+ * 
+ * Return value: the Pango layout for @context
+ *
+ * Since: 2.xx
+ */
+PangoLayout *
+gtk_print_context_get_pango_layout (GtkPrintContext *context)
+{
+  PangoContext *pango_context;
+
+  g_return_val_if_fail (GTK_IS_PRINT_CONTEXT (context), NULL);
+
+  return context->layout;
 }
 
 
diff -up gtk+-2.22.1.orig/gtk/gtkprintoperation.c gtk+-2.22.1/gtk/gtkprintoperation.c
--- gtk+-2.22.1.orig/gtk/gtkprintoperation.c	2010-11-15 04:13:10.000000000 -0800
+++ gtk+-2.22.1/gtk/gtkprintoperation.c	2011-03-21 12:33:20.402243500 -0700
@@ -2624,6 +2624,34 @@ prepare_data (PrintPagesData *data)
 
       g_signal_emit (data->op, signals[BEGIN_PRINT], 0, priv->print_context);
 
+      gdouble dpi_x = gtk_print_context_get_dpi_x(priv->print_context);
+      if (dpi_x != 72)
+        {
+	  /* Print device units are not points */
+	  PangoLayout *layout = gtk_print_context_get_pango_layout (priv->print_context);
+	  if (layout)
+	    {
+	      PangoTabArray *tabs = pango_layout_get_tabs (layout);
+	      if (tabs && !pango_tab_array_get_positions_in_pixels (tabs))
+	        {
+		  /* Pango tabs are given in pango units which equate to points
+		   * but the print device dpi is not the same as points per inch
+		   * so the tab positions need to be scaled to match it */
+		  gint tab, numTabs = pango_tab_array_get_size(tabs);
+		  PangoTabAlign align;
+		  for (i = 0; i < numTabs; i++)
+		    {
+		      pango_tab_array_get_tab(tabs, i, &align, &tab);
+		      tab *= dpi_x;
+		      tab /= 72;
+		      pango_tab_array_set_tab(tabs, i, align, tab);
+		    }
+		  pango_layout_set_tabs(layout, tabs);
+		  pango_tab_array_free(tabs);
+	        }
+	    }
+        }
+
       return;
     }
 
