¿Cómo puedo voltear / rotar un PrintDocument en .NET?
-
06-07-2019 - |
Pregunta
Tengo un documento que deseo que se voltee / gire 180 grados cuando se imprima. (Esto se debe a la orientación del stock de etiquetas en la impresora).
Hay una propiedad PrintDocument.PrinterSettings.LandscapeAngle
pero es de solo lectura.
Creo que esta propiedad está influenciada por el controlador de la impresora y, por lo tanto, no es "configurable".
¿Hay alguna forma agradable de rotar la impresión 180 grados sin tener que hacer nada demasiado desagradable?
Solución
Supongo que eso depende de lo que definas como "algo demasiado desagradable" :-)
La clase PrintDocument tiene una Gráficos objeto que puede utilizar para esto, que en turn tiene un TranslateTransform y método RotateTransform que le permitirá obtener cosas donde usted Necesito que sean.
A menudo vale la pena tomar una copia del objeto gráfico antes de manipularlo para poder restaurarlo nuevamente cuando haya terminado.
Otros consejos
imprima un formulario y voltee / gire un PrintDocument en VB.NET y establezca DefaultPageSettings en horizontal
Dim WithEvents mPrintDocument As New PrintDocument
Dim mPrintBitMap As Bitmap
Private Sub m_PrintDocument_PrintPage(ByVal sender As Object, ByVal e As System.Drawing.Printing.PrintPageEventArgs) Handles mPrintDocument.PrintPage
mPrintBitMap.RotateFlip(RotateFlipType.Rotate90FlipNone)
mPrintDocument.PrinterSettings.DefaultPageSettings.Landscape = True
' Draw the image centered.
Dim lWidth As Integer = e.MarginBounds.X + (e.MarginBounds.Width - mPrintBitMap.Width) \ 2
Dim lHeight As Integer = e.MarginBounds.Y + (e.MarginBounds.Height - mPrintBitMap.Height) \ 2
e.Graphics.DrawImage(mPrintBitMap, lWidth, lHeight)
' There's only one page.
e.HasMorePages = False
End Sub
Private Sub B_print_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles B_print.Click
' Copy the form image into a bitmap.
mPrintBitMap = New Bitmap(Me.Width, Me.Height)
Dim lRect As System.Drawing.Rectangle
lRect.Width = Me.Width
lRect.Height = Me.Height
Me.DrawToBitmap(mPrintBitMap, lRect)
' Make a PrintDocument and print.
mPrintDocument = New PrintDocument
mPrintDocument.Print()
End Sub
¿Has probado antes de asignarlo a la impresora GDI rotar la imagen por sí mismo? eso es lo que hice:
_currentPage = Image.FromStream((MemoryStream)_queue.Dequeue());
pageHeight = _currentPage.Height;
pageWidth = _currentPage.Width;
if (pageHeight < pageWidth)
{
_currentPage.RotateFlip(RotateFlipType.Rotate90FlipNone);
pageHeight = _currentPage.Height;
pageWidth = _currentPage.Width;
}