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

InfoPath .NET Discussion :

Impression (en-tête pied de page)


Sujet :

InfoPath .NET

  1. #1
    Membre à l'essai
    Homme Profil pro
    Developpeur Consultant
    Inscrit en
    Mars 2012
    Messages
    22
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Developpeur Consultant
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2012
    Messages : 22
    Points : 21
    Points
    21
    Par défaut Impression (en-tête pied de page)
    Bonjour,

    Me voici confronté au problème de l'impression avec InfoPath.
    Mon client veut un certain tableau en en-tête et un autre en pied de page. (il s'agit de formulaire avec des champs extensibles je ne peux pas prévoir 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 légère du xslt)
    3 générer un document xsl-fo a partir du xslt + xml
    =>ko, J'arrive à générer un fichier html avec ce code:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    myXslTrans.Transform(myXPathDoc, null, myWriter);
    mais je n'arrive pas à générer 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 méthode est bonne? (il y a plus simple?)
    -A l'étape 3, comment générer du xsl-fo?

    Thomas

  2. #2
    Membre à l'essai
    Homme Profil pro
    Developpeur Consultant
    Inscrit en
    Mars 2012
    Messages
    22
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Developpeur Consultant
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2012
    Messages : 22
    Points : 21
    Points
    21
    Par défaut
    J'ai vu une autre piste:

    quand on extrait les fichiers du .xsn, on obtient entre autre un .xsf, c'est la que sont stockées les personnalisations "pied de page" et "en-tête".

    On peut facilement éditer et modifier le contenu du pied de page. Si je rajoute du texte à l’intérieur 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...

  3. #3
    Membre à l'essai
    Homme Profil pro
    Developpeur Consultant
    Inscrit en
    Mars 2012
    Messages
    22
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Developpeur Consultant
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2012
    Messages : 22
    Points : 21
    Points
    21
    Par défaut
    Je continu ma recherche pour l'impression:

    La solution de mon premier message à l'air possible mais compliquée à 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 schéma. Si j'essaye d'ajouter des balises inattendues elles ne sont pas prises en comptes.

    J'envisage donc une 3° possibilité, Créer 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-tête, 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-tête et pied de page). Pour cette vue je défini 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 même page.

    Quelqu'un à déjà essayé? Des suggestions? Un exemple de code C# pour l'impression?

  4. #4
    Membre à l'essai
    Homme Profil pro
    Developpeur Consultant
    Inscrit en
    Mars 2012
    Messages
    22
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Developpeur Consultant
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2012
    Messages : 22
    Points : 21
    Points
    21
    Par défaut
    Voici pour le moment ma solution: (qui n'est sans doute pas la meilleure!)

    l'idée est de faire une première impression du formulaire dans des images plutôt que sur du papier. De retoucher ces images, puis de les imprimer sur papier.

    Voici les étapes:
    1- dans le formulaire InfoPath créer 2 vues:

    Vue 1, il s'agit de la vue destinée à l'utilisateur. Elle est de la forme:
    [Bloc d’en-tête]
    [Bloc du corps ]
    [Bloc pied page]

    Vue 2, il s'agit de la vue qui est imprimée "virtuellement":
    [Bloc d’en-tête]
    --saut de page--
    [Bloc pied page]
    --saut de page--
    [Bloc du corps ]

    2- définir les marges:
    je défini les marges en fonction de la hauteur de mon en-tête 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 l’en-tête au dessus et le pied en dessous.

    3- installer un pilote d'impression virtuel.
    J'ai pris "ImagePrinter" il est super simple, super léger.
    -j'ai mis ImagePrinter en imprimante par défaut. (on pourrait faire autrement)
    -ImagePrinter imprime toujours dans un même répertoire que vous devez définir (j'ai mis c:\monTemp)
    -ImagePrinter permet de lancer un programme après avoir fait une impression (cela va servir)

    4- rajouter un bouton impression
    dans la vue1 du formulaire je rajoute un bouton "impression"
    résumé 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 côtes de ce formulaire. (chaque autre formulaire devra spécifier ses propres côtes)

    (détail du code en dessous)

    5- écrire le programme annexe qui sera lancé par ImagePrinter

    (perso toujours en c# avec Visual Studio)
    résumé du code:
    |ajouter un événement à l'impression
    |lire le XML que l'on a écrit avant
    |récupération des images + tri (déterminer laquelle représente l’en-tête, laquelle le pied de page)
    |ouvrir une fenêtre pour que l'utilisateur puisse choisir l'imprimante papier
    |impression en boucle (appel à la fonction print() qui lance l'impression et notre événement à l'impression)
    |écriture dans XML (j'écris un signal pour dire que l'impression est déjà faite)

    dans la fonction lancée par l’événement à l'impression:
    |on récupéré le graph que l'on va imprimer (au début il est vierge)
    |dessiner l’en-tête sur le graph
    |dessiner le corps sur le graph
    |dessiner le pied de page sur le graph

    (détail du code en dessous)

    pour qu'ImagePrinter lance automatiquement ce programme il faut lui indiquer le chemin de l’exécutable du projet (généré automatiquement par Visual Studio). Note : ce programme annexe est commun pour tous vos formulaires, il agit un peu différemment selon les infos passées dans le fichier XML.

    Conclusion: pas mal de défauts mais ça fonctionne. les défauts:
    -les images mettent du temps à s'imprimer virtuellement.
    -c'est vraiment galère et ennuyeux de déterminer (pour chaque formulaire) les côtes en pixel.
    -l’en-tête (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 numéro 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... (d’où mon feu vert ou rouge pour autoriser l’exécution du programme)

    code du bouton imprimer:
    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
     
    public void bouton_Clicked(object sender, ClickedEventArgs e)
            {
                'effacer le contenu de c:\monTemp
                foreach (string f in Directory.GetFiles("C:\\monTemp"))
                {
                    File.Delete(f);
                }
     
                'ecrire des infos dans un fichiers xml, le feu vert et toutes les mensuration dont on peut avoir besoin
     
                XmlTextWriter textWriter = new XmlTextWriter(@"C:\Fichier xml\mesure.xml", null);
                string valeur;
                int itemp = 0;
     
                textWriter.WriteStartDocument();
                textWriter.WriteComment("Ce fichier contient l'autorisation d'imprimer et les mensurations");
                textWriter.WriteStartElement("donnees");
     
                textWriter.WriteStartElement("feu");
                textWriter.WriteString("vert");
                textWriter.WriteEndElement();
     
                textWriter.WriteStartElement("cote1");
                textWriter.WriteString("519");
                textWriter.WriteEndElement();
     
                textWriter.WriteStartElement("cote2");
                itemp = 936 - 519;
                valeur = ""+itemp;
                textWriter.WriteString(valeur);
                textWriter.WriteEndElement();
     
                textWriter.WriteEndDocument();
                textWriter.Close();
     
                'imprimer virtuellement avec l'imprimante par defaut
                this.Print(false);
            }
    code du programme annexe:
    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
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
     
    using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Drawing;
    using System.Linq;
    using System.Text;
    using System.Windows.Forms;
    using System.Xml;
    using System.Drawing.Printing;
    using System.IO;
    using System.Runtime.InteropServices;
     
    namespace Project1
    {
     
        class Class1
        {
     
            'declaration variable
            private PrintDocument printDoc = new PrintDocument();
            private PageSettings pgSettings = new PageSettings();
            private PrinterSettings prSettings = new PrinterSettings();
            int t1, t2, p1, p2, c1, c2, g1, g2, g3, g4, g5, g6, g7; 'il s'agit de toutes les cotes
            Bitmap tete, pied, corps;
            int largeur = 860;
            int hauteur = 1160;
            [DllImport("winspool.drv", CharSet = CharSet.Auto, SetLastError = true)]
            public static extern bool SetDefaultPrinter(string Name);
     
            public Class1()
            {
                'ajout de l'event lors de l'appel à la commande .print()
                printDoc.PrintPage += new PrintPageEventHandler(printDoc_PrintPage);
     
                'je controle si le feu est au vert dans le fichier xml
                string temp = "";
                XmlTextReader reader = new XmlTextReader("C:\\Fichier xml\\mesure.xml");
                while (reader.Read())
                {
                    if (reader.Name.Equals("feu"))
                    {
                        reader.Read();
                        temp = reader.Value;
                        break;
                    }
                }
                reader.Close();
     
                'si le feu est vert alors j'imprime
                if (temp == "vert")
                {
     
                    Rectangle cloneRect;
                    System.Drawing.Imaging.PixelFormat format;
     
                    'initialisation variable (a terme à partir du fichier xml)
                    t1 = 519;
                    t2 = 936 - t1;
                    p1 = 519;
                    p2 = 918 - p1;
                    c1 = 538;
                    c2 = 2896 - c1;
                    g2 = (t2 * hauteur) / 3507;
                    g3 = 5;
                    g4 = (c2 * hauteur) / 3507;
                    g5 = 5;
                    g6 = (p2 * hauteur) / 3507;
     
     
                    'récupération du nom des images contenus dans monTemp
                    string[] files;
                    int[] numImage;
                    string stemp;
                    int itemp;
                    files = Directory.GetFiles("C:\\monTemp");
                    int filecount = files.GetUpperBound(0) + 1;
     
                    numImage = new int[filecount];
                    for (int i = 0; i < filecount; i++)
                    {
                        stemp = System.IO.Path.GetFileNameWithoutExtension(files[i]);
                        int.TryParse(stemp.Substring(5), out numImage[i]);
                    }
                    'je tri le tableau pour avoir l'entete en position "0", le pied de page en position "1" et les autres après
                    bool continu = true;
                    filecount--;
                    while (continu)
                    {
                        continu = false;
                        for (int i = 0; i < filecount; i++)
                        {
                            if (numImage[i] > numImage[i + 1])
                            {
                                itemp = numImage[i + 1];
                                numImage[i + 1] = numImage[i];
                                numImage[i] = itemp;
                                continu = true;
                            }
                        }
                    }
                    filecount++;
                    'je récupére les bitmap entete et pied
                    tete = new Bitmap("C:\\monTemp\\image" + numImage[0] + ".bmp");
                    pied = new Bitmap("C:\\monTemp\\image" + numImage[1] + ".bmp");
     
                    cloneRect = new Rectangle(0, t1, tete.Width, t2);
                    format = tete.PixelFormat;                          
                    tete = tete.Clone(cloneRect, format);
     
                    cloneRect = new Rectangle(0, p1, pied.Width, p2);
                    format = pied.PixelFormat;
                    pied = pied.Clone(cloneRect, format);
     
                    'boite de dialogue pour choix de l'imprimante
                    PrintDialog dlg = new PrintDialog();
                    dlg.ShowDialog();
                    prSettings = dlg.PrinterSettings;
     
                    'sauvegarde de l'imprimante par defaut
                    string DefaultPrinter = printDoc.PrinterSettings.PrinterName;
                    'définir la nouvelle imprimante par defaut
                    SetDefaultPrinter(prSettings.PrinterName);
     
                    'je lance toutes les imrpressions
                    for (int i = 2; i < filecount; i++)
                    {
                        corps = new Bitmap("C:\\monTemp\\image" + numImage[i] + ".bmp");
                        cloneRect = new Rectangle(0, c1, corps.Width, c2);
                        format = corps.PixelFormat;
                        corps = corps.Clone(cloneRect, format);
     
                        printDoc.Print();
     
                    }
                    'je remet le feu a rouge pour ne pas partir dans une boucle infinie
                    XmlTextWriter textWriter = new XmlTextWriter("C:\\Fichier xml\\mesure.xml", null);
     
                    textWriter.WriteStartDocument();
                    textWriter.WriteComment("Ce fichier contient l'autorisation d'imprimer (feu vert/rouge)");
                    textWriter.WriteStartElement("donnees");
     
                    textWriter.WriteStartElement("feu");
                    textWriter.WriteString("rouge");
                    textWriter.WriteEndElement();
     
                    textWriter.WriteEndDocument();
                    textWriter.Close();
     
                    'retablissement de l'imprimante par defaut initiale
                    SetDefaultPrinter(DefaultPrinter);
                }
            }
            private void printDoc_PrintPage(Object sender, PrintPageEventArgs e)
            {
                e.Graphics.DrawImage(tete, 0, 0, largeur, g2);
                e.Graphics.DrawImage(corps, 0, g2 + g3, largeur, g4);
                e.Graphics.DrawImage(pied, 0, g2 + g3 + g4 + g5, largeur, g6);
            }
            public static void Main()
            {
                new Class1();
            }
        }
    }
    Edit
    Je recherche toujours une autre solution, des suggestions?

Discussions similaires

  1. En-tête / pied-de-page LATEX
    Par pictbridge dans le forum Mise en forme
    Réponses: 6
    Dernier message: 23/05/2015, 21h14
  2. [Toutes versions] Présentation en-tête/pied de page
    Par did103 dans le forum Word
    Réponses: 2
    Dernier message: 24/03/2011, 21h45
  3. Sections et en-tête/pied de page
    Par did103 dans le forum Word
    Réponses: 9
    Dernier message: 24/04/2008, 21h59
  4. Suppression liens en-tête/pied de page
    Par did103 dans le forum VBA Word
    Réponses: 3
    Dernier message: 30/03/2008, 18h14
  5. Réponses: 6
    Dernier message: 19/11/2007, 12h06

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