Anda di halaman 1dari 15

Imprimir utilizando PrintDocument y

PrintDialog
ste 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 cdigo) 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 cdigo, 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 configuracin a los controles.
Necesitamos:
Un Winform (Form1), un control PrintDocument (PrintDocument1), un control PrintDialog (PrintDialog1), un
TextBox (TextBox1) y un Botn (Button1). El formulario debera tener un aspecto similar al de esta imagen:

Copiamos el siguiente cdigo en el evento click de button1

1.If PrintDialog1.ShowDialog = Windows.Forms.DialogResult.OK Then


2.PrintDocument1.PrinterSettings = PrintDialog1.PrinterSettings
3.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
configuracin 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 cdigo

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 tamao. El resultado se ver similar al de la siguiente imagen:

ms informacin sobre los controles


PrintDialog (Componente, formularios Windows Forms)
El componente PrintDialog de formularios Windows Forms es un cuadro de dilogo preconfigurado que se
utiliza para seleccionar una impresora, elegir las pginas que se van a imprimir y determinar otros valores de
configuracin relacionados con la impresin en aplicaciones basadas en Windows. Utilcelo como una solucin
sencilla para seleccionar configuraciones de la impresora o relacionadas con la impresora, en lugar de
configurar un cuadro de dilogo propio. Puede permitir que los usuarios impriman diversas partes de sus
documentos: imprimir todo, imprimir el intervalo de pginas especificado o imprimir una seleccin. Al basarse
en cuadros de dilogo estndar de Windows, crear aplicaciones cuya funcionalidad bsica 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 continuacin, 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 (ms de 10 :P) que se produjeron en el post en el
que explicaba como imprimir el contenido de un datagrid, me veo en la obligacin a
hacer el mismo ejemplo en VB.NET, sobre todo porque el cdigo que puse en los
comentarios tena algn error.
Recordando el ejemplo, se trata de un formulario que contiene:
- un datagrid llamado DataGridView1
- un botn llamado Button1
- un PrintDocument llamado PrintDocument1
Y aqu tenis el cdigo:

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 cdigo 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 nmero de lneas que caben en cada pgina
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 lnea de separacin
count += 2
' Recorremos las filas del DataGridView hasta que llegemos
' a las lneas que nos caben en cada pgina 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 algn valor, en caso
de
'permitir aadir filas esto es muy importante
If celda.Value IsNot Nothing Then
texto += vbTab + celda.Value.ToString()
End If
Next

' Calculamos la posicin en la que se escribe la lnea


yPos = topMargin + (count *
printFont.GetHeight(e.Graphics))
' Escribimos la lnea 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 ms filas
' por imprimir, si quedan saldrn en la siguente pgina
If i < DataGridView1.Rows.Count Then
e.HasMorePages = True
Else
' si llegamos al final, se establece HasMorePages a
' false para que se acabe la impresin
e.HasMorePages = False
' Es necesario poner el contador a 0 porque, por ejemplo
si se hace
' una impresin 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 pginas con el printdocument en vb.net

1. Private Sub prt_PrintPage(ByVal sender As Object, ByVal e As


PrintPageEventArgs)
2.
3.

' La fuente que vamos a usar para imprimir.


Dim printFont As System.Drawing.Font = New Font("Arial", 8)
'prtFont

4.

Dim topMargin As Double = e.MarginBounds.Top

5.

Dim yPos As Double = 0

6.

Dim linesPerPage As Double = 0

7.

Dim count As Integer = 0

8.

Dim texto As String = ""

9.
10.
11.

' Calculamos el nmero de lneas que caben en cada pgina.


linesPerPage = e.MarginBounds.Height /
printFont.GetHeight(e.Graphics)

12.
13.

While count < linesPerPage AndAlso i < Datos.Count

14.

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 + 1

31.
32.

End While

33.
34.
35.
36.

If i < Datos.Count Then


e.HasMorePages = True
Else

37.

e.HasMorePages = False

38.

i = 0

39.

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, an hay momentos en que el papel es necesario. Hace tiempo escrib un post
donde indicaba cmo imprimir usando Visual Basic 6, pero no haba tenido la oportunidad de
hacer lo mismo con el Visual Basic .net. Y eso precisamente es lo que pienso hacer en esta
ocasin: mostrar como usar los controles y cajas de dilogo para imprimir y la forma de
imprimir tanto texto como imgenes.

Antes de continuar con rollo, cdigo, 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
imgenes de mapa de bits. Cuando acabes de dibujar, escribir, etc., se llama el
mtodo Print para que la impresora escupa la hoja. Acepta todos los mtodos 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 mtodo 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 impresin 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 mtodo ShowDialog.

Control PageSetupDialog
Este control hace aparecer la ventana que te permite configurar el papel a usar: tamao,
orientacin, mrgenes, etc. Se debe usar su mtodo 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 ms
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. Tambin 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 TryCatch) 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
Despus de este rollo (que espero que haya sido breve), voy a ejemplificar el uso de estos
controles en un programa que hice con mis queridsimos 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 imaginacin para aplicarlo en otros contextos.
Antes que nada, les muestro el diseo 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 cdigo explicar ms 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, vers este cdigo:

Bsicamente uso el parmetro e, que es la hoja invisible sobre la que voy a dibujar, para
escribir 3 cadenas, un rectngulo y la imagen de la canoa. Como mencion con anterioridad,
son las mismas funciones que se usan para dibujar grficos sobre la ventana cosa que ya
escrib en este post y en este tambin.
Una vez que tienes este evento listo, puedes mandar imprimir con la funcin Print. Yo lo hago
con el botn cuya etiqueta dice Imprimir y este es el cdigo:

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 cdigo que lo usa (primero el el botn que tiene la
etiqueta Imprimir formato,btnImprime2, y luego PrintPage).

Configurar la impresora es muy simple usando el control PrintDialog. Este es el cdigo del
botn con la etiqueta Configurar impresora. Fjate en la manera en que copio las propiedades
puestas por el usuario en este cuadro de dilogo en los dos controlesPrintDocument (en las 2
ltimas instrucciones):

A la hora de ejecutarse, el control PrintDialog hace que aparezca esta ventana:

Tambin es sencillo modificar la configuracin de la pgina. Este es el cdigo del botn


etiquetado Configurar pgina:

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 presentacin preeliminar) de lo que se va a imprimir suele ser bastante til
para muchos usuarios. Hacer que aparezca es sencillsimo. 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 enva a esta caja de dilogo. Abajo pongo el cdigo y luego la ventana que aparece que
muestra la vista preeliminar:

Tambin es posible jugar con la configuracin de la impresora. Para leer algunas propiedades
de las impresoras, hice el botn 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 diseo:

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 nmero
mximo de copias permitidas y si puede recibir documentos a color
(lblCopias, lblDuplex, lblCopiasMax y lblColor, respectivamente). Tambin es
necesario un PrintDocument para poder ver estas propiedades. Pero antes que nada, veamos
el cdigo con que llena ListBox1:

Ntese que estoy haciendo uso de la


coleccinPrinting.PrinterSettings.InstalledPrinters misma que contiene la lista

de todas las impresoras instaladas en el equipo donde se est ejecutando. Estoy usando la
instruccin 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 razn
el otro cdigo 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 prxima!

Anda mungkin juga menyukai