IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

VB.NET Discussion :

Problème VB.NET, impression multipage PDF


Sujet :

VB.NET

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2020
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2020
    Messages : 4
    Par défaut Problème VB.NET, impression multipage PDF
    Bonjour a tous, j'ai besoin d'aide sur un code en VB, j'ai regardé plusieurs Forum mais aucun ne correspond précisément à mon type de problème.
    Lors d'un clique sur un bouton, un PDF correspondant à un Devis d'un client se génère. Dans ce PDF, j'ai un Entête, le contenu du Devis et un Pied de page.
    Tout s'écrit sur la même page au bon endroit. Seulement, j'aimerai qu'une deuxième page PDF se crée lorsqu'il y a plus de 13 lignes dans le contenu du Devis.
    Je vous ai simplifier mon raisonnement dans le bout de code que je vous donne plus bas.

    Le contenu d'un devis possède deux remplissages possible:

    - Un Ensemble ou plusieurs (composé de sous ensembles) par exemple une "UNITE CENTRALE" avec ses sous ensembles tel que carte mère, RAM,...

    - Des produits

    Je vérifie a chaque fois si je dépasse pas 13 lignes.
    Si je dépasse 13 lignes je veux passer à la page suivante et écrire les lignes restantes.

    Voici le code de la fonction du bouton :

    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
     
     Public Sub btn_devis_pdf_Click()
     
            Try
     
                Dim Verif_Presence As Boolean = False
     
                For Each files As String In My.Computer.FileSystem.GetFiles("Z:\Scan", FileIO.SearchOption.SearchTopLevelOnly)
                    ' FileIO.SearchOption.SearchTopLevelOnly cherche uniquement dans ce dossier en excluant les sous-dossiers
                    Dim Fi As New System.IO.FileInfo(files) ' Instanciation du fichier trouvé
     
                    If (Fi.Name = "devis" & tbx_dev_code.Text & ".pdf") Then
     
                        Verif_Presence = True
                        My.Computer.FileSystem.DeleteFile(files)
     
                    End If
                Next
                Traduction_Impression()
     
                Dim prdoc As New System.Drawing.Printing.PrintDocument()
                prdoc.PrinterSettings.PrinterName = "PDFCreator"
                AddHandler prdoc.PrintPage, AddressOf impression_PDF
                prdoc.DocumentName = "devis" & tbx_dev_code.Text
                Try
                    prdoc.Print()
                    MsgBox("Le fichier PDF a bien été créé et porte le nom : " & "devis" & tbx_dev_code.Text & ".pdf")
                Catch ex As Exception
                    MsgBox("1) Vérifiez que PDFCreator est bien installé sur votre machine." & vbCrLf & "2) Vérifiez dans PDFCreator que l'enregistrement automatique est activé et configuré sur '<Title>'." & vbCrLf & "3) Vérifiez que votre répertoire 'Scan' est accessible.", MsgBoxStyle.Information, "CORTEX-GESTION - Impression PDF")
                End Try
     
            Catch
     
                MsgBox("Veuillez verifier qu'aucun document portant le nom " & "devis" & tbx_dev_code.Text & ".pdf ne soit ouvert et recommencez")
     
            End Try
     
        End Sub

    Code du programme (simplifié)

    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
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
     
    Private Sub impression_PDF(ByVal sender As Object, ByVal ev As System.Drawing.Printing.PrintPageEventArgs)
     
            '***************************
            '* Ecriture en contenu *
            '***************************
            ' ======= RECUPERATION DU NOMBRE DE LIGNES =======
     
            Obj_Command2.CommandText = "SELECT COUNT(*) AS NbreArt FROM LIGNE_DEVIS_CLIENT WHERE DEV_ID = " + tbx_dev_code.Text + ""
            Obj_Reader2 = Obj_Command2.ExecuteReader()
            Obj_Reader2.Read()
     
            Dim commande As String
            commande = Obj_Reader2.Item(0).ToString
     
     
            'Instancier un objet Commande 
            Obj_Command3 = New OleDbCommand()
            'initialiser l'objet Command
            Obj_Command3.Connection() = laConnexionPrincipale
            'requête pour affichage des articles
            Obj_Command3.CommandText = "SELECT COUNT(*) FROM LIGNE_DEVIS_CLIENT, ENSEMBLE, LIGNE_ENSEMBLE WHERE LIGNE_ENSEMBLE.ENS_ID=ENSEMBLE.ENS_ID AND LIGNE_DEVIS_CLIENT.ENS_ID=ENSEMBLE.ENS_ID AND LIGNE_DEVIS_CLIENT.DEV_ID=" + tbx_dev_code.Text + ""
            'MsgBox(Obj_Command3.CommandText)
            Obj_Reader3 = Obj_Command3.ExecuteReader()
            Obj_Reader3.Read()
     
            Dim s_ens As String
            s_ens = Obj_Reader3.Item(0).ToString
     
            onversion String en Integer
            Dim commande1 As Integer
            commande1 = Integer.Parse(commande)
            Dim s_ens1 As Integer
            s_ens1 = Integer.Parse(s_ens)
     
            Nombre de lignes totales
            Dim tot As Integer
            tot = s_ens1 + commande1
     
            'Détermine le nombre de pages
            Dim nbPages As Double = tot / 13
            'Math.Ceiling permet de recupérer l'entier au dessus du double. Par exemple Math.Ceiling(2.54) = 3
            nbPages = Math.Ceiling(nbPages)
            ' ======= FIN DE RECUPERATION DU NOMBRE DE LIGNES =======
     
            'Permet de savoir dans quelle page on se situe
            Dim indexPArcoursPages = 1
            Obj_Reader2.Close()
            Obj_Reader3.Close()
            Dim compteur As Integer = 0
            'Instancier un objet Commande
            Obj_Command = New OleDbCommand()
            'initialiser l'objet Command
            Obj_Command.Connection() = laConnexionPrincipale
            'requête pour affichage des articles
            Obj_Command.CommandText = "SELECT LIGNE_DEVIS_CLIENT.ENS_ID, ENSEMBLE.ENS_REF, ENSEMBLE.ENS_LIB, ENSEMBLE.ENS_TOTAL_HT, ENSEMBLE.ENS_REM, ENSEMBLE.ENS_TVA, ENSEMBLE.ENS_TOTAL_TTC, ENSEMBLE.ENS_QTE FROM LIGNE_DEVIS_CLIENT, ENSEMBLE WHERE LIGNE_DEVIS_CLIENT.ENS_ID=ENSEMBLE.ENS_ID AND DEV_ID=" + tbx_dev_code.Text + ""
            Obj_Reader = Obj_Command.ExecuteReader()
     
     
            Obj_Command3.CommandText = "SELECT ..."
            Obj_ReaderEnsemble= Obj_Command3.ExecuteReader()
     
            While (indexPArcoursPages <= nbPages)
                'PArcours des Ensembles
                While Obj_ReaderEnsemble.Read() And compteur <= 12
                    If (ens <> " ") Then
                        If (compteur = 13) Then
                            compteur = 0
                            Exit While
                        End If
                        compteur = compteur + 1
     
                         'ECRITURE DE L'ENSEMBLE
     
                        Obj_Command1.CommandText = "SELECT ..."
                        Obj_ReaderSousEnsemble = Obj_Command1.ExecuteReader()
     
    			'PArcours des sous ensembles 
                        While Obj_ReaderSousEnsemble.Read() And compteur <= 12
     
    			compteur = compteur + 1  
     
                            'ECRITURE DU SOUS ENSEMBLE DE L'ENSEMBLE
     
                        End While
                        Obj_Reader1.Close()
                  End If
              End While
     
                'Les produits
     
                While Obj_ReaderProduit.Read() And compteur <= 12
     
                    compteur = compteur + 1              
     
                    'ECRITURE DU CONTENU DE TYPE PRODUIT
     
                    If (compteur = 13) Then
                        compteur = 0
                        Exit While
                    End If
     
                End While
     
                'Nous sommes revenu au début
                If compteur = 0 Then
    		'Saut de page pour écrire le reste
                    ev.HasMorePages = True
                    MsgBox("ev.HasMorePages = True -> On passe à une autre page")
                End If
                indexPArcoursPages += 1
            End While
     
            Obj_Reader.Close()
            Obj_Reader3.Close()
    	ev.HasMorePages = False
     
        End Sub
    Merci .

  2. #2
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2020
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2020
    Messages : 4
    Par défaut Autre possibilité
    J'ai réfléchis à une solution qui ferait varier un Y Position suffisamment assez pour passer et écrire dans une autre page.
    Serait-il possible d'opérer comme ça ?

    Parce que dans mon code j'utilisais un HashMorePage pour forcer le saut de page mais cela ne marche pas ou je ne sais pas bien l'utiliser...

  3. #3
    Membre extrêmement actif
    Inscrit en
    Avril 2008
    Messages
    2 573
    Détails du profil
    Informations personnelles :
    Âge : 65

    Informations forums :
    Inscription : Avril 2008
    Messages : 2 573
    Par défaut
    Bonjour

    Tu noies le code d'impression de page de 13 lignes dans le code d’accès aux données que c'est à n'y rien comprendre ,comme beaucoup de posteurs.

    voici un exemple code qui illustre la logique à suivre :
    - il faut un compteur des pages à imprimer
    - connaitre le total des pages à imprimer (à défaut disposer d'un "reader" des pages qui "sait" quand il est en fin de fichier tel que StreamReader ou se le bricoler comme dans l'exemple ci-après)
    - imprimer à chaque fois "treize" ou ce qu'il reste des pages
    - si compteur est inférieur à total => hasmore=true sinon =>hasmore=false.
    Il te revient de séparer ton code d'impression du code d’ accès aux données & de l'adapter à cette logique simple.
    code dur form user:
    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
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
     
    Imports System.Text
     
    Public Class Form2
        Private doc As MyDoc
        Private printFont As Font
        Dim cpteurPage As Integer = 0
        Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) Handles Button1.Click
            doc = New MyDoc
            CreateDocText(doc)
            printFont = New Font("Arial", 10)
            PrintPreviewDialog1.Document = PrintDocument1
            PrintPreviewDialog1.ShowDialog()
     
     
        End Sub
        Private Sub CreateDocText(dc As MyDoc)
            Dim s As String = String.Empty
            For nbLines As Integer = 0 To 59
                s = nbLines.ToString() + " - aliba est les 40 voleurs"
                s += Environment.NewLine
                Dim line As New Line(s)
                dc.Lines.Add(line)
     
            Next
        End Sub
        Private Sub PrintDocument1_PrintPage(sender As System.Object, ev As System.Drawing.Printing.PrintPageEventArgs) Handles PrintDocument1.PrintPage
            Dim lignesParPage As Integer = 26
            Dim yPos As Single = 0
     
            Dim leftMargin As Single = ev.MarginBounds.Left
            Dim topMargin As Single = ev.MarginBounds.Top
            Dim ligne As String = Nothing
            ' Calculate the number of lines per page.
            'linesPerPage = ev.MarginBounds.Height / printFont.GetHeight(ev.Graphics)
     
            Dim cpteurInterligne As Integer = 1
            ' Print each line of the file.
            Dim intervalPage As Integer = cpteurPage + lignesParPage
            If intervalPage > doc.Lines.Count - 1 Then
                intervalPage = doc.Lines.Count - 1
            End If
            For i As Integer = cpteurPage To intervalPage
                ligne = doc.GetNextLine(i).Text
                If ligne Is Nothing Then
                    Exit For
                End If
                yPos = topMargin + cpteurInterligne * printFont.GetHeight(ev.Graphics)
                ev.Graphics.DrawString(ligne, printFont, Brushes.Black, leftMargin, yPos, New StringFormat())
                cpteurPage += 1
                cpteurInterligne += 1
            Next
     
            ' If more lines exist, print another page.
            If (intervalPage = doc.Lines.Count - 1) Then
                ev.HasMorePages = False
            Else
                ev.HasMorePages = True
            End If
     
        End Sub
     
     
    End Class
    Public Class MyDoc
        Public Property Lines As List(Of Line)
        Public Function GetNextLine(index As Integer) As Line
            If index > Lines.Count - 1 Then
                Return Nothing
            Else
                Return Lines(index)
            End If
        End Function
        Public Sub New()
            Lines = New List(Of Line)
        End Sub
    End Class
    Public Class Line
        Public Property Text As String
        Public Sub New(iText As String)
            Text = iText
        End Sub
    End Class
    bon pensum d'impression car l'impression est un pensum....

  4. #4
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2020
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2020
    Messages : 4
    Par défaut Reprendre à zéro
    Bonjour a tous,

    Premièrement merci d'avoir répondu a mon message MABROUKI, je suis désolé pour le code, je viens de reprendre le code d'un ancien stagiaire, je vais tout reprendre a zéro du coup pour mieux comprendre.
    Je veux écrire "Bonjour" sur 4 pages pour voir et observer comment chaque éléments marchent.
    mon code :

    Premièrement j'ai créé une variable

    Private laPage as Integer = 1
    Private nbPagesTot as Integer = 4

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
            While (laPage <= nbPagesTot)
                ev.Graphics.DrawString("Bonjour " + laPage.ToString, title2, Brushes.Black, xpos + largeurcol + 165, ypos + 147)
                If (laPage = nbPagesTot) Then
                    ev.HasMorePages = False
                    Exit While
                End If
                If (laPage < nbPagesTot) Then
                    ev.HasMorePages = True
                End If
                laPage += 1
            End While
    Seulement, ce code la est sensé écrire
    "Bonjour 1" sur la première page
    "Bonjour 2" sur la deuxième, etc.. jusqu'a 4.

    Ce code me fait une page et superpose tous les bonjour...
    Quelqu'un peut-il m'aider à comprendre s'il vous plait.

    Merci d'avance ! :p

  5. #5
    Expert éminent Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 202
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 202
    Par défaut
    l'event printpage est levé pour la 1ère page
    le paramètre e contient entre autre la conf de la page, mais aussi HasMorePages qui est à mettre à true avant la fin de la méthode si l'on souhaite une nouvelle page après celle ci
    si c'est le cas l'event est à nouveau levé pour la page suivante
    par contre on est dans la même portion de code, aussi c'est à toi de n'imprimer que ce qui appartient à la page

    en général on a des données (collection typiquement) dans une variable de la classe, et on enregistre où on en est dans une autre variable, ce qui permet de reprendre une boucle là où on s'était arreté
    (et quand on arrive en bas de page (c'est à toi de mesurer aussi) on arrête de boucler et s'il reste des choses à imprimer on met HasMorePages à true)
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

  6. #6
    Membre extrêmement actif
    Inscrit en
    Avril 2008
    Messages
    2 573
    Détails du profil
    Informations personnelles :
    Âge : 65

    Informations forums :
    Inscription : Avril 2008
    Messages : 2 573
    Par défaut
    bonjour
    Dans l'event printpage(photocopier qui ronfle)=>c'est un peu le préposé au photocopieur qui:
    1/ compte le nbre page( laPage) à photocopier
    2/ verifie laPage<=nbPagesTot
    Ce préposé c'est à toi de programmer ce qu'il doit faire.
    TON CODE REVU.
    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
     
    'dans l'event printpage(photocopier qui ronfle)=>c'est un peu le preposé au photocopieur qui:
    '1/ compte le nbre page( laPage) à photocopier 
    '2/ verifie  laPage<=nbPagesTot
    Public Class Form3
        Private laPage As Integer = 1
        Private nbPagesTot As Integer = 4
        Dim ligne As String = "Boujour Karl"
        Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) Handles Button1.Click
            PrintPreviewDialog1.Document = PrintDocument1
            PrintPreviewDialog1.ShowDialog()
        End Sub
     
        Private Sub PrintDocument1_PrintPage(sender As System.Object, e As System.Drawing.Printing.PrintPageEventArgs) Handles PrintDocument1.PrintPage
            'JE VEUX UNE  PAGE DE 2 LIGNES
            Dim lignesParPage As Integer = 2
            Dim yPos As Single = 50.0F
            Dim xPos As Single = 50.0F
     
     
            'boucle qui imprime chaque page
            For i As Integer = 1 To lignesParPage
                Using title2 As New Font("arial", 14.0F)
                    e.Graphics.DrawString("Bonjour " + laPage.ToString,
                                     title2,
                                     Brushes.Black,
                                     xPos,
                                     yPos + 147)
                End Using
                yPos += 147 'saut de ligne de 147
     
            Next
            laPage += 1 'JE COMPTE LES PAGES (DE 2 LIGNES)
            e.HasMorePages = laPage <= nbPagesTot 'JE VERIFIE SI J'AI TERMINE
     
     
        End Sub
     
    End Class
    Bon code...

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [XL-2013] Problème Zone d'impression Enregistrement PDF
    Par Almeyric dans le forum Macros et VBA Excel
    Réponses: 7
    Dernier message: 15/01/2016, 13h46
  2. problème d'impression de pdf
    Par katwes dans le forum C#
    Réponses: 2
    Dernier message: 25/08/2008, 16h31
  3. [Crystal][VB.NET] Problème d'export vers un PDF
    Par fumesec dans le forum SDK
    Réponses: 1
    Dernier message: 07/07/2006, 14h09
  4. [Crystal][VB.NET] Problème d'export vers un PDF
    Par fumesec dans le forum Windows Forms
    Réponses: 1
    Dernier message: 07/07/2006, 14h04
  5. [VB.NET]Problème de telechargement de fichier pdf
    Par silatchom dans le forum ASP.NET
    Réponses: 8
    Dernier message: 10/04/2006, 10h33

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