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

Dotnet Discussion :

Imprimer avec un service Windows


Sujet :

Dotnet

  1. #1
    Membre du Club
    Imprimer avec un service Windows
    Bonjour,

    Désolée si la question a déjà été résolue mais j'ai cherché et n'ai pas trouvé.

    Je voudrais juste savoir s'il est possible d'imprimer via un Service Windows développé en VB.Net ?

    Je précise qu'actuellement, il s'agit d'une application Windows Form qui utilise System.Drawing pour imprimer.

    Code VB.NET :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Dim pd As New System.Drawing.Printing.PrintDocument
    AddHandler pd.PrintPage, AddressOf Me.LabelData
    pd.PrinterSettings.PrinterName = xPrinterName
    pd.Print()


    Merci d'avance pour vos réponses.

  2. #2
    Expert éminent sénior
    selon la doc et sa version c'est soit pas possible soit déconseillé, de ce que j'ai vu ca serait surtout sur des vieux os que ca plante
    sur le net y en a qui disent qu'il faut le faire directement avec les dlls de windows, d'autres qu'ils ont juste retiré les fenetre de dialog
    néanmoins sur des tests (sur un server 2016 avec du code wpf je crois) ca fonctionnait très bien, et quelques années avant sur un OS plus vieux et du winforms ca marchait aussi (sans la fenetre d'impression)
    donc ca va être à toi de trancher je pense, le mieux est de faire un test et déjà de réussir à retirer le popup "impression en cours", et de voir si ca tient dans le temps sans faire planter le service

    (...)

    Classes contenues dans le System.Drawing.Printing espace de noms ne sont pas pris en charge pour une utilisation dans un service de Windows ou application ASP.NET ou un service. Tente d’utiliser ces classes à partir d’un de ces types d’application peut générer des problèmes inattendus, tels que la diminution de service les exceptions de performances et d’exécution.
    https://docs.microsoft.com/fr-fr/dot...tframework-4.8


    Classes contenues dans le System.Printing espace de noms ne sont pas pris en charge pour une utilisation dans un service de Windows ou application ASP.NET ou un service. Tente d’utiliser ces classes à partir d’un de ces types d’application peut générer des problèmes inattendus, tels que la diminution de service les exceptions de performances et d’exécution.
    https://docs.microsoft.com/fr-fr/dot...tframework-4.8 (version wpf de l'impression)

    donc pas de doute ms a l'air de dire que techniquement c'est une mauvaise idée
    alors que fonctionnellement parlant c'est quand même pratique
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

  3. #3
    Membre à l'essai
    Bonjour,

    La méthode avec les dll Windows, est-ce que quelqu'un a essayé ? Merci pour vos informations.

  4. #4
    Expert éminent sénior
    sur les forums y a des gens qu'ont l'air de dire que ca fonctionne bien
    après c'est des réponses qui dataient de quelques années je crois
    et puis c'est du gdi, quand on a goûté à l'impression wpf c'est dur de revenir à drawstring et drawline ...
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

  5. #5
    Membre à l'essai
    Bonjour,

    Par rapport à ta demande, j'ai un service avec un code assez similaire au tiens et qui fonctionne, mais est-ce qu'il fonctionnera partout et tout le temps, ça c'est une autre histoire.


    Code VB.NET :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
    Imports System.Timers
    Imports System.Drawing
    Imports System.Drawing.Printing
    Imports System.Printing
     
     
     
     
    Public Class Service2010
     
        Dim TimerX As System.Timers.Timer = New System.Timers.Timer()
     
        Dim pd As New PrintDocument()
     
     
     
        Private Sub pd_PrintPage(sender As Object, ev As System.Drawing.Printing.PrintPageEventArgs)
     
            Try
     
     
                ev.Graphics.DrawString("Hello", New Font("Arial", 80, FontStyle.Bold), Brushes.Black, 150, 125)
     
     
            Catch ex As Exception
                PrintRapport("pd_PrintPage : " & ex.ToString)
            End Try
     
     
        End Sub
     
     
     
        Private Sub OnTimer(sender As Object, e As Timers.ElapsedEventArgs)
     
            Try
     
     
                pd.PrinterSettings.PrinterName = "HP LaserJet"
     
                AddHandler pd.PrintPage, AddressOf Me.pd_PrintPage
     
                pd.Print()
     
     
            Catch ex As Exception
                PrintRapport("OnTimer : " & ex.ToString)
            End Try
     
        End Sub
     
     
        Protected Overrides Sub OnStart(ByVal args() As String)
     
     
            'RequestAdditionalTime(60000) // temps pour le lancement du service
     
     
            TimerX.Enabled = True
            TimerX.Interval = 10000
            AddHandler TimerX.Elapsed, AddressOf Me.OnTimer
            TimerX.Start()
     
     
        End Sub
     
        Protected Overrides Sub OnStop()
     
            TimerX.Enabled = False
     
        End Sub
     
     
     
    End Class


    PrintRapport() est une fonction qui écrit dans un fichier.

    Par contre, j'en profite pour étendre la réflexion, les impressions à la chaîne semblent un sujet flou, quels sont les avis d'experts sur le sujet ?

    Quand on veut faire des impressions évoluées (mise en pages, logo, liaisons avec des bases de données, ruptures, etc) faut-il passer par des logiciels comme Crystal Report ?

    Quand ces impressions se font en automatique selon des paramètres stockés en base de données, il semble intéressant de le faire depuis un serveur et avec un service, car la session ne sera pas toujours ouverte, etc.

    En théorie, un service Windows en C#, VB.NET avec des états Crystal Report qui imprime directement sur des imprimantes réseau, ça semble parfait. Mais dans la pratique ça semble plus compliqué. Il y a des commentaires et des informations qui indique des conflits, des incompatibilités provoquant des dysfonctionnements aléatoires. Qu'en est-il ?

    Pour finir, quelles sont les préconisations pour mettre en oeuvre ce type de projet (impressions à la chaîne de documents avec des données venant de bases de données, pour les sortir sur plusieurs imprimantes réseau dans un contexte d'entreprises) ?