imprimir utilizando printdocument y printdialog
DESCRIPTION
PrintDocument y PrintDialogTRANSCRIPT
Imprimir utilizando PrintDocument y PrintDialogste pretende ser un ejemplo muy simple y breve en visual basic .net. Sencillo para que se entienda
rapidamente su funcionamiento y breve (con muy poco código) para que nada nos estorbe a la
hora de ponerle nuestro toque personal. Los programadores somos muy creativos y me a pasado
muchas veces que me encontré con ejemplos muy complejos y llenos de código, los cuales tuve
que desmenuzar y analizar por partes para poder entender su funcionamiento. Así que trato de
poner en todos mis post ejemplos concretos, simples y que funcionen con solo copiar, pegar y
hacer una mimina configuración a los controles.
Necesitamos:
Un Winform (Form1), un control PrintDocument (PrintDocument1), un control PrintDialog
(PrintDialog1), un TextBox (TextBox1) y un Botón (Button1). El formulario debería tener un aspecto
similar al de esta imagen:
Copiamos el siguiente código en el evento click de button1
1.If PrintDialog1.ShowDialog = Windows.Forms.DialogResult.OK Then2.PrintDocument1.PrinterSettings = PrintDialog1.PrinterSettings3.PrintDocument1.Print()4.End If
que lo que hace es abrir el cuadro de dialogo para seleccionar la impresora y luego pasa pasa toda
la configuración seleccionada al objeto printDocument y luego le dice que imprima. Lo que dispara
el evento PrintPage de printDocument.
Ahora sobre el objeto PrintDocument1 hacemos doble clic y pegamos el siguiente código
1.e.Graphics.DrawString(TextBox1.Text, New Font("Verdana", 18, FontStyle.Bold), Brushes.Black, 10, 10)2. 3.For i As Integer = 1 To 10
4.e.Graphics.DrawString("Ejemplo de linea: " & i, New Font("Tahoma", 10, FontStyle.Bold), Brushes.Black, 10, 20 + (i * 30))5.Next
Al ejecutar el programa este imprimirá el contenido de la caja de texto como titulo de la pagina y
diez lineas de ejemplo utilizando distinta y furnte y tamaño. El resultado se verá similar al de la
siguiente imagen:
más información sobre los controles…
PrintDialog (Componente, formularios Windows Forms)
El componente PrintDialog de formularios Windows Forms es un cuadro de diálogo preconfigurado
que se utiliza para seleccionar una impresora, elegir las páginas que se van a imprimir y
determinar otros valores de configuración relacionados con la impresión en aplicaciones basadas
en Windows. Utilícelo como una solución sencilla para seleccionar configuraciones de la impresora
o relacionadas con la impresora, en lugar de configurar un cuadro de diálogo propio. Puede
permitir que los usuarios impriman diversas partes de sus documentos: imprimir todo, imprimir el
intervalo de páginas especificado o imprimir una selección. Al basarse en cuadros de diálogo
estándar de Windows, creará aplicaciones cuya funcionalidad básica les resultará inmediatamente
familiar a los usuarios.
PrintDocument (Componente, formularios Windows Forms)
El componente PrintDocument de formularios Windows Forms se utiliza para establecer las
propiedades que describen qué se imprime y, a continuación, para imprimir el documento dentro
de aplicaciones basadas en Windows.
Imprimir el contenido de un DataGridView con PrintDocument (en VB.NET)
Dada la cantidad de comentarios (más de 10 :P) que se produjeron en el post en el
que explicaba como imprimir el contenido de un datagrid, me veo en la obligación a
hacer el mismo ejemplo en VB.NET, sobre todo porque el código que puse en los
comentarios tenía algún error.
Recordando el ejemplo, se trata de un formulario que contiene:
- un datagrid llamado DataGridView1
- un botón llamado Button1
- un PrintDocument llamado PrintDocument1
Y aquí tenéis el código:
Public Class Form1
' Variable a nivel de clase para recordar en qué punto nos hemos
quedado
Dim i As Integer = 0
Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As
System.EventArgs) Handles MyBase.Load
Me.Fill_DataGrid()
End Sub
Private Sub Fill_DataGrid()
' TODO: rellenar con el código que obtiene los datos de donde
sea necesario
' Por ejemplo:
Me.DataGridView1.DataSource = dataSet
Me.DataGridView1.DataMember = "Table"
End Sub
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e
As System.EventArgs) Handles Button1.Click
Me.PrintDocument1.Print()
End Sub
Private Sub printDocument1_PrintPage(ByVal sender As Object, ByVal
e As System.Drawing.Printing.PrintPageEventArgs) Handles
PrintDocument1.PrintPage
' Definimos la fuente que vamos a usar para imprimir
' en este caso Arial de 10
Dim printFont As System.Drawing.Font = New Font("Arial", 10)
Dim topMargin As Double = e.MarginBounds.Top
Dim yPos As Double = 0
Dim linesPerPage As Double = 0
Dim count As Integer = 0
Dim texto As String = ""
Dim row As System.Windows.Forms.DataGridViewRow
' Calculamos el número de líneas que caben en cada página
linesPerPage = e.MarginBounds.Height /
printFont.GetHeight(e.Graphics)
' Imprimimos las cabeceras
Dim header As DataGridViewHeaderCell
For Each column As DataGridViewColumn In DataGridView1.Columns
header = column.HeaderCell
texto += vbTab + header.FormattedValue.ToString()
Next
yPos = topMargin + (count * printFont.GetHeight(e.Graphics))
e.Graphics.DrawString(texto, printFont,
System.Drawing.Brushes.Black, 10, yPos)
' Dejamos una línea de separación
count += 2
' Recorremos las filas del DataGridView hasta que llegemos
' a las líneas que nos caben en cada página o al final del
grid.
While count < linesPerPage AndAlso i <
DataGridView1.Rows.Count
row = DataGridView1.Rows(i)
texto = ""
For Each celda As System.Windows.Forms.DataGridViewCell In
row.Cells
'Comprobamos que la celda tenga algún valor, en caso
de
'permitir añadir filas esto es muy importante
If celda.Value IsNot Nothing Then
texto += vbTab + celda.Value.ToString()
End If
Next
' Calculamos la posición en la que se escribe la línea
yPos = topMargin + (count *
printFont.GetHeight(e.Graphics))
' Escribimos la línea con el objeto Graphics
e.Graphics.DrawString(texto, printFont,
System.Drawing.Brushes.Black, 10, yPos)
' Incrementamos los contadores
count += 1
i += 1
End While
' Una vez fuera del bucle comprobamos si nos quedan más filas
' por imprimir, si quedan saldrán en la siguente página
If i < DataGridView1.Rows.Count Then
e.HasMorePages = True
Else
' si llegamos al final, se establece HasMorePages a
' false para que se acabe la impresión
e.HasMorePages = False
' Es necesario poner el contador a 0 porque, por ejemplo
si se hace
' una impresión desde PrintPreviewDialog, se vuelve
disparar este
' evento como si fuese la primera vez, y si i está con el
valor de la
' última fila del grid no se imprime nada
i = 0
End If
End Sub
imprimir varias páginas con el printdocument en vb.net
1. Private Sub prt_PrintPage(ByVal sender As Object, ByVal e As PrintPageEventArgs)
2. ' La fuente que vamos a usar para imprimir.3. Dim printFont As System.Drawing.Font = New Font("Arial", 8)
'prtFont4. Dim topMargin As Double = e.MarginBounds.Top5. Dim yPos As Double = 06. Dim linesPerPage As Double = 07. Dim count As Integer = 08. Dim texto As String = ""9. 10. ' Calculamos el número de líneas que caben en cada página. 11. linesPerPage = e.MarginBounds.Height /
printFont.GetHeight(e.Graphics)12. 13. While count < linesPerPage AndAlso i < Datos.Count14. Dim info As BoInfoBOLETA = Datos(i)15. e.Graphics.DrawRectangle(New Pen(Color.Red, 1), -75, -75,
1585, 639)16. e.Graphics.DrawString("24 del 01/01/2011 al 31/02/2011",
printFont, Brushes.Black, 170, 60)17. e.Graphics.DrawString(CStr(Format(Date.Now, "dd/MM/yyy")),
printFont, Brushes.Black, 470, 60)18. e.Graphics.DrawString(info.codigo, printFont, Brushes.Black,
70, 80)19. e.Graphics.DrawString(info.nombres, printFont,
Brushes.Black, 200, 80)20. .21. .22. .23. .24. .25. .26. .27. .28. .29. count = CInt(count + 35.61)30. i = i + 131. 32. End While33. 34. If i < Datos.Count Then35. e.HasMorePages = True36. Else37. e.HasMorePages = False38. i = 039. End If
Impresiones con Visual Basic 2010
Pese a que vivimos en una era digital y todo (bueno, casi todo) se
hace por internet y con la computadora, aún hay momentos en
que el papel es necesario. Hace tiempo escribí un post donde
indicaba cómo imprimir usando Visual Basic 6, pero no había
tenido la oportunidad de hacer lo mismo con el Visual Basic .net.
Y eso precisamente es lo que pienso hacer en esta ocasión: mostrar como usar los
controles y cajas de diálogo para imprimir y la forma de imprimir tanto texto como
imágenes.
Antes de continuar con rollo, código, ejemplos y demases, voy a describir
brevemente los componentes que tiene Visual Basic 2010 para imprimir.
Control PrintDocument
Este control se debe agregar a cualquier proyecto en el que se quiera imprimir
algo. Haz de cuenta que es la hoja en blanco donde puedes dibujar diferentes
objetos, escribir texto y colocar imágenes de mapa de bits. Cuando acabes de
dibujar, escribir, etc., se llama el método Print para que la impresora escupa la
hoja. Acepta todos los métodos de dibujo que usa el objeto Graphics (mismo del
que di ejemplos aquí y aquí), es decir que si tienes que escribir texto, usas el
método DrawString; si quieres dibujar un marco alrededor del texto, puedes
usar DrawLine o DrawRectangle. Aunque el control es invisible (no aparece en la
ventana ni hay forma de ir viendo conforme se va dibujando), es muy útil.
Control PrintDialog
Este control hace aparecer la ventana default que te permite elegir y configurar la
impresora que se desea emplear. Si no se usa, la impresión se hace en la
impresora que se tiene definida como default con las propiedades que trae por
default (o sea con lo default de lo default ). Para que aparezca, se debe usar el
método ShowDialog.
Control PageSetupDialog
Este control hace aparecer la ventana que te permite configurar el papel a usar:
tamaño, orientación, márgenes, etc. Se debe usar su método ShowDialog para que
aparezca, igual que con el control PrintDialog.
Control PrintPreviewDialog
Este control hace aparecer una vista previa de lo que se va a imprimir. Como
mostraré más adelante, se debe vincular este control con lo el
control PrintDocument para que todo lo que se va a imprimir, en lugar de ir a la
impresora, aparezca en esta ventana. También hay que tener cuidado: si no se
tiene acceso a la impresora que está seleccionada (por ejemplo, una impresora de
la red a la cual no tengo acceso en este momento o la que tengo conectada está
apagada), no aparece la ventana y te marca error. Es necesario recibir este error
(con un Try…Catch) para que no termine abruptamente el programa solo porque no
halla la impresora (cosa que no hago en este post, por cierto).
Ejemplo de su uso
Después de este rollo (que espero que haya sido breve), voy a ejemplificar el uso
de estos controles en un programa que hice con mis queridísimos alumnos de
4TPO. Es un ejemplo muy simple que solo muestra como se usan los controles.
Sin embargo, creo que con estas bases ya le pueden echar vuelo a la imaginación
para aplicarlo en otros contextos.
Antes que nada, les muestro el diseño de la ventana principal. Consta de 3
etiquetas, 3 cajas de texto (txtNombre, txtDir y txtRFC), un PictureBox
(picCanoa) que sirve para mostrar como imprimir una imagen de mapa de bits, 7
botones cuyo código explicaré más adelante, 2 controles PrintDocument,
un PrintDialog, un PageSetup y unPrintPreviewDialog. Estos 5 últimos no
aparecen en la ventana: cuando los agregas a la ventana aparecen en la parte
inferior.
Para que un PrintDocument funcione, es necesario editar su evento PrintPage. Si
le das doble clic al icono PrintDocument1, verás este código:
Básicamente uso el parámetro e, que es “la hoja invisible” sobre la que voy a
dibujar, para escribir 3 cadenas, un rectángulo y la imagen de la canoa. Como
mencioné con anterioridad, son las mismas funciones que se usan para dibujar
gráficos sobre la ventana cosa que ya escribí en este post y en este también.
Una vez que tienes este evento listo, puedes mandar imprimir con la
función Print. Yo lo hago con el botón cuya etiqueta dice Imprimir y este es el
código:
El PrintDocument2 muestra una idea para imprimir formatos. Dibujé el esqueleto
de un formato, lo guardé como PNG, lo importé a Visual Basic y lo puse en
un PictureBox(llamado PictureBox1) en la ventana frmPicts. Aquí está la
ventana frmPicts y abajo el código que lo usa (primero el el botón que tiene la
etiqueta Imprimir formato,btnImprime2, y luego PrintPage).
Configurar la impresora es muy simple usando el control PrintDialog. Este es el
código del botón con la etiqueta Configurar impresora. Fíjate en la manera en que
copio las propiedades puestas por el usuario en este cuadro de diálogo en los dos
controlesPrintDocument (en las 2 últimas instrucciones):
A la hora de ejecutarse, el control PrintDialog hace que aparezca esta ventana:
También es sencillo modificar la configuración de la página. Este es el código del
botón etiquetado Configurar página:
Antes del ShowDialog es necesario igualar sus propiedades a los que ya tiene
unPrintDocument (en las dos instrucciones que siguen al comentario). Al correr
este evento, aparece esta ventana:
Una vista previa (o presentación preeliminar) de lo que se va a imprimir suele ser
bastante útil para muchos usuarios. Hacer que aparezca es sencillísimo. Lo único
que hay que hacer es hacer que, en lugar de que el evento PrintPage de
un PrintDocument lo mande a la impresora, se le envía a esta caja de diálogo.
Abajo pongo el código y luego la ventana que aparece que muestra la vista
preeliminar:
También es posible jugar con la configuración de la impresora. Para leer algunas
propiedades de las impresoras, hice el botón etiquetado Lista de impresoras que
abre la ventana frmImpresoras desde donde se pueden ver la lista de impresoras
instaladas y al seleccionar una de ellas, se ven algunas de sus propiedades. Esta
es la ventanafrmImpresoras en la vista diseño:
Tiene una lista donde voy a escribir la lista de impresoras (ListBox1), etiquetas
que muestran los valores de las copias, si es duplex (si puede imprimir por ambas
caras de la hoja), el número máximo de copias permitidas y si puede recibir
documentos a color (lblCopias, lblDuplex, lblCopiasMax y lblColor,
respectivamente). También es necesario un PrintDocument para poder ver estas
propiedades. Pero antes que nada, veamos el código con que llena ListBox1:
Nótese que estoy haciendo uso de la
colecciónPrinting.PrinterSettings.InstalledPrinters misma que contiene la
lista de todas las impresoras instaladas en el equipo donde se está ejecutando.
Estoy usando la instrucción With para abreviar un poco y no escribir este rollo a
cada rato.
No necesito escribir un evento PrintPage para el PrintDocument1 porque no voy a
imprimir nada: solo lo necesito para poder mostrar las propiedades. Por esta razón el otro código
interesante es el que se ejecuta cuando ListBox1 cambia de elemento seleccionado:
Este es un ejemplo de como se ve esta ventana con una impresora seleccionada:
Espero que este documento te sea útil. ¡Hasta la próxima!