# Dotnet > Gnral Dotnet > Dveloppement Office System > InfoPath > [IP-2010] Impression (en-tte pied de page)

## Thomas_Dev

Bonjour,

Me voici confront au problme de l'impression avec InfoPath.
Mon client veut un certain tableau en en-tte et un autre en pied de page. (il s'agit de formulaire avec des champs extensibles je ne peux pas prvoir la taille) Les options de base d'InfoPath ne permettent pas de faire cela.


La solution que j'envisage actuellement:
1 extraire le .xslt du formulaire.xsn
  =>ok
2 modifier le xslt selon le besoin
  => plus ou moins ok j'ai fait des petits tests (modif lgre du xslt)
3 gnrer un document xsl-fo a partir du xslt + xml
  =>ko, J'arrive  gnrer un fichier html avec ce code:


```
myXslTrans.Transform(myXPathDoc, null, myWriter);
```

mais je n'arrive pas  gnrer un xsl-fo.
4 utiliser ce xsl-fo pour ouvrir au format pdf
  => KO j'en suis pas encore la

Question:
-Est ce que cette mthode est bonne? (il y a plus simple?)
-A l'tape 3, comment gnrer du xsl-fo?

Thomas

----------


## Thomas_Dev

J'ai vu une autre piste:

quand on extrait les fichiers du .xsn, on obtient entre autre un .xsf, c'est la que sont stockes les personnalisations  "pied de page" et "en-tte".

On peut facilement diter et modifier le contenu du pied de page. Si je rajoute du texte  lintrieur de la balise de pied de page, a fonctionne.
Par contre je n'arrive pas a y dessiner un tableau ni a appeler un fichier xslt qui contiendrait le tableau...

----------


## Thomas_Dev

Je continu ma recherche pour l'impression:

La solution de mon premier message  l'air possible mais complique  mettre en uvre. (apprendre  manipuler le xsl-fo)

La solution de mon 2 message n'a pas l'air possible : le fichier manifest.xsf doit respecter un schma. Si j'essaye d'ajouter des balises inattendues elles ne sont pas prises en comptes.

J'envisage donc une 3 possibilit, Crer 3 vues :
1 une vue avec l'ensemble du formulaire, c'est celle que manipulera l'utilisateur.
2 une vue contenant juste un grand tableau de disposition de la taille d'une page A4, avec en haut de la feuille ce que l'on veut en en-tte, en bas le pied de page, et rien entre les deux.
3 une vue avec juste le corps du formulaire (c'est a dire le formulaire priv de son en-tte et pied de page). Pour cette vue je dfini une marge importante en haut et en bas (15cm)

dans la vue 1, j'ajoute un bouton "impression" pour imprimer les vues 2 et 3 sur une mme page.

Quelqu'un  dj essay? Des suggestions? Un exemple de code C# pour l'impression?

----------


## Thomas_Dev

Voici pour le moment ma solution: (qui n'est sans doute pas la meilleure!)

l'ide est de faire une premire impression du formulaire dans des images plutt que sur du papier. De retoucher ces images, puis de les imprimer sur papier.

Voici les tapes:
1- dans le formulaire InfoPath crer 2 vues:
Vue 1, il s'agit de la vue destine  l'utilisateur. Elle est de la forme:
[Bloc den-tte]
[Bloc du corps ]
[Bloc pied page]

Vue 2, il s'agit de la vue qui est imprime "virtuellement":
[Bloc den-tte]
--saut de page--
[Bloc pied page]
--saut de page--
[Bloc du corps ]

2- dfinir les marges:
je dfini les marges en fonction de la hauteur de mon en-tte et de mon pied de page. (perso j'ai mis 4,7cm en haut 4,3 en bas) ainsi le corps s'imprimera virtuellement en laissant la place pour rajouter len-tte au dessus et le pied en dessous.

3- installer un pilote d'impression virtuel.
J'ai pris "ImagePrinter" il est super simple, super lger.
-j'ai mis ImagePrinter en imprimante par dfaut. (on pourrait faire autrement)
-ImagePrinter imprime toujours dans un mme rpertoire que vous devez dfinir (j'ai mis c:\monTemp)
-ImagePrinter permet de lancer un programme aprs avoir fait une impression (cela va servir)

4- rajouter un bouton impression
dans la vue1 du formulaire je rajoute un bouton "impression"
rsum du code du bouton:
|effacer contenu de c:\monTemp
|crire quelques infos dans un fichier XML
|imprimer virtuellement

dans le XML je met un signal pour autoriser l'impression, et j'cris les ctes de ce formulaire. (chaque autre formulaire devra spcifier ses propres ctes)

(dtail du code en dessous)

5- crire le programme annexe qui sera lanc par ImagePrinter
(perso toujours en c# avec Visual Studio)
rsum du code:
|ajouter un vnement  l'impression
|lire le XML que l'on a crit avant
|rcupration des images + tri (dterminer laquelle reprsente len-tte, laquelle le pied de page) 
|ouvrir une fentre pour que l'utilisateur puisse choisir l'imprimante papier
|impression en boucle (appel  la fonction print() qui lance l'impression et notre vnement  l'impression)
|criture dans XML (j'cris un signal pour dire que l'impression est dj faite)

dans la fonction lance par lvnement  l'impression:
|on rcupr le graph que l'on va imprimer (au dbut il est vierge) 
|dessiner len-tte sur le graph
|dessiner le corps sur le graph
|dessiner le pied de page sur le graph

(dtail du code en dessous)

pour qu'ImagePrinter lance automatiquement ce programme il faut lui indiquer le chemin de lexcutable du projet (gnr automatiquement par Visual Studio). Note : ce programme annexe est commun pour tous vos formulaires, il agit un peu diffremment selon les infos passes dans le fichier XML.

Conclusion: pas mal de dfauts mais a fonctionne. les dfauts:
-les images mettent du temps  s'imprimer virtuellement.
-c'est vraiment galre et ennuyeux de dterminer (pour chaque formulaire) les ctes en pixel.
-len-tte (comme le pied de page) est fixe : c'est une image qui sera identique sur chaque page.  Si on veut modifier un champ comme le numro de page, il faut encore faire des calculs de pixel!

!attention boucle infini!
Si le programme annexe fait une impression avec ImagePrinter, ImagePrinter le rappellera, il refera une impression avec ImpagePrinter etc... (do mon feu vert ou rouge pour autoriser lexcution du programme)

code du bouton imprimer:


```

```

code du programme annexe:


```

```

*Edit*
Je recherche toujours une autre solution, des suggestions?

----------

