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.

84 Responses to "Imprimeix utilitzant PrintDocument i PrintDialog"

  1. Informació Bitacoras.com ...

    Si vols, pots fer click per valorar aquest post en Bitacoras.com. Gràcies ....

    • Gosuna diu:

      És molt bo quan volem imprimir TextBox d'un formulari sense necessitat de fer un informe.

      No se si podries publicar alguna cosa sobre com fer que un rebut de compra que aquest en un reportviewer s'imprimeixi automàticament en una imprsora predeterminada sense necessitat d'obrir el pirntdialog de reportviewer.

      fins després i felicitats pels vostres canvis.

    • Pau diu:

      Excel · lent! Estimo el simple. Fins i tot funcionen els parametres de pàgina com a orientació i grandària

  2. Robertinho diu:

    em va ajudar molt aquest codi de fet vaig estar buscant molt per internet i em va sortir codi molt complex gràcies per cert no mes et mancat declarar la variable & però tot va sortir perfecte

  3. Alex diu:

    Hola vaig estar buscant per moltes parts fins que vaig trobar el teu exemple i em va ajudar basatante ja que en altres pàgines havia moltissim codi i no sabia que part era la que realment s'imprimia
    moltes gràcies per l'exemple

  4. Eliseu diu:

    Gràcies Alex, aquesta és la idea principal d'aquest blog: que ho exemples siguin breus i clars perquè no et enriedes amb tant codi.

  5. Tux! Diu:

    aca tenen el codi per a C #!

    namespace Print
    {
    public partial class Form1: Form
    {
    public Form1 ()
    {
    InitializeComponent ();
    }

    private void button1_Click (object sender, EventArgs e)
    {
    if (printDialog1.ShowDialog () == DialogResult.OK)
    {
    printDocument1.PrinterSettings = printDialog1.PrinterSettings;
    printDocument1.Print ();
    }
    }

    private void printDocument1_PrintPage_1 (object sender, System.Drawing.Printing.PrintPageEventArgs e)
    {
    int a = 50;
    for (int i = 0; i <10; i + +)
    {
    e.Graphics.DrawString ("SampleText", new Font ("Verdana", 20 - i, FontStyle.Italic), Brushes.Black, 20, a);
    a = a + 25;
    }
    }
    }
    }

  6. Zzombi diu:

    com puc saber la posició en la qual sortirà la impressió quan li dono les coordenades X i Y

  7. Davy diu:

    Soci, Excel · lent post, clar i senzill, busqui alguna cosa o algú que expliqués les coses com havien de ser per tota la web i només això em sirvio.Hay gent que explica d'una manera complicada i amb molt codi per sentir que saben molt. 10 pt.
    Gràcies i Salutacions!

  8. Paulo diu:

    Excel · lent post, Et felicito, opino el mateix que els altres, molt clar i explicatiu, no com els altres que he vist.
    Tindràs alguna cosa sobre crystal report basic for visual studio 8?
    He fet diversos informes i no em resulta com passar-li paràmetres des window form per aplicar certs filtres a les consultes.
    gràcies

  9. Joel diu:

    Hola, necessito saber com imprimir la informació que jo vulgui dels forms, per ejeplo els textos dels TextBox, específics i en llocs específics i que em generi una vista prèvia abans d'imprimir, no es molt d'això però vull que em ajudin amb això. gràcies!

  10. blabla diu:

    El teu si ets programador, si volen posar el codi d'alguna cosa no hi ha res més pràctic de posar el bàsic, ja cadascú li agrega el que vol, moltes gràcies

  11. Silvestre diu:

    Et felicito per la manera senzilla i clara
    amb la qual expliques.
    Et demano que per favor em expliquis, com fer perquè en el PrintPage es posi el dia, nom del mes i l'any. Quin és el Codi que he de posar al PrintDocument?
    Exemple:
    Expedida el ¿dia? d'¿nom del més? del ¿Any?
    Moltes gràcies.

    • Eliseu diu:

      De la mateixa manera com imprimeixes qualsevol variable. Per obtenir la data del sistema fa servir: Now.date.

      Sort

  12. Rafael diu:

    Hola Eliseo, excel · lent exemple, molt senzill i útil, només voldria saber com puc fer per indicar-li al document les coordenades X, Y de la pàgina on vull que s'imprimeixi la informació. Això ho necessito perquè he de imprimir una sèrie de codis de barres en unes pàgines que ja porten 25 etiquetes en blanc.

    Gràcies per endavant.

    • Eliseu diu:

      En DrawString tens propietats que et permeten indicar les coordenades X, I on s'imprimirà. Només és qüestió de fer algunes proves i estic segur que podràs resoldre.

      Sort

  13. Osman diu:

    Hola gràcies pel Aportació, m'ha estat molt útil, però voldria saber com imprimir el resultat d'una consulta en un DataGrid

    Gràcies

    • Narcís diu:

      DA.Fill (DT)
      REPO.SetDataSource (DT)
      CRV.ReportSource = REP
      FRM.Controls.Add (CRV)
      CRV.Dock = System.Windows.Forms.DockStyle.Fill
      FRM.WindowState = FormWindowState.Maximized
      FRM.ShowDialog ()

      "REPO = REPORTDOCUMENT
      "CRV = CRYSTAL REPORT VIEWER
      "FRM = WINDOWS FORM
      "DA = SQLDATAADAPTER
      "DT = DATATABLE

  14. Leonel diu:

    com puc fer q el meu formulari tingui la opció de nou

  15. Nelson diu:

    Hola, he estat provant la majoria dels exemples i resulta que tots són molt bons.
    Mil gràcies.
    Però ara tinc un petit gran problema:
    estic recuperant informació d'una taula i al listarla m'ocupa més d'una pàgina i NO trobada com passar a la següent. Agrairia un exemple d'aquests teus i em quedaria més que clar.
    Treball amb VS.net 2008 i MySql.

  16. jose manuel diu:

    hola que tal men però surt error en &, en el missatge d'error diu que falta declarar però em gustaria saber de quina manera ho declares, espero la teva ràpida resposta, gràcies ...

  17. Denko diu:

    caaaaaaaaaaapooooooooooooooo ...
    i per imprimir una foto, com seria?

    no trobo una ona DrawImagen però des d'arxiu ...

  18. Fernando Piazza diu:

    Hola!
    Molt interessant l'exemple. Jo programo en C #.
    Ha alguna manera de previsualitzar això?
    Salutacions!

  19. Miguel diu:

    Em sembla molt bé per imprimir els tesxtbox, amb pocs caràcters, però quan intento imprimir un camp memo, que té diverses línies, em produeix un error. Resulta que no em respecta els 80 caràcters per línia, com és al camp memo, escriu la línia fins que hi hagi un punt ia part, així que al imprimir només surt els primers 80 caràcters de cada punt ia part.
    Us agrairia que em digueu com puc esmenar aquest error.

  20. Leopoldo diu:

    Hola, saps he intentat l'exemple inicial, però sense sort que imprimeixi, utilitzo una impressora PDF. I sempre em surt en blanc. Amb seguretat m'esta faltant especificar paràmetres o demés .. si m'ajudes si us plau?

    Gràcies.

  21. Manuel diu:

    Que falta per afegir a l'exemple per posar el retorn de carro.
    Gràcies per endavant,

  22. Fernando diu:

    Sabeu com cal posar: 90 caràcters per línia i fer un retorn de Carro

  23. GNZ diu:

    Bé loquito ... et luciste!
    Merci Beaucoup

  24. gina diu:

    xk apareix & com no declarat

  25. Jose diu:

    la part & esborra, només deixa-ho amb el &
    res més

  26. Julian diu:

    Sos un capo man em re va servir, gràcies.

  27. Joseph diu:

    excel · lent però torno a preguntar hi ha alguna manera per imprimir el resultat d'una consulta en un datagridview?

  28. Cristian Ruiz diu:

    sent com li faig per imprimir el contingut d'un DataGridView1

  29. kobellas diu:

    Estic tornant-me boig!

    Tinc un document de word, al que crido per imprimir,

    wdoc.print ()

    El cas és que tinc per defecte la impressora banca i negra, i vull escollir, si ho faig amb PDF Creator o la de Color. He provat de tot sense cap resultat.

    Algú seria tan amable de dir-me un codi per dir-li que imprimeixi el "wdoc" amb la impressora que jo esculli?

    Moltes gràcies per endavant!

  30. Anònim diu:

    Hola!!

    Em va agradar el post, però em va quedar una mica en dubte ...

    si per exemple jo tinc 2 TextBox, i vull que imprimeixi el text del TextBox1, com faig??

  31. juan carlos santamaria diu:

    Excel · lent article, la veritat en el més senzill millor. i resta és només experimentar

  32. isabel diu:

    si en comptes d'imprimir un text vull imrimir 01:00
    DataGridView com ago

  33. helen87 diu:

    Hola, estic fent un programet amb VB.net i tinc un problema a l'hora de manar imprimir.

    Jo el que necessito és imprimir taules que apareixen en una base de dades, se suposa que l'usuari tria quina part de la base de dades vol imprimir, però no se com idicar que no imprimeixi tota la BD.

    Si algú em pot ajudar li ho agrairia.
    Salutacions!!

  34. Emilio diu:

    Bones he utilitzat aquest codi per imprimir amb vidre report Report.PrintToPrinter (1, False, 0, 0)
    però aquesta línia envia a imprimir a la impressora per defaul la qual aquest com a predeterminada i ocupo tenir una com predertermina i enviar a imprimir a una altra agraeixo la seva ajuda amb algun codi que li pugui donar la ruta o nom des codi a imprimir gràcies

  35. Kayien diu:

    Salutacions i gràcies per compartir els teus coneixements la veritat sóc nou en això, us veia codi m'adono decuenta el simple que pot arribar ser aprendre programació és custion de pràctica i dedicació ..

    la meva pregunta és jo tinc un formulari la qual té 107 chechbox i 4 TextBox com puc fer que em imprimiu la informació pel fet que el formulari té massa contingut perquè entri en un full tipus carta A4

    que és el que vull fer ara ja tinc clar que he de fer una ordre (If - Else - Then) per a poder seleccionar de la meva formulari el conetenido seleccionat però a l'hora dóna enviar-lo a imprimir com puc enviar a més del format de form i el contingut seleccionat no entenc i usant crystal report no em deixa utilitzar checkbox: S estic molt embullat no es que puc fer aqui deixo una imagene http://img826.imageshack.us/img826/2738/14397131.jpg

  36. Tatiana diu:

    molt bon exemple. Però ahi imprimeixo text que jo li pas. I si necessito imprimir un document que tinc guardat a l'ordinador? L'assumpte és el següent: Necessito imprimir un document que tinc guardat a C: \ \. El problema és que he de setearle primer el rang de pàgines a imprimir (xq no necessito tot el document) i després imprimir-lo. Què puc fer??

    • Eliseu diu:

      la pregunta dóna lloc a moltes respostes i totes depenen del tipus de fitxer que vulguis imprimir, atès que no és el mateix un arxiu de text que un full d'Excel o un fitxer d'imatge. Què arxiu és el que vols imprimir?

  37. Cesar diu:

    Exelente exemple l'he posat en marxa i molt fàcil és.

    només em queda diversos dubtes la principal és com indicar al procediment que ha de fer salt de línia. caundo un text no arriba en una línia sinó que reequiere 2 o mes?

    gràcies

  38. carlos diu:

    Hola, tinc un problema en el codi de printDocument ja que "amp" m'assenyala error i em diu que no està declarada ... si són tan amables de solucionar-me el problema ... gràcies

    • Angelica diu:

      Això que diu '&' es refereix només a que és un amperson el que hi ha. Aquesta línia de codi està concatenant text. Només deixa-ho com '&' i llest!!

      No se si ja ho havies descobert abans, però tot i així et deixo la resposta.

      Salutacions!

  39. german diu:

    Molt bon exemple per imprimir utilitzant printdocument i printdialog, però, amb aquestes instruccions com salt de pàgina? en utilitzar e.hasmorepage em fa un recompte infinit de pàgines.

    Gràcies

  40. naranjamarmota7 diu:

    aquesta molt pare i senzill ja que molts altres expressen demaciado en codi em va ser de gran ajuda .... gràcies

  41. Mel diu:

    Bonissim .... Moltes gràcies per la vostra ajuda ..

  42. Riper diu:

    Hola voldria que aquest botó em imprimir un informe! ? com podria fer-ho per
    favor

  43. Hack Pierre diu:

    excel · lent em va ajudar molt ja portava com 3 dies buscant això gràcies amic!

  44. menuenter diu:

    Tinc una consulta que l'he buscat per tot arreu i no tinc resposta encara.
    la meva consulta és la següent:
    tinc un windows form en vb.net i necessito imprimir-lo, el meu problema és que en ser tan extens (tinc habilitada la propietat en Autoscroll del formulari), em imprimeix només el que tinc en pantalla en aquell moment, no així la resta del formulari.
    ús aquest codi per imprimir:
    'Imprimir formulari
    Private Sub Btnimprimir_Click (ByVal sender As System.Object, ByVal i As System.EventArgs) Handles Btnimprimir.Click

    With PrintForm1
    . PrintAction = Printing.PrintAction.PrintToPreview

    . Print (Me, PowerPacks.Printing.PrintForm.PrintOption.Scrollable)

    End With

    End Sub

    no se si es podrà imprimir formularis d'aquestes característiques.

    bo des de ja moltes gràcies per endavant. -

  45. onieto diu:

    Hola, excel · lent informació, moltes gràcies, sóc super novell en això i no es una altra forma d'imprimir i lluiti alguna cosa amb la idea de coordenades, i per ajudar-me vaig imprimir un full quadriculat, aquí els deixo el codi per si a algun novell com jo li serveix:

    ************************************************** ********************************

    'Això és per a imprimir en paper una quadricula espaiada 50 píxels amb rètols que t'ajuda per ubicar el que vulguis imprimir

    Private Sub Button1_Click (ByVal sender As System.Object, ByVal i As System.EventArgs) Handles Button1.Click
    PrintDocument1.Print ()
    End Sub

    Private Sub PrintDocument1_PrintPage (ByVal sender As System.Object, ByVal i As System.Drawing.Printing.PrintPageEventArgs) Handles PrintDocument1.PrintPage
    Dim cyanPen As New Pen (Color.Cyan, 1)
    Dim i As Integer

    For i = 1 To 23

    e.Graphics.DrawLine (cyanPen, 1, 1 + (i * 50), 850, 1 + (i * 50))
    e.Graphics.DrawLine (cyanPen2, 1 + (i * 50), 1, 1 + (i * 50), 1150)
    e.Graphics.DrawString ((i * 50), New Font ("Verdana", 8, FontStyle.Bold), Brushes.Red, 40, -6 + (i * 50))
    e.Graphics.DrawString ((i * 50), New Font ("Verdana", 8, FontStyle.Bold), Brushes.Red, -10 + (i * 50), 44)
    e.Graphics.DrawString ((i * 50), New Font ("Verdana", 8, FontStyle.Bold), Brushes.Red, 390, -6 + (i * 50))
    e.Graphics.DrawString ((i * 50), New Font ("Verdana", 8, FontStyle.Bold), Brushes.Red, -10 + (i * 50), 544)
    Next

    End Sub
    ************************************************** ********************************

  46. Eduardo diu:

    Gràcies! Em va ajudar molt

  47. lover1986 diu:

    Good Day ...
    Com estan disculpeu però em podrien ajudar ...
    com puc imprimir una imatge carregada en un label .....? o en un PictureBox .....? per endavant els agradesco l'ajuda ...

  48. Edu diu:

    Excel · lent. Però, com es pot imprimir més d'1 pàgina?

  49. miguel diu:

    com visualitzo això abans de ser imprès usant PrintToPreview

    gràcies

  50. ZOLRAK.MX diu:

    Graicas pel codi ja que és molt fàcil enviar a imprimir sempre que tota la informació que es requereixi imprimir sigui en un sol full, ja que el que jo requereixo és imprimir en més d'un full ja que el que comandament a imprimir és el contingut d'un listview i són un bon registres i usant aquest codi només s'imprimeix una sola pàgina i no se si algú sap com fer per al salt de pàgina i s'imprimeixi tot la informació que vull de davant mà moltes gràcies ;)

Comentar