Impression d'un document word ou pdf

Description

Bonjour à tous,
Ce code va vous permetre d'imprimer des document Word ou PDF en tache de fond.
Et oui c'est un Contrôle ActiveX, vous pouver l'appeler appartir d'une page Web avec une fonction javaScript en lui passant comme paramète le chemin du fichier à imprimer.
Conseil: Pour intéger des composant ActiveX utilisé un logiciel fourni gratuitement par microsoft, son nom Microsoft ActiveX Control Pad.
Au faite vous allé avoir besoin d'un controle Timer...

Source / Exemple :


'utilisé pour word
Dim docword As New Word.Application

Private Declare Function ShellExecute Lib "shell32.dll" Alias "ShellExecuteA" (ByVal hwnd As Long, ByVal lpOperation As String, ByVal lpFile As String, ByVal lpParameters As String, ByVal lpDirectory As String, ByVal nShowCmd As Long) As Long
'Permet de fermer la fenetre
Private Declare Function PostMessage Lib "user32.dll" Alias "PostMessageA" (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long

' La fonction GetParent recherche le handle du parent propriétaire de la fenêtre indiquée.
Private Declare Function GetParent Lib "user32" (ByVal hwnd As Long) As Long

' La fonction GetWindow recherche le handle de la fenêtre active
Private Declare Function GetWindow Lib "user32" (ByVal hwnd As Long, ByVal wCmd As Long) As Long

' La fonction GetWindowTextLength recherche la longueur, en caractères, du texte de barre du titre de la fenêtre indiquée (si la fenêtre a une barre de titre). Si la fenêtre indiquée est une commande, la fonction recherche la longueur du texte dans la commande.  Cependant, GetWindowTextLength ne peut pas rechercher la longueur du texte d'une commande d'édition dans une autre application.
Private Declare Function GetWindowTextLength Lib "user32" Alias "GetWindowTextLengthA" (ByVal hwnd As Long) As Long

' La fonction GetWindowText copie le texte de la barre du titre de la fenêtre indiquée (si elle a un) dans un buffer. Si la fenêtre indiquée est une commande, le texte de la commande est copié. Cependant, GetWindowText ne peut pas rechercher le texte d'une commande dans une autre application.
Private Declare Function GetWindowText Lib "user32" Alias "GetWindowTextA" (ByVal hwnd As Long, ByVal lpString As String, ByVal cch As Long) As Long

'La fonction FindWindow va permettre de retouver un Handle afin de pouvoir fermet la tache Acrobat Reader
Private Declare Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As Long

Private docPdf As Boolean
Private Const GW_HWNDFIRST = 0
Private Const GW_HWNDNEXT = 2
'Je ne sais pas vraiment ce que ca contrôle mais c'est présent sur tout les windows.
'Grace à ce "Shell_TrayWnd" windows va nous retourner son handle qui sera bien pretique
Private Const monSuperHandle = "Shell_TrayWnd"

Public Sub GoImprime(unChemin As String)
'teste permettant de savoir si le fichier est un RTF ou un PDF

Dim teste As String
teste = UCase$(Right$(unChemin, 3))

If teste = "PDF" Then
    Dim Retour As Long
    docPdf = True
    
    'la fonction ShellExecute va ouvrir l'application adapté à l'extention et le paramètre Print va permetre d'imprimer, l'application sara ensuite fermé
    Retour = ShellExecute(hwnd, "print", unChemin, vbNullString, vbNullString, 1)
    'mise en route du timer
    Timer1.Enabled = True
    
      '150 miliseconde avant la fermeture de word
    Timer1.Interval = 150
       
    Else
    docPdf = False
    'Création d'une instance de WinWord
    Set docword = CreateObject("word.application")
    'True pour word visible et false pour le mettre en arrière plan
    'en gros fals va permètre d'ouvrir WinWord en tache de fond
        docword.Visible = False
    
        docword.DisplayAlerts = False    'évite les erreurs de traitement
    
        'ouverture du document, sans la sélection du type de selui-ci
      doc = docword.Documents.Open(unChemin, 0)
      'impression de celui ci
      docword.ActiveDocument.PrintOut
    
    'mise en route du timer
    Timer1.Enabled = True
    
      '10 sec avant la fermeture de word
    Timer1.Interval = 1000
   
End If

End Sub

Private Sub Timer1_Timer()

If docPdf = True Then

'cette partit de code à été récupéré je l'ai un tout petit peut modifié
'la source de ce code http://www.vbfrance.com/article.aspx?ID=5188
        Dim CurrWnd As Long
        Dim Parent As Long
        Dim Length As Long
        Dim NomTache As String
        Dim NomAAR As String
        ' Handle de la fenetre active
        'pourquoi un findWindow???
        'Je sais pas si vous avez déja de récupérer un handle depuis un Controle ActiveX
        'c'est pas gagné, c'est pour cela qu'ici on récupère le Handle d'un composant toujours
        'présent dans windows
        CurrWnd = GetWindow(FindWindow(monSuperHandle, vbNullString), GW_HWNDFIRST)
        While CurrWnd <> 0
        ' On prend la fenetre mere de l'application
        Parent = GetParent(CurrWnd)
        Length = GetWindowTextLength(CurrWnd)
        NomTache = Space$(Length + 1)
        Length = GetWindowText(CurrWnd, NomTache, Length + 1)
        ' Ici on a le nom de la fenetre qui apparait dans la barre du CTRL+ALT+SUPP
        NomTache = Left$(NomTache, Len(NomTache) - 1)
        
        If NomTache <> "" Then
           'récupération d'une partie du nom du processus.
            NomAAR = Left$(NomTache, 14)
            'on recherche un certain processus afin de récupérer son handle
            If NomAAR = "Acrobat Reader" Then
                'on ferme l'application
                  reSultat = PostMessage(CurrWnd, 16, vbNull, vbNull)
            End If
        End If

        CurrWnd = GetWindow(CurrWnd, GW_HWNDNEXT)
        
        DoEvents
        Wend

Else
'estinction du timer
     Timer1.Enabled = False
'fermeture de word
     docword.Application.Quit (0)
End If

End Sub

Conclusion :


Faite Un copier collé dans un nouveau projet Controle ActiveX dans Vb.
Ici j'ai utilisé Vb6

Codes Sources

A voir également

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.