1. #1
    Nouveau Candidat au Club
    Homme Profil pro
    Passionné
    Inscrit en
    octobre 2017
    Messages
    2
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Luxembourg

    Informations professionnelles :
    Activité : Passionné

    Informations forums :
    Inscription : octobre 2017
    Messages : 2
    Points : 1
    Points
    1

    Par défaut Petit problème d'impression

    Bonjour à tous,

    Je suis un amateur cherchant à programmer pour le plaisir un petit traitement de texte lié à des mises en page automatisées pour éviter l'emploi de papier préimprimé.

    A l'aide de l'objet graphics, j'ai donc programmé un papier à lettre incluant logo, adresse de société, date, références, ... Toute cette partie fonctionne très bien.

    Je cherche donc à récupérer le contenu d'un textbox et à l'imprimer à un endroit précis de la feuille (x:30, y:420) en tenant compte du fait que ce contenu peut être volumineux.

    J'ai bien récupéré le code fourni par Microsoft qui permet de mesurer la chaine pour l'imprimer en tenant compte des réglages de l'imprimante soit:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
                Dim charactersOnPage As Integer = 0
                Dim linesPerPage As Integer = 0
     
                g.MeasureString(My.Settings.TexteCourant, F, e.MarginBounds.Size, StringFormat.GenericTypographic, charactersOnPage, linesPerPage)
                g.DrawString(My.Settings.TexteCourant, F, Brushes.Black, e.MarginBounds, StringFormat.GenericTypographic)
                My.Settings.TexteCourant = My.Settings.TexteCourant.Substring(charactersOnPage)
    Lequel code fonctionne parfaitement mais, à priori, 1) sans me donner la possibilité de positionner le texte là où je le souhaite 2) sans me permettre de définir exactement le rectangle correspondant à la zone d'impresssion.

    Il existe une difficulté supplémentaire: La mise en page des pages supplémentaires est différente de la mise en page de la première page: Les coordonnées XY et la taille du rectangle sont différentes.

    Je chercherais également à justifier le texte, mais cela peut passer au second plan.

    Je serais très reconnaissant si quelqu'un accedpterait de m'apporter un peu d'aide et de me faire bénéficier de son expérience.

    Je vous remercie tous du fond du coeur

    Fabrice

  2. #2
    Membre expert
    Homme Profil pro
    Développeur .NET
    Inscrit en
    novembre 2009
    Messages
    1 423
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 28
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : novembre 2009
    Messages : 1 423
    Points : 3 279
    Points
    3 279

    Par défaut

    Le paramètre e.MarginBounds.Size détermine la taille du rectangle où le texte va s'afficher et e.MarginBounds le rectangle lui même.


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Dim nouveauRectangle As Rectangle
    nouveauRectangle = Rectangle.Inflate(e.MarginBound, -30, -420)
    et donc remplace e.MarginBound par nouveauRectangle.

    J'ai pas testé, je ne sais pas dans quel direction le "Inflate" s'effectue, il faut donc peut être décaller le rectangle à la suite via la méthode
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    nouveauRectangle.Offset(30,420)
    Si tu veux un comportement différent en fonction de la page il te faut une variable au niveau de ta class que tu vas initaliser lorsque tu lances l'impression puis tu incrémentes à chaque appel de printDocument1_PrintPage, puis tu modifies ton comportement en fonction de ton compteur.

    Mais sinon de manière générale l'impression est assez galère à gérer, tu devrais jeter un oeil à aux templates word qui pourrait etre plus simple (peut etre avec https://github.com/xceedsoftware/DocX ).

  3. #3
    Membre expert
    Inscrit en
    avril 2008
    Messages
    1 966
    Détails du profil
    Informations personnelles :
    Âge : 57

    Informations forums :
    Inscription : avril 2008
    Messages : 1 966
    Points : 3 378
    Points
    3 378

    Par défaut

    bonjour

    Lequel code fonctionne parfaitement mais, à priori, 1) sans me donner la possibilité de positionner le texte là où je le souhaite 2) sans me permettre de définir exactement le rectangle correspondant à la zone d'impression
    Comme dit par micka132 ,e.MarginsBounds joue un grand rôle dans l'impression ...

    Question 1: l'abscisse du Rectangle de "Layout" démarre pour chaque Page relativement à :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
     e.MarginBounds.Top
    Question 2 : la version de Drawstring qui utilise un Rectangle de "Layout" ou Présentation permet de résoudre cette difficulté ...
    Ce rectangle est "merveilleux" dans la mesure ou il fait lui-même les sauts de ligne nécessaire mais il exige d'utiliser sa hauteur comme hauteur d'interligne dans le cas du texte quelconque sans retour à la ligne...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
      Dim sizeLine As SizeF = gr.MeasureString(line, printFont, e.MarginBounds.Width)
     Dim layoutRect As RectangleF = New RectangleF(leftMargin, yPos, sizeLine.Width, sizeLine.Height)
    Le code exemple .vb qui suit illustre cette approche dans le cas d'un fichier texte quelconque(fichier texte ci-joint) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
     
    Public Class Form3
        Private fileName As String = String.Empty
        Private printFont As Font
        Private streamToPrint As StreamReader
        Private Sub printButton_Click(sender As System.Object, e As System.EventArgs) Handles printButton.Click
            fileName = Application.StartupPath + "\TextFile1.txt"
            Try
                streamToPrint = New StreamReader(fileName)
     
                Try
                    printFont = New Font("Arial", 16)
                    Me.PrintPreviewDialog1.Document = Me.PrintDocument1
                    If (Me.PrintPreviewDialog1.ShowDialog = Windows.Forms.DialogResult.OK) Then
                        Me.PrintDocument1.Print()
                    End If
                    'TextBox1.Text = streamToPrint.ReadToEnd()
                Finally
                    streamToPrint.Close()
                End Try
            Catch ex As Exception
                MessageBox.Show(ex.Message)
            End Try
     
        End Sub
     
     
     
        Private Sub PrintDocument1_PrintPage(sender As System.Object, e As System.Drawing.Printing.PrintPageEventArgs) Handles PrintDocument1.PrintPage
            Dim gr = e.Graphics
            Dim linesPerPage As Single = 0
     
            Dim count As Integer = 0
            Dim leftMargin As Single = e.MarginBounds.Left
            Dim topMargin As Single = e.MarginBounds.Top
            Dim yPos As Single = topMargin
            Dim line As String = Nothing
     
            ' Calculate the number of lines per page.
            linesPerPage = e.MarginBounds.Height / printFont.GetHeight(e.Graphics)
     
     
            ' Print each line of the file.
            While yPos < e.MarginBounds.Bottom
                line = streamToPrint.ReadLine()
                If line Is Nothing Then
                    Exit While
                End If
     
                Dim sizeLine As SizeF = gr.MeasureString(line, printFont, e.MarginBounds.Width) 'mesure la ligne 
                Dim layoutRect As RectangleF = New RectangleF(leftMargin, yPos, sizeLine.Width, sizeLine.Height) 'cree un rectangle Layout dont Largeur=Largeur de ligne
     
                yPos += sizeLine.Height 'incremente la hauteur de ligne (hauteur variable)
     
                gr.DrawString(line, printFont, Brushes.Black, layoutRect)
                gr.DrawRectangle(Pens.Red, Rectangle.Round(layoutRect))
     
     
            End While
     
            ' If more lines exist, print another page.
            If (line IsNot Nothing) Then
                e.HasMorePages = True
            Else
                e.HasMorePages = False
            End If
        End Sub
     
    End Class
    il est inspiré du lien MSDN intitulé "PrintDocument classe" ...
    Ce lien comporte la Remarque importante suivante :
    L’exemple nécessite que chaque ligne corresponde à la largeur de page.

    lien:https://www.google.dz/url?sa=t&rct=j...xWwIVpF_ovqV_N


    Remarque surmontée par cet autre lien lien intitulé "How to: Draw Wrapped Text in a Rectangle"

    lien MSDN:https://www.google.dz/url?sa=t&rct=j...kafAG6pUHtKarg

    Bon code....
    Fichiers attachés Fichiers attachés

  4. #4
    Nouveau Candidat au Club
    Homme Profil pro
    Passionné
    Inscrit en
    octobre 2017
    Messages
    2
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Luxembourg

    Informations professionnelles :
    Activité : Passionné

    Informations forums :
    Inscription : octobre 2017
    Messages : 2
    Points : 1
    Points
    1

    Par défaut

    Bonjour,

    Un grand merci pour votre aide, je vais tester et reviendrai vers vous

    encore une fois merci

    Bonne journée

Discussions similaires

  1. Réponses: 17
    Dernier message: 13/07/2004, 21h37
  2. [Rave] problème d'impression
    Par romstarr dans le forum Rave
    Réponses: 2
    Dernier message: 09/06/2004, 16h48
  3. petit problème premier plan, arrière plan
    Par gros bob dans le forum OpenGL
    Réponses: 4
    Dernier message: 19/04/2004, 13h00
  4. [jointure] Petit problème sur le type de jointure...
    Par SteelBox dans le forum Langage SQL
    Réponses: 13
    Dernier message: 13/02/2004, 19h55
  5. Problème d'impression
    Par IngBen dans le forum C++Builder
    Réponses: 7
    Dernier message: 22/05/2002, 12h37

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo