Impression de fichiers HTML via ExecWB et modification des Headers et Footers

Résolu
denler Messages postés 11 Date d'inscription mardi 7 décembre 2004 Statut Membre Dernière intervention 27 juin 2008 - 26 juin 2008 à 14:57
denler Messages postés 11 Date d'inscription mardi 7 décembre 2004 Statut Membre Dernière intervention 27 juin 2008 - 27 juin 2008 à 21:38
Bonjour à tous,

je suis débutant (+) en VB.net, et je cherche à imprimer une page HTML avec VB.net.

Après une petite recherche, j'ai produit le code suivant qui fonctionne:

<hr size="2" width="100%" />
Imports SHDocVw 'c:\windows\system32\shdocvw.dll

    Public Sub doPrint()

        Dim TargetP As String = "c:\Temp\test.html"'ce que je veux imprimer
        PrintFiles = New InternetExplorer 'Ouvre une instance d'internet explorer
        PrintFiles.Navigate(TargetP) 'Ouvre la page que l'on veut imprimer
        PrintFiles.Visible = False 'La fenêtre IE n'est pas affichée
        PrintFiles.Silent = True 'Pas de messages retournés

        PrintFiles.PutProperty("Print_Background", "yes") 'Imprimera les images et couleurs de fond

        Do While (PrintFiles.Busy = True) 'on s'assure que la page soit chargée avant d'imprimer
            System.Threading.Thread.Sleep(100) 'pause code de 100ms
        Loop

        PrintFiles.ExecWB(OLECMDID.OLECMDID_PRINT, OLECMDEXECOPT.OLECMDEXECOPT_DONTPROMPTUSER, vbNullString, vbNullString) 'Imprime le fichier, ne montre pas la boite de dial d'impression

    End Sub

<hr size="2" width="100%" />
Le problème est le suivant : Je ne veux pas d'entête, ni de pied de page. Il faut donc utiliser les paramètres (position 3 dans la commande ExecWB). J'ai bien trouvé une solution en charchant sur le web (Ici), mais cette solution traite le problème en C++ (langue que je ne connais pas).

Est-ce que quelqu'un qui connait le C++, et le VB.NET peut m'éclairer sur ce problème. A première vue, je ne suis pas le premier à rencontrer ce problème, mais je n'ai trouvé aucun post sur le net contenant une solution valable.

Merci d'avance

19 réponses

gillardg Messages postés 3275 Date d'inscription jeudi 3 avril 2008 Statut Membre Dernière intervention 14 septembre 2014 2
27 juin 2008 à 19:24
deux reins
3
denler Messages postés 11 Date d'inscription mardi 7 décembre 2004 Statut Membre Dernière intervention 27 juin 2008
27 juin 2008 à 21:33
J'arrive maintenant à imprimer sans les entêtes, sans avoir besoin de créer de webbrowser, en utilisant la fonction Execwb
Voici donc le code final pour ceux qui en auront besoin :
<hr size= "2" width="100%" />
avant les procédures :
Imports SHDocVw 'c:\windows\system32\shdocvw.dll

la procédure :

Public Sub doPrint()

        Dim TargetP As String = "http://google.fr" 'ce que je veux imprimer
        Dim hkey_path As String = "Software\Microsoft\Internet Explorer\PageSetup"
        Dim hkey_key As String
        Dim key As Microsoft.Win32.RegistryKey

        key = Microsoft.Win32.Registry.CurrentUser.CreateSubKey(hkey_path)
        hkey_key = "header" 'pour l'entête de page
        key.SetValue(hkey_key, "") 'chaine nulle = pas d'entête
        hkey_key = "footer" 'pied de page
        key.SetValue(hkey_key, "") 'idem

        PrintFiles = New InternetExplorer 'Ouvre une instance d'internet explorer
        PrintFiles.Navigate(TargetP) 'Ouvre la page que l'on veut imprimer
        PrintFiles.Visible = True 'La fenêtre IE n'est pas affichée
        PrintFiles.Silent = True 'Pas de messages retournés

        PrintFiles.PutProperty("Print_Background", "yes") 'Imprimera les images et couleurs de fond

        Do While (PrintFiles.Busy = True) 'on s'assure que la page soit chargée avant d'imprimer
            System.Threading.Thread.Sleep(100) 'pause code de 100ms
        Loop

        'on imprime (ici en affichant la boite de dialogue d'impression
        PrintFiles.ExecWB(OLECMDID.OLECMDID_PRINT, _
        OLECMDEXECOPT.OLECMDEXECOPT_DODEFAULT, vbNullString, vbNullString)

    End Sub
<hr size="2" width="100%" />
Merci Guillardg pour ton aide.
3
gillardg Messages postés 3275 Date d'inscription jeudi 3 avril 2008 Statut Membre Dernière intervention 14 septembre 2014 2
26 juin 2008 à 15:49
ton code n'est pas du vbnet !
0
denler Messages postés 11 Date d'inscription mardi 7 décembre 2004 Statut Membre Dernière intervention 27 juin 2008
26 juin 2008 à 16:17
Je sais pas, j'utilise Visual basic 2005 Express, et le code fonctionne.
Je pensais que c'était ça du VB.NET...
C'est quoi alors le VB.NET ?

Merci de m'éclairer !
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
gillardg Messages postés 3275 Date d'inscription jeudi 3 avril 2008 Statut Membre Dernière intervention 14 septembre 2014 2
26 juin 2008 à 16:31
Imports SHDocVw 'c:\windows\system32\shdocvw.dll 
?????????????????????????????????????????????????????????

fais un projet met un web browser dessus 


applele le WebBrowser1


et ajoute ceci




Private








Enum

ExecOLECMDID_OPTICAL_ZOOM = 63

OLECMDID_PRINT = 6



End





Enum








Private





Enum

ExecOptOLECMDEXECOPT_DODEFAULT = 0

OLECMDEXECOPT_PROMPTUSER = 1

OLECMDEXECOPT_DONTPROMPTUSER = 2

OLECMDEXECOPT_SHOWHELP = 3



End





Enum



Sub




zoomit()



Try








Dim

Res


As





Object

=


Nothing








Dim

MyWeb


As





Object


MyWeb =





Me

.WebBrowser1.ActiveXInstanceMyWeb.ExecWB(Exec.OLECMDID_OPTICAL_ZOOM, _

ExecOpt.OLECMDEXECOPT_DONTPROMPTUSER, 50, IntPtr.Zero)



Catch

ex


As

ExceptionMsgBox(



"Error:"

& ex.Message)



End





Try








End





Sub












Sub

printit()



Dim

TargetP


As





String

=


"c:\Temp\test.html"





'ce que je veux imprimer


PrintFiles =





Me

.WebBrowser1.ActiveXInstance


'Ouvre une instance d'internet explorer


PrintFiles.Navigate(TargetP)





'Ouvre la page que l'on veut imprimer


PrintFiles.ExecWB(Exec.OLECMDID_PRINT, OLECMDEXECOPT_DONTPROMPTUSER, vbNullString, vbNullString)





'Imprime le fichier, ne montre pas la boite de dial d'impression








End





Sub


 
0
denler Messages postés 11 Date d'inscription mardi 7 décembre 2004 Statut Membre Dernière intervention 27 juin 2008
26 juin 2008 à 18:14
Merci pour ta réponse.
j'ai ajouter "Imports SHDocVw" au début de mon code afin d'utiliser les fonctions suivantes:
 - PrintFiles = New InternetExplorer
 - OLECMDID.xxxxx

En créant Printfiles comme 'New internetExplorer', je n'ai pas à créer de webBrowser (l'utilisateur final n'a pas besoin de voir cette page, il veux juste l'imprimer).

Ton code fait à quelques variantes près ce que je suis arrivé à faire jusqu'à maintenant.

En revanche, il ne résoud pas mon problème, qui est de faire passer des arguments dans  '



PrintFiles.ExecWB(Exec.OLECMDID_PRINT, OLECMDEXECOPT_DONTPROMPTUSER, vbNullString, vbNullString)',


et remplacer les vbNullString  afin que l'impression se fasse sans que l'on imprime les entêtes et pieds de page. Je sais que c'est possible (j'ai trouvé un exemple, mais en C++), et le C++, je connais pas ! (voir premier message).





Désolé de te faire passer autant de temps sur un problème qui je le suppose est tout con...
0
gillardg Messages postés 3275 Date d'inscription jeudi 3 avril 2008 Statut Membre Dernière intervention 14 septembre 2014 2
26 juin 2008 à 18:50
après un essai d'impression je te signale que mon code imprime et que je n'ai ni en tête ni pied de page
0
denler Messages postés 11 Date d'inscription mardi 7 décembre 2004 Statut Membre Dernière intervention 27 juin 2008
26 juin 2008 à 23:02
Rebonjour,
Désolé d'être insistant, mais quand j'utilise ton code, les entêtes et pieds de page sont toujours présents:

Titre page                     Page x sur y

url site                           date

Quand tu imprimes une page web, par défaut dans IE, imprimes-tu ces entêtes et pied de page aussi ? Je sais que si, manuellement, je vais dans les paramètres IE, je peux enlever les entêtes et pieds de pages. Le problème c'est que je veux le faire ponctuellement et automatiquement...

Petite question sur ton code :
Je ne comprends pas l'intérêt de ta sub ZoomIt, peux-tu me l'expliquer ?
J'obtiens un message d'erreur quand j'exécute cette sub : "trying to revoke a drop target that has not been registred" (je vois pas ce que le drag/drop vient faire ici... Le code erreur est mal interprété ?...)

Merci d'avance
0
gillardg Messages postés 3275 Date d'inscription jeudi 3 avril 2008 Statut Membre Dernière intervention 14 septembre 2014 2
26 juin 2008 à 23:21
mon code fonctionne avec un objet WebBrowser.
zoomit permet de zoomer à 50% une page html affichée dans ce contrôle.
pour les entetes et pieds de page cherche ou IE stocke les valeurs (registre??)
tu les enlèves et tu les remets après ton impression et le tour est joué .
0
denler Messages postés 11 Date d'inscription mardi 7 décembre 2004 Statut Membre Dernière intervention 27 juin 2008
27 juin 2008 à 15:37
Bonjour Gillardg,

Désolé de revenir sur ton code, mais il ne fonctionne vraiment pas chez moi.
Ta sub Printit() ne fonctionne pas :
- printfiles n'est pas déclaré --> je le déclare en tant qu'object
- j'ai ensuite une erreur à la ligne PrintFiles.Navigate(TargetP)
- j'ai du rajouter ExecOpt. à la ligne suivante pour pouvoir lancer le programme

Je ne sais pas comment corriger le second problème...

Merci
0
gillardg Messages postés 3275 Date d'inscription jeudi 3 avril 2008 Statut Membre Dernière intervention 14 septembre 2014 2
27 juin 2008 à 15:41
si tu utilises vb 2005 , tu crées un nouveau projet et tu y colle un contrôle WebBrowser que tu appelles WebBrowser1
à l'éxecution il peut être invisible ce n'est pas important
0
denler Messages postés 11 Date d'inscription mardi 7 décembre 2004 Statut Membre Dernière intervention 27 juin 2008
27 juin 2008 à 15:51
c'est exactement ce que je fais...

Je comprends pas ce qui déconne.
0
gillardg Messages postés 3275 Date d'inscription jeudi 3 avril 2008 Statut Membre Dernière intervention 14 septembre 2014 2
27 juin 2008 à 16:37
éssaies ce lien car chez moi tout fonctionne bien http://cjoint.com/?gBqKddhkoh
0
denler Messages postés 11 Date d'inscription mardi 7 décembre 2004 Statut Membre Dernière intervention 27 juin 2008
27 juin 2008 à 18:07
Effectivement, le code que tu viens de me faire parvenir fonctionne.

J'arrive bien à imprimer (comme ça a toujours été le cas), mais les entêtes et pieds de page sont toujours présents....

je sais qu'il faut rentrer des paramètres dans la fonction Execwb (en 3eme position) pour ne plus avoir ces têtes et pieds de page. Le problème, c'est quels paramètres et quelle syntaxe ?

Suivant tes conseils, j'ai bien essayé le coup de changer les valeurs de la base de registre (HKEY_current_user\Software\Micosoft\Internet Explorer\Pagesetup\), mais on n'a pas les autorisations pour le faire à partir d'un logiciel autre que IE.

Là, je bloque...
0
gillardg Messages postés 3275 Date d'inscription jeudi 3 avril 2008 Statut Membre Dernière intervention 14 septembre 2014 2
27 juin 2008 à 18:31
j'ai regardé les autorisations dans la base de registres je peux les modifier à partir de regedit donc :
un simple script  et ça fonctionne éssaie ça :
script ------------------------------------------------------------------------
[HKEY_CURRENT_USER\Software\Microsoft\Internet Explorer\PageSetup]
"header"=""
"footer"=""
"margin_bottom"="0.75000"
"margin_left"="0.75000"
"margin_right"="0.75000"
"margin_top"="0.75000"


-----------------------------------------------------------------------endscript
tu l'enregistre en tant que ie.pagesetup.reg
et tu le lances.
si ça fonctionne tu pourras le faire de ton prog.
????????????????????es tu en mode administrateur????????????????????????
0
denler Messages postés 11 Date d'inscription mardi 7 décembre 2004 Statut Membre Dernière intervention 27 juin 2008
27 juin 2008 à 18:37
Oui, je suis admin sur mon PC, et en utilisant le regedit, pas de problèmes pour la modification de ces clés.
En programmation VB, j'arrive à lire ces clés sans problème, mais dès que j'essaye de les modifier, là, j'ai un message d'erreur me disant que je n'ai pas les droits nécéssaires.
0
gillardg Messages postés 3275 Date d'inscription jeudi 3 avril 2008 Statut Membre Dernière intervention 14 septembre 2014 2
27 juin 2008 à 18:48
ben mets le script ^^^^^^ dans un string de ton prog,
au lancement de ton prog , tu le transfères dans un fichier texte ,
tu l'executes avec Process.Start( "machin.reg")
et hop hop
0
denler Messages postés 11 Date d'inscription mardi 7 décembre 2004 Statut Membre Dernière intervention 27 juin 2008
27 juin 2008 à 18:50
Après recherche plus profonde, je fesais une erreur dans mon code, ce qui explique que je ne pouvais pas écrire dans cette clé de la base de registres

en ajoutant ceci au code, j'obtient bien le résultat souhaité :
        Dim hkey_root As String = "HKEY_CURRENT_USER"
        Dim hkey_path As String = "Software\Microsoft\Internet Explorer\PageSetup"
        Dim hkey_key As String
        Dim key As Microsoft.Win32.RegistryKey

        key = Microsoft.Win32.Registry.CurrentUser.CreateSubKey(hkey_path)
        hkey_key = "header"
        key.SetValue(hkey_key, "")
        hkey_key = "footer"
        key.SetValue(hkey_key, "")

Merci pour ton aide
0
denler Messages postés 11 Date d'inscription mardi 7 décembre 2004 Statut Membre Dernière intervention 27 juin 2008
27 juin 2008 à 21:38
petite erreur : remplacer : PrintFiles.Visible True par PrintFiles.Visible False
0
Rejoignez-nous