diff --git a/libview/ev-print-operation.c b/libview/ev-print-operation.c
index 4a268b4..724ec11 100644
--- a/libview/ev-print-operation.c
+++ b/libview/ev-print-operation.c
@@ -1825,38 +1825,20 @@ _print_context_get_hard_margins (GtkPrintContext *context,
 }
 
 static void
-ev_print_operation_print_get_scaled_page_size (EvPrintOperationPrint *print,
-                                               gint                   page,
-                                               gdouble               *width,
-                                               gdouble               *height)
-{
-        GtkPrintSettings *settings;
-        gdouble           manual_scale;
-
-        ev_document_get_page_size (EV_PRINT_OPERATION (print)->document,
-                                   page, width, height);
-
-        settings = gtk_print_operation_get_print_settings (print->op);
-        manual_scale = gtk_print_settings_get_scale (settings) / 100.0;
-        if (manual_scale == 1.0)
-                return;
-
-        *width *= manual_scale;
-        *height *= manual_scale;
-}
-
-static void
 ev_print_operation_print_draw_page (EvPrintOperationPrint *print,
 				    GtkPrintContext       *context,
 				    gint                   page)
 {
 	EvPrintOperation *op = EV_PRINT_OPERATION (print);
+	GtkPrintSettings *settings;
+	GtkPageSetup     *pagesetup;
 	cairo_t          *cr;
 	gdouble           cr_width, cr_height;
 	gdouble           width, height, scale;
 	gdouble           x_scale, y_scale;
         gdouble           x_offset, y_offset;
 	gdouble           top, bottom, left, right;
+	gdouble           userscale;
 
 	gtk_print_operation_set_defer_drawing (print->op);
 
@@ -1874,56 +1856,58 @@ ev_print_operation_print_draw_page (EvPrintOperationPrint *print,
                 return;
         }
 
+	/* one could just as well extract userscale via cairo_device_to_user */
+	settings = gtk_print_operation_get_print_settings (print->op);
+	userscale = gtk_print_settings_get_scale (settings) / 100.0;
 	ev_job_print_set_page (EV_JOB_PRINT (print->job_print), page);
 
 	cr = gtk_print_context_get_cairo_context (context);
 	cr_width = gtk_print_context_get_width (context);
 	cr_height = gtk_print_context_get_height (context);
-        ev_print_operation_print_get_scaled_page_size (print, page, &width, &height);
+	ev_document_get_page_size (EV_PRINT_OPERATION (print)->document,
+				   page, &width, &height);
+
+	pagesetup = gtk_print_context_get_page_setup (context);
+	switch (gtk_page_setup_get_orientation(pagesetup)) {
+	default:
+	case GTK_PAGE_ORIENTATION_PORTRAIT:
+		break;
+	case GTK_PAGE_ORIENTATION_LANDSCAPE:
+		cairo_translate (cr, (1-1/userscale)*cr_width, 0);
+		break;
+	case GTK_PAGE_ORIENTATION_REVERSE_PORTRAIT:
+		cairo_translate (cr, (1-1/userscale)*cr_width, (1-1/userscale)*cr_height);
+		break;
+	case GTK_PAGE_ORIENTATION_REVERSE_LANDSCAPE:
+		cairo_translate (cr, 0, (1-1/userscale)*cr_height);
+		break;
+	}
+
 
 	if (print->page_scale == EV_SCALE_NONE) {
 		/* Center document page on the printed page */
 		if (print->autorotate) {
-                        x_offset = (cr_width - width) / 2;
-                        y_offset = (cr_height - height) / 2;
-                        cairo_device_to_user (cr, &x_offset, &y_offset);
-                        cairo_translate (cr, x_offset, y_offset);
+			x_offset = (cr_width - width*userscale) / 2;
+			y_offset = (cr_height - height*userscale) / 2;
+			cairo_translate (cr, x_offset/userscale, y_offset/userscale);
                 }
-	} else {
+	} else { /* semantics with userscale: if scaled document would appear beyond margins, shrink it */
+		 /* this also implies: userscale + fit to printable area is useless */
 		_print_context_get_hard_margins (context, &top, &bottom, &left, &right);
-
-		x_scale = (cr_width - left - right) / width;
-		y_scale = (cr_height - top - bottom) / height;
+		x_scale = (cr_width - left - right) / (width*userscale);
+		y_scale = (cr_height - top - bottom) / (height*userscale);
                 scale = MIN (x_scale, y_scale);
 
                 /* Ignore scale > 1 when shrinking to printable area */
-                if (scale > 1.0 && print->page_scale == EV_SCALE_SHRINK_TO_PRINTABLE_AREA)
+                if (scale > (1.0) && print->page_scale == EV_SCALE_SHRINK_TO_PRINTABLE_AREA)
                         scale = 1.0;
 
 		if (print->autorotate) {
-                        x_offset = (cr_width - scale * width) / 2;
-                        y_offset = (cr_height - scale * height) / 2;
-                        cairo_device_to_user (cr, &x_offset, &y_offset);
-                        cairo_translate (cr, x_offset, y_offset);
-
-			/* Ensure document page is within the margins. The
-			 * scale guarantees the document will fit in the
-			 * margins so we just need to check each side and
-			 * if it overhangs the margin, translate it to the
-                         * margin. */
-			if (x_offset < left)
-				cairo_translate (cr, left - x_offset, 0);
-
-			if (x_offset < right)
-				cairo_translate (cr, -(right - x_offset), 0);
-
-			if (y_offset < top)
-				cairo_translate (cr, 0, top - y_offset);
-
-			if (y_offset < bottom)
-				cairo_translate (cr, 0, -(bottom - y_offset));
+			x_offset = (cr_width - scale*userscale*width) / 2;
+			y_offset = (cr_height - scale*userscale*height) / 2;
+                        cairo_translate (cr, x_offset/userscale, y_offset/userscale);
 		} else {
-			cairo_translate (cr, left, top);
+			cairo_translate (cr, left/userscale, top/userscale);
 		}
 
 		if (print->page_scale == EV_SCALE_FIT_TO_PRINTABLE_AREA || scale < 1.0) {
