Imprimir utilitzant PrintDocument i PrintDialog

Aquest pretén ser un exemple molt simple i breu en visual basic. net . Senzill perquè s'entengui ràpidament el seu funcionament i breu (amb molt poc codi) perquè res ens destorbi a l'hora de posar-li el nostre toc personal. Els programadors som molt creatius i m'a passat moltes vegades que em vaig trobar amb exemples molt complexos i plens de codi, dels quals vaig haver esmicolar i analitzar per parts per poder entendre el seu funcionament. Així que tracto de posar en tots els meus post exemples concrets, simples i que funcionin amb només copiar, enganxar i fer una mímina configuració als controls.

Necessitem:

Un Winform (Form1), un control PrintDocument (PrintDocument1), un control PrintDialog (PrintDialog1), un TextBox (TextBox1) i un Botó (Button1). El formulari hauria de tenir un aspecte similar al d'aquesta imatge:

Copiem el codi en l'esdeveniment clic de Button1


 If PrintDialog1.ShowDialog = Windows.Forms.DialogResult.OK Then
 PrintDocument1.PrinterSettings = PrintDialog1.PrinterSettings
 PrintDocument1.Print ()
 End If

que el que fa és obrir el quadre de diàleg per seleccionar la impressora i després passa passa tota la configuració seleccionada per tal printDocument i després li diu que imprimiu. El que dispara l'esdeveniment PrintPage de printDocument.

Ara sobre l'objecte PrintDocument1 fem doble clic i enganxem el codi


 e.Graphics.DrawString (TextBox1.Text, New Font ("Verdana", 18, FontStyle.Bold), Brushes.Black, 10, 10)

 For i As Integer = 1 To 10
 e.Graphics.DrawString ("Exemple de línia:" & i, New Font ("Tahoma", 10, FontStyle.Bold), Brushes.Black, 10, 20 + (i * 30))
 Next

En executar el programa aquest s'imprimirà el contingut de la caixa de text com títol de la pàgina i deu línies d'exemple utilitzant diferent i furnte i grandària. El resultat es veurà similar al de la següent imatge:

més informació sobre els controls ...

PrintDialog (Component, formularis Windows Forms)

El component PrintDialog de formularis Windows Forms és un quadre de diàleg preconfigurat que s'utilitza per seleccionar una impressora, triar les pàgines que voleu imprimir i determinar altres valors de configuració relacionats amb la impressió en aplicacions basades en Windows. Utilitzeu-lo com una solució senzilla per seleccionar configuracions de la impressora o relacionades amb la impressora, en lloc de configurar un quadre de diàleg propi. Podeu permetre que els usuaris imprimeixin diverses parts dels seus documents: imprimir tot, imprimir l'interval de pàgines especificat o imprimir una selecció. Al basar-se en quadres de diàleg estàndard de Windows, crearà aplicacions la funcionalitat bàsica els és immediatament familiar als usuaris.

PrintDocument (Component, formularis Windows Forms)

El component PrintDocument de formularis Windows Forms s'utilitza per establir les propietats que descriuen què s'imprimeix i, a continuació, per imprimir el document dins d'aplicacions basades en Windows.

