none
Comment faire un saut de page à l'impression ? RRS feed

  • Question

  • Bonjour,

    Je n'arrive pas à obtenir un saut de page sur un texte qui fait plus d'une page, voici mon code :

    Sub ImprimerToolStripMenuItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ImprimerToolStripMenuItem.Click If Len(TextBox1.Text) < 1 Then Exit Sub
    Call traiteTexte() ' traitement de texte
    Dim document = New System.Drawing.Printing.PrintDocument() ' assignation
    '
    AddHandler document.PrintPage, AddressOf Me.document_PrintPage ' appel imp
    '
    document.Print() ' impression
    document.Dispose() ' fermeture
    My.Application.DoEvents()
    TextBox1.Refresh() ' deselecAll
    End Sub
     

    Sub document_PrintPage(ByVal sender As Object, ByVal e As System.Drawing.Printing.PrintPageEventArgs)
    Dim printFont As New Font("Courier New", 12, FontStyle.Regular) ' police
    e.Graphics.DrawString(letexte, printFont, Brushes.Black, 0, 0) ' objet graphique chargé
    End Sub

    Sub traiteTexte()
    Dim i As Integer
    Dim j As Integer
    Dim k As Integer
    Dim reste As Integer
    Dim numPage As Integer = 0
    Dim numeroter As Boolean = True
    Dim maxiSignes As Integer = 75 ' (courier new 12)
    Dim maxiLignes As Integer = 62
    Dim s() As String = Split(TextBox1.Text, vbCrLf, , 1)
    Dim t(UBound(s) * 5) As String
    Dim r As String
    j = 1
    For i = 0 To UBound(s) - 1
    bis: If Len(s(i)) <= maxiSignes Then t(j) = s(i)
    If Len(s(i)) > maxiSignes Then ' coupure
      For k = maxiSignes To 1 Step -1
      If Mid(s(i), k, 1) = " " Then
       t(j) = Mid(s(i), 1, k - 1)
       reste = Len(s(i)) - k
       s(i) = Trim(Mid(s(i), k + 1, reste))
       j = j + 1
       GoTo bis
      End If
      Next k
    End If
    j = j + 1
    Next i
    letexte = ""
    numPage = 1
    k = 1
    For i = 1 To j - 1
    letexte = letexte & t(i) & vbCrLf
    k = k + 1
    Select Case numeroter
      Case True
      If k = maxiLignes - 2 Then
       letexte = letexte & " " & vbCrLf
       letexte = letexte & " -" & numPage & "-" & vbCrLf
       letexte = letexte & vbFormFeed
       k = 1
       numPage = numPage + 1
      End If
      Case False
      If k = maxiLignes Then
       letexte = letexte & vbFormFeed
       k = 1
      End If
    End Select
    Next i
    End Sub

    En vous remerciant, cordialement.

     



    Joseph Attila PUSZTAY
    EhJoe       Logiciels       Romans       Ecrire
    mardi 5 avril 2011 20:58

Réponses

Toutes les réponses

  • Voir exemple ici :

    http://msdn.microsoft.com/en-us/library/system.drawing.printing.printdocument.print(v=VS.80).aspx

    En .NET, on imprime les pages une par une. À la fin de chaque page (donc en fin de procédure évènement PrintPage), on spécifie s'il y a d'autre pages à imprimer avec la propriété HasMorePage du paramètre de type PrintPageEventArgs. Cela provoque un nouvel évènement PrintPage.

    mercredi 6 avril 2011 05:13
  • Bonjour Foleide,

    J'ai enfin réussi après environ six heures de recherches (dont le traitement de la coupure du texte) et d'utilisation des réponses à mes deux questions, mais j'ai encore des questions, si tu sais y répondre ? (mon code suivra) :

     

    -1- Ne peut-on mettre tout dans la même procédure (voir le code) ?

     

    -2- Je ne comprends pas les rôles de

    e.Graphics.DrawString(blocTexte, printFont
    
    document.Print()
    
    

    On passe à la matrice graphique une dessin qui pour nous est du texte, mais à ce stade cette matrice dispose de tout, y compris de la source, alors pourquoi n'imprime-t-elle pas dans la foulée, pourquoi devoir lui envoyer une seconde directive indirecte (print) ?

      

    -3- Est-ce qu'il n'y a pas d'autres méthodes (sans passer par word) pour imprimer plus simplement, car là j'ai été obligé de découper une à une les lignes de l'objet qui contenait le texte (textBox), puis de recouper chaque ligne pour la mrger à droite, puis pour imprimer de compter les lignes afin de faire un saut de page (et une numérotation), et encore, je n'ai pas traité l'espace proportionnel de chaque ligne, ni la hauteur de la numérotation.. Enfin, tu vois ce que je veux dire, car s'il faut écrire un traitement de texte à chaque impression c'est pas marrant ?

    Voici schématiquement mon code (en rapport aux questions sus-citées) :

    Sub ecrit()
    
     Dim document = New System.Drawing.Printing.PrintDocument()
    
     ' traitement du texte
    
     ' mise en bloc des lignes
    
     AddHandler document.PrintPage, AddressOf Me.document_PrintPage
    
     document.Print()
    
    End Sub
    
    '
    
    '
    
    Sub document_PrintPage(ByVal sender As Object, ByVal e As System.Drawing.Printing.PrintPageEventArgs)
    
     Dim printFont As New Font("Courier New", 12, FontStyle.Regular)
    
     e.Graphics.DrawString(blocTexte, printFont, Brushes.Black, 0, 0)
    
    End Sub
    
    
    
    

    Cordialement.



    Joseph Attila PUSZTAY
    EhJoe       Logiciels       Romans       Ecrire

    • Modifié EhJoe mercredi 6 avril 2011 10:38 modif texte
    mercredi 6 avril 2011 10:32
  • > Bonjour Foleide,
    >
    > J'ai enfin réussi après environ six heures de recherches (dont le
    > traitement de la coupure du texte) et d'utilisation des réponses à mes deux
    > questions, mais j'ai encore des questions, si tu sais y répondre ? (mon
    > code suivra) :
    >
    >
    >
    > -1- Ne peut-on mettre tout dans la même procédure (voir le code) ?
     
    Non, l'impression se fait en asynchrone page par page. L'avantage est de
    ne pas figer l'interface pendant le dialogue avec l'imprimante.
     
    > -2- Je ne comprends pas les rôles de
    >
    >
    > [code]
    > e.Graphics.DrawString(blocTexte, printFont
     
    Ecriture du texte *en mode graphique*.
     
    > document.Print()
     
    Lancer le processus d'impression.
     
    >
    > [/code]
    >
    > On passe à la matrice graphique une dessin qui pour nous est du texte, mais
    > à ce stade cette matrice dispose de tout, y compris de la source, alors
    > pourquoi n'imprime-t-elle pas dans la foulée, pourquoi devoir lui envoyer
    > une seconde directive indirecte (print) ?
     
    Pas sûr de bien comprendre. On n'imprime pas comme sur une imprimante
    matricielle texte. On *dessine* sur la page. D'où le traitement orienté
    page. On peut très bien dessiner l'en-tête après le pied de page par
    exemple. Ou faire du graphisme autre que du texte.
     
    > -3- Est-ce qu'il n'y a pas d'autres méthodes (sans passer par word) pour
    > imprimer plus simplement, car là j'ai été obligé de découper une à une les
    > lignes de l'objet qui contenait le texte (textBox), puis de recouper chaque
    > ligne pour la mrger à droite, puis pour imprimer de compter les lignes afin
    > de faire un saut de page (et une numérotation), et encore, je n'ai pas
    > traité l'espace proportionnel de chaque ligne, ni la hauteur de la
    > numérotation.. Enfin, tu vois ce que je veux dire, car s'il faut écrire un
    > traitement de texte à chaque impression c'est pas marrant ?
     
    L'exemple me paraît explicite et de plus bien écrit. Il y a juste à
    remplacer le StreamReader par un StringReader initialisé avec le texte à
    imprimer.
     > Voici schématiquement mon code (en rapport aux questions sus-citées) :
    >
    >
    > [code]
    > Sub ecrit()
    >
    >   Dim document = New System.Drawing.Printing.PrintDocument()
    >
    >   ' traitement du texte
    >
    >   ' mise en bloc des lignes
    >
    >   AddHandler document.PrintPage, AddressOf Me.document_PrintPage
    >
    >   document.Print()
    >
    > End Sub
    >
    > '
    >
    > '
    >
    > Sub document_PrintPage(ByVal sender As Object, ByVal e As
    > System.Drawing.Printing.PrintPageEventArgs)
    >
    >   Dim printFont As New Font("Courier New", 12, FontStyle.Regular)
    >
    >   e.Graphics.DrawString(blocTexte, printFont, Brushes.Black, 0, 0)
    >
    > End Sub
    >
     
    Je ne vois pas l'utilisation du HasMorePage ?
     --
    Fred
    foleide@free.fr
     
    mercredi 6 avril 2011 11:18
  •  > Il y a juste à
    > remplacer le StreamReader par un StringReader initialisé avec le texte à
    > imprimer.
     
    Non, j'ai oublié la gestion des lignes trop longues qui n'est pas faite.
    Utilisez Graphics.MeasureString pour éventuellement couper et générer
    plusieurs lignes.
     --
    Fred
    foleide@free.fr
     
    mercredi 6 avril 2011 11:28
  • Merci

    Joseph Attila PUSZTAY
    EhJoe       Logiciels       Romans       Ecrire
    • Marqué comme réponse EhJoe mercredi 6 avril 2011 13:11
    mercredi 6 avril 2011 13:11