82 Responses to "Imprimeix utilitzant PrintDocument i PrintDialog"

  1. ZOLRAK.MX diu:

    Bé com ja recorregut tot el pal i ningú va respondre sobre com se li fa per a imprimir en més fulles, em vaig donar a la tasca a investigar per altres pagines i em vaig trobar amb un codi però aquesta medi complex per enterlo fàcilment així que ho modique a l'exemple que s'està manejant aquí o sigui que aquí aquesta el meu granet de sorra i espero i ho entenguin okas ;)

    'Aquesta variable ha de ser publica
    Dim línia As Integer = 1

    Private Sub PrintDocument1_PrintPage (ByVal sender As System.Object, ByVal i As System.Drawing.Printing.PrintPageEventArgs) Handles PrintDocument1.PrintPage

    'Definim el tipus de font i de més
    Dim Font As New Font ("arial", 10)
    'Definim en què posició es va iniciar la impressió
    Dim posició As Integer = 20
    'Comptador de línies que es van imprimint
    Dim lineaimpresa As Integer = 0
    'Variable per veure quan es va fer un salt de pàgina
    Dim salto_pagina As Boolean = False
    'Variable per designar quants línies voleu imprimir per full
    Dim NroLineasPagina As Integer = 70

    For i = línia To 150
    e.Graphics.DrawString ("Exemple de línia:" & línia, Font, Brushes.Black, 10, posició)
    posició + = 15
    línia + = 1
    lineaimpresa + = 1
    If lineaimpresa = NroLineasPagina Then
    salto_pagina = True
    Exit For
    End If
    Next

    If salto_pagina = True Then
    e.HasMorePages = True
    Else
    e.HasMorePages = False
    End If
    End Sub

    Bé espero i els serveixi i ho puguin adequar als seus necessitat okas byes

  2. diego diu:

    com puc imprimir

  3. renestimpy diu:

    Imports System.IO

    Public Class frmDesCaratula

    Private stringToPrint As String

    Private Sub frmDesCaratula_Load (sender As System.Object, i As System.EventArgs) Handles MyBase.Load
    Me.MdiParent = mdiPrincipal
    End Sub

    Private Sub Button1_Click (sender As System.Object, i As System.EventArgs) Handles Button1.Click
    If ptdConfiguracion.ShowDialog = Windows.Forms.DialogResult.OK Then
    ptdDocumento.PrinterSettings = ptdConfiguracion.PrinterSettings
    ptdDocumento.Print ()
    End If
    End Sub

    Private Sub PrintDocument1_PrintPage (sender As System.Object, i As System.Drawing.Printing.PrintPageEventArgs) Handles ptdDocumento.PrintPage

    e.Graphics.DrawString (TextBox1.Text, New Font ("Verdana", 18, FontStyle.Bold), Brushes.Black, 10, 10)
    For i As Integer = 1 To 10
    e.Graphics.DrawString ("Exemple de línia:" & i, New Font ("Tahoma", 10, FontStyle.Bold), Brushes.Black, 10, 20 + (i * 30))
    Next

    '----- IMPRESSIÓ DE TOT UN DOCUMENT

    'Dim charactersOnPage As Integer = 0
    'Dim linesPerPage As Integer = 0

    'Sets the value of charactersOnPage to the number of characters
    'Of stringToPrint that will fit within the bounds of the page.
    'E.Graphics.MeasureString (stringToPrint, Me.Font, e.MarginBounds.Size, _
    'StringFormat.GenericTypographic, charactersOnPage, linesPerPage)

    'Draws the string within the bounds of the page
    'E.Graphics.DrawString (stringToPrint, Me.Font, Brushes.Black, _
    'E.MarginBounds, StringFormat.GenericTypographic)

    'Remove the portion of the string that ha rebut una printed.
    'StringToPrint = stringToPrint.Substring (charactersOnPage)

    'Check to see if more pages are to be printed.
    'E.HasMorePages = stringToPrint.Length> 0

    End Sub

    Private Sub Button2_Click (sender As System.Object, i As System.EventArgs) Handles Button2.Click
    ReadFile ()
    ptdDocumento.Print ()
    End Sub

    Private Sub ReadFile ()
    Dim docName As String = "index.html"
    Dim DocPath As String = "G: \"
    ptdDocumento.DocumentName = docName
    Dim stream As New FileStream (DocPath + docName, FileMode.Open)
    Try
    Dim reader As New StreamReader (stream)
    Try
    stringToPrint = reader.ReadToEnd ()
    Finally
    reader.Dispose ()
    End Try
    Finally
    stream.Dispose ()
    End Try
    End Sub

    Private Sub Button3_Click (sender As System.Object, i As System.EventArgs) Handles Button3.Click
    ppdVista.Document = ptdDocumento
    ppdVista.ShowDialog ()
    End Sub

    End Class

    Aquest em va funcionar a mi, necessites un texbox: TextBox1
    printdocument: ptdDocumento
    printpreviewcontrol: ppdVista
    printdialog: ptdConfiguracion

  4. Kevin Ramirez diu:

    Interessant article però pregunto com actuaríem en entorns més professionals com la impressió de tiquets, rebuts, factures o fins i tot xecs controlant si la impressora està en línia o té paper o en faig de la impreison es va detindre la impressió per algun error.

    Saps alguna cosa hacerca del que et esmento ja que he intentat moltes vegades això i sense èxit no he trobat res per resoldre aquesta problemàtica.

    Salutacions.
    Atte. Kevin Ramirez

  5. Franco C Sanchez diu:

    Bon dia, volia saber si tenies algun tutorial per poder imprimir el contingut d'un datagridview perquè tot el que trobo a internet és molt codi i res eh pogut fer funcionar!.
    Et agrairia molt si tinguessis informació sobre això.

    Salutacions

  6. Manuel diu:

    Benvolguts, jo porto més de 10 anys programant en Microsoft, vaig passar per VB6 i ara estic amb VS2010.
    Fins ara no he trobat cap eina més flexible que PrintDocument per fer informes, no hi ha res que no hagi pogut fer.

    Si tenen dubtes poden contactar.
    salutacions

  7. Edgar sa diu:

    Hola disculpin necessito ajuda urgent el que passa és que voldria saber com puc imprimir el contingut d un panell en el qual tinc una imatge (mes gran que el panell per k maneig scrollbar) i uns quants TextBox ... tot a partir d'un PrintDocument. Hola disculpin necessito ajuda urgent el que passa és que voldria saber com puc imprimir el contingut d un panell en el qual tinc una imatge (mes gran que el panell per k maneig scrollbar) i uns quants TextBox ... tot a partir d'un PrintDocument. Hola disculpin necessito ajuda urgent el que passa és que voldria saber com puc imprimir el contingut d un panell en el qual tinc una imatge (mes gran que el panell per k maneig scrollbar) i uns quants TextBox ... tot a partir d'un PrintDocument.

  8. Torres diu:

    moltes gràcies, primer exemple senzill que funciona

  9. Alberto diu:

    Moltíssimes gràcies. Claredat i rigor. Fantàstic. Ara em queda fer els cicles i filtres necessaris per imprimir els registres d'una base de dades, però és que això mateix que tan clarament has exposat l'he trobat en altres llocs molt confusament exposat. Has de ser un professor sensacional.

  10. Yack diu:

    si em va servir el teu exemple només tinc un dubte com puc de cirle alprograma imprimir amb la posició indicada meu correu és yack7raro@gmail.com per si llacuna poersona sap com

Comentar