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

BIRT Discussion :

Comment créer une table des matières dynamique: est-ce la bonne approche?


Sujet :

BIRT

  1. #1
    Membre régulier
    Inscrit en
    Novembre 2005
    Messages
    173
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 173
    Points : 123
    Points
    123
    Par défaut Comment créer une table des matières dynamique: est-ce la bonne approche?
    Bonjour,
    en lisant les différents topic de ce forum j'ai cru comprendre que BIRT ne pouvait pas créer une table des matières automatiquement. Est-ce vrai?
    Si on peut... comment???
    Si on ne peut pas, j'ai pensé à ce système (j'en ai absolumment besoin):
    1. Diviser chaque partie du rapport dans des librairies. J'appel ces 'parties' des composants (qui peuvent être des graphiques, des tableaux...). Ces composants, selon la requête du client, peuvent être présents ou pas dans le rapport;
    2. Assembler dynamiquement les composants dans un rapport (le client veut le premier composant? oui alors l'insérer; il veut le deuxième? non alors passer au prochain et ainsi de suite jusqu'au dernier...);
    3. Dans la première page du rapport prévoire un texte dynamique;
    4. Dans ce champ dynamique il faut:
    4.1. Ecrire le nom du composant;
    4.2. Savoir à quelle page du rapport correspond ce composant;
    4.3. Ecrire le numéro de la page juste après le nom du composant;
    4.4. Passer à la ligne suivante.
    Répéter de 4.1 jusqu'au 4.4 pour chaque composant présent.
    Tout m'a l'air logique et faisable (avec un peu de patience), le seul problème c'est que je ne réussi pas à trouver la fonction qui trouve la page correspondante à un composant est-ce qu'elle existe? ou savez-vous un autre moyen pour trouver cette information??
    sinon, mon approche est bonne ou quelqu'un sait comment réaliser une table des matières autrement (plus facilement)??
    je vous remerci d'avance et vous souhaite une agréable journée (ou plutôt soirée)

    Fred

  2. #2
    BiM
    BiM est déconnecté
    Expert éminent sénior
    Avatar de BiM
    Femme Profil pro
    Consultante/Formatrice BIRT & Ingénieur Java/J2EE/GWT
    Inscrit en
    Janvier 2005
    Messages
    7 796
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 38
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Consultante/Formatrice BIRT & Ingénieur Java/J2EE/GWT

    Informations forums :
    Inscription : Janvier 2005
    Messages : 7 796
    Points : 10 765
    Points
    10 765
    Par défaut
    Salut !

    Qu'est ce qu'une table des matières à ton sens ?

    Par exemple, avec les groupes, tu as automatiquement les groupes référencés sous forme de chapitre dans ton PDF. Je pense que tu peux forcer ce référencement.

  3. #3
    Membre régulier
    Inscrit en
    Novembre 2005
    Messages
    173
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 173
    Points : 123
    Points
    123
    Par défaut
    Salut et merci pour la réponse
    par 'table des matières' j'entend, par exemple, ça: exemple quelconque trouvé sur le net
    c-a-d un résumé des chapitres de mon rapport et la page correspondante..
    mon problème c'est que je ne peut pas écrire directement le nom du chapitre ni la page vu qu'ils peuvent varier selon la requète du client.. je sais pas trop comment faire..
    merci
    Fred

  4. #4
    BiM
    BiM est déconnecté
    Expert éminent sénior
    Avatar de BiM
    Femme Profil pro
    Consultante/Formatrice BIRT & Ingénieur Java/J2EE/GWT
    Inscrit en
    Janvier 2005
    Messages
    7 796
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 38
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Consultante/Formatrice BIRT & Ingénieur Java/J2EE/GWT

    Informations forums :
    Inscription : Janvier 2005
    Messages : 7 796
    Points : 10 765
    Points
    10 765
    Par défaut
    Tu peux m'expliquer pourquoi tu ne fais pas du LaTeX pour ton cas ?

  5. #5
    Membre régulier
    Inscrit en
    Novembre 2005
    Messages
    173
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 173
    Points : 123
    Points
    123
    Par défaut
    Latex.. quelle est la différence entre celui-ci et un tool de report genre birt ou christal report? peut-on faire des graphiques (pie-chart...)?

  6. #6
    BiM
    BiM est déconnecté
    Expert éminent sénior
    Avatar de BiM
    Femme Profil pro
    Consultante/Formatrice BIRT & Ingénieur Java/J2EE/GWT
    Inscrit en
    Janvier 2005
    Messages
    7 796
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 38
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Consultante/Formatrice BIRT & Ingénieur Java/J2EE/GWT

    Informations forums :
    Inscription : Janvier 2005
    Messages : 7 796
    Points : 10 765
    Points
    10 765
    Par défaut
    Beh disons que pour la rédaction de rapport, autant prendre un outil pour ca ou alors explique moi le problème en globalité pour clarifier ton problème.

  7. #7
    Membre régulier
    Inscrit en
    Novembre 2005
    Messages
    173
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 173
    Points : 123
    Points
    123
    Par défaut
    Le projet consiste dans la génération d'extraits patrimoniaux automatisé, c-a-d représenter la fortune d'un client d'une banque. Bien entendu chaque client possède des biens différents (certains des obbligations, d'autres des actions, liquidité ecc ecc) ce qui fait que chaque rapport est différents (avec graphiques et table de données différents), mon idée est de construire des templates pour chaque représentation graphique d'un type de bien. Avec la requête je rassemble les templates nécessaires et crée un rapport (avec table des matières). BIRT avait l'air pas mal au début mais je viens de voir ses points faibles, notamment celui de la table des matières, en plus je viens de tomber sur un test des performances qui souligne les problèmes de dead-lock en cas de multiple requète de génération (en fin d'année une banque peut arriver à en faire 30'000 en moins de 10 heures...) et l'utilisation incroyable de la CPU... alors je sais plus trop vers quel outil me tourner... quelques idées?
    merci
    Fred

  8. #8
    BiM
    BiM est déconnecté
    Expert éminent sénior
    Avatar de BiM
    Femme Profil pro
    Consultante/Formatrice BIRT & Ingénieur Java/J2EE/GWT
    Inscrit en
    Janvier 2005
    Messages
    7 796
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 38
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Consultante/Formatrice BIRT & Ingénieur Java/J2EE/GWT

    Informations forums :
    Inscription : Janvier 2005
    Messages : 7 796
    Points : 10 765
    Points
    10 765
    Par défaut
    Beh si t'es vraiment motivé Crystal Reports, mais ce n'est pas très utilisable à partir de Java peut être pour la prochaine version

    Tu as peut être fait un état de l'art axé sur ton projet et oriente toi en fonction de celui ci et des tests que tu auras effectué.

  9. #9
    Nouveau Candidat au Club
    Inscrit en
    Février 2007
    Messages
    1
    Détails du profil
    Informations forums :
    Inscription : Février 2007
    Messages : 1
    Points : 1
    Points
    1
    Par défaut
    J'ai trouvé un site qui explique une technique pour faire une table des matières.

    http://www.ml-crystal.com/articles/toc.htm

    J'espère que ça te permettra de faire ce que tu as de besoin.

    Simon Normand

  10. #10
    Membre régulier
    Inscrit en
    Novembre 2005
    Messages
    173
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 173
    Points : 123
    Points
    123
    Par défaut
    Merci Simon,
    malheureusement ce système a plusieurs points négatifs, dont celui de générer l'indice à la fin du rapport.. je suis en train de travailler dessus le problème et j'ai peut-être trouvé un moyen de générer un indice. si ça marche, j'expliquerai ma démarche.

  11. #11
    Membre régulier
    Inscrit en
    Novembre 2005
    Messages
    173
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 173
    Points : 123
    Points
    123
    Par défaut
    Bon, j'ai trouvé un moyen de générer ce TOC, je me base sur la librairie iText 1.4.6, une fois le rapport générer:
    quand j'appel cette méthode:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    Map map = SimpleNamedDestination.getNamedDestination(reader, false);
    elle me redonne cette map:
    __TOC_0 ==> 1 XYZ null 508.74 0
    __TOC_6 ==> 28 XYZ null 509.24 0
    __TOC_4 ==> 16 XYZ null 510.24 0
    __TOC_2 ==> 4 XYZ null 509.24 0
    __TOC_8 ==> 43 XYZ null 509.24 0
    __TOC_10 ==> 46 XYZ null 507.24 0
    __TOC_1 ==> 2 XYZ null 509.24 0
    __TOC_5 ==> 27 XYZ null 509.24 0
    __TOC_7 ==> 34 XYZ null 509.24 0
    __TOC_3 ==> 8 XYZ null 509.24 0
    sdfdsfdsfdsfdsf ==> 45 XYZ null 440.61 0
    srfdsefgsdf ==> 45 XYZ null 508.74 0
    le reader est le fichier PDF.
    la key de la map sont les __TOC_xxx, le premier champ après le '==>' est le numéro de la page..
    il ne reste plus qu'à insérer ces infos dans une page de votre rapport.
    cerise sur le gateau: c'est rapide!

  12. #12
    Candidat au Club
    Inscrit en
    Novembre 2007
    Messages
    2
    Détails du profil
    Informations forums :
    Inscription : Novembre 2007
    Messages : 2
    Points : 2
    Points
    2
    Par défaut
    Bonjour à tous.

    FredKéKé,
    Il semble que tu sois parvenu à faire ce que je cherche depuis plus d'une semaine !!!
    Sauf que contrairement à toi, je ne suis pas un expert...
    • Pourrais-tu me dire où et comment tu places ces morceaux de codes dans ton rapport ?
      Citation Envoyé par FredKéKé Voir le message
      Code : Sélectionner tout - Visualiser dans une fenêtre à part
      Map map = SimpleNamedDestination.getNamedDestination(reader, false);
      __TOC_0 ==> 1 XYZ null 508.74 0
      __TOC_6 ==> 28 XYZ null 509.24 0
      __TOC_4 ==> 16 XYZ null 510.24 0
      __TOC_2 ==> 4 XYZ null 509.24 0
      __TOC_8 ==> 43 XYZ null 509.24 0
      __TOC_10 ==> 46 XYZ null 507.24 0
      __TOC_1 ==> 2 XYZ null 509.24 0
      __TOC_5 ==> 27 XYZ null 509.24 0
      __TOC_7 ==> 34 XYZ null 509.24 0
      __TOC_3 ==> 8 XYZ null 509.24 0
      sdfdsfdsfdsfdsf ==> 45 XYZ null 440.61 0
      srfdsefgsdf ==> 45 XYZ null 508.74 0
    • Comment tu passes de la 'map' à une table des matières ?
    • Comment tu insères ta TOC dans ton rapport final ?
    J'espère que je n'en demande pas trop...
    Si c'est le cas, pouvez-vous me donner quelques liens, qui m'aiguillerons, svp ?

    Merci.

  13. #13
    Membre régulier
    Inscrit en
    Novembre 2005
    Messages
    173
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 173
    Points : 123
    Points
    123
    Par défaut
    hum.. c'est vieux tout ça et c'est surtout compliqué.. j'espère que tu n'as pas peur d'utiliser Java...

    avant tout, regarde l'exemple en annexe:

    [IMG][/IMG]

    tu dois générer ton pdf .
    l'index est généré comme un rptdesign normal mais il ne contient pas le numéros de page.

    Ensuite avec iText, tu écris à la page 'x' les numéros de pages.
    iText est capable de récupérer ces informations seulement si tu ajoute l'information de toc dans tes rptdesign (une quelquonque string va bien, l'important c'est de 'marquer' le toc).
    voici ma classe:

    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
     
    import java.io.File;
    import java.io.FileOutputStream;
    import java.util.ArrayList;
    import java.util.Collections;
    import java.util.Iterator;
    import java.util.List;
    import java.util.Map;
    import java.util.StringTokenizer;
     
    import org.apache.commons.io.FileUtils;
    import org.apache.commons.logging.Log;
    import org.apache.commons.logging.LogFactory;
     
    import com.lowagie.text.Element;
    import com.lowagie.text.Font;
    import com.lowagie.text.Phrase;
    import com.lowagie.text.pdf.ColumnText;
    import com.lowagie.text.pdf.PdfContentByte;
    import com.lowagie.text.pdf.PdfReader;
    import com.lowagie.text.pdf.PdfStamper;
    import com.lowagie.text.pdf.SimpleNamedDestination;
     
    public class TocBuilder {
     
        protected Log logger = LogFactory.getLog(getClass());
     
        // to build TOC
        private int tocVerticalPosition = 0;
        private int tocVerticalDelta = 0;
        private int tocHorizontalPosition = 0;
        private int noTitlePage = 7;
     
        /**
         * Create the TOC
         *
         * @param urlPDF
         * @throws Exception
         */
        public void addToc(String path, int initialPage) {
     
            String tocName = "TOC_TEMP";
     
            try {
                if (logger.isDebugEnabled())
                    logger.debug("Creating the TOC.....");
     
                // make a copy of the file
                FileUtils.copyFile(new File(path), new File(path+tocName));
     
                PdfReader r = new PdfReader(path+tocName);
                PdfStamper stp = new PdfStamper(r, new FileOutputStream(path));
     
                Map map = SimpleNamedDestination.getNamedDestination(r, false);
     
                List<Integer> pages = listTOC(map);
                Collections.sort(pages);
     
                // initial page
                int page = initialPage;
                int i = 1;
                // get the content of the initial page
                PdfContentByte cb = stp.getOverContent(page);
                for (Iterator iter = pages.iterator(); iter.hasNext();) {
                    // if we reached the number of title for one page, we have to pass to the next page
                    // and come back to the initial y position
                    if (i == noTitlePage) {
                        cb = stp.getOverContent(++page);
                        i = 1;
                    }
     
                    // get the first token and insert the content into the phrase
                    Phrase phrase = new Phrase(new StringTokenizer(iter.next().toString(), " ").nextToken(),
                            new Font(Font.HELVETICA, 8, Font.NORMAL));
     
                    ColumnText.showTextAligned(cb, Element.ALIGN_LEFT, phrase, tocHorizontalPosition,
                            tocVerticalPosition - (i++ * (tocVerticalDelta)), 0);
                }
     
                stp.close();
     
                // delete the copy
                FileUtils.forceDelete(new File(path+tocName));
     
                if (logger.isDebugEnabled())
                    logger.debug("Done!");
            }
            catch (Exception e) {
                logger.error("Error while creating the TOC:", e);
     
                throw new Exception(e);
            }
        }
     
        /**
         * Transform a map of TOC into a list of page number
         *
         * @param map
         * @return
         */
        protected List<Integer> listTOC(Map map) {
     
            List<Integer> list = new ArrayList<Integer>();
     
            for (Object value : map.values())
                list.add(new Integer(new StringTokenizer(value.toString(), " ").nextToken()));
     
            return list;
        }
     
    	public void setTocVerticalPosition(int tocVerticalPosition) {
    		this.tocVerticalPosition = tocVerticalPosition;
    	}
     
    	public void setTocVerticalDelta(int tocVerticalDelta) {
    		this.tocVerticalDelta = tocVerticalDelta;
    	}
     
    	public void setTocHorizontalPosition(int tocHorizontalPosition) {
    		this.tocHorizontalPosition = tocHorizontalPosition;
    	}
     
    	public void setNoTitlePage(int noTitlePage) {
    		this.noTitlePage = noTitlePage;
    	}
     
    }


    il faut appeler la méthode tocBuilder, paramètres d'entrée:
    - path, l'adresse de ton pdf.
    - initial page, la page ou insérer les numéros de pages du toc.

    ces paramètres sont les positions en pixels d'ou insérer les numéros de pages (petit rappel: itext part en bas à gauche):
    tocVerticalPosition, la position verticale;
    tocVerticalDelta, le delta vertical entre 2 numéros de pages;
    tocHorizontalPosition, la position horizontale;
    noTitlePage, le numéro de toc par page.

    j'espère t'avoir aidé un peu..

    a+

  14. #14
    Candidat au Club
    Inscrit en
    Novembre 2007
    Messages
    2
    Détails du profil
    Informations forums :
    Inscription : Novembre 2007
    Messages : 2
    Points : 2
    Points
    2
    Par défaut
    J'ai peur que ce soit un peu chaud pour moi, mais je vais essayer, c'est de toutes façons la seule piste que j'ai.

    En tous cas, merci à toi, d'avoir fait la démarche de fouiller au fond de tes archives pour m'aider. J'apprécie sincèrement...

    Je vous tiens au courant...

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Etat: comment créer une table des matières
    Par JenTry dans le forum IHM
    Réponses: 3
    Dernier message: 17/01/2019, 14h36
  2. Comment créer une table sas pour gérer des queries
    Par arnaldo1974 dans le forum Administration et Installation
    Réponses: 1
    Dernier message: 02/12/2009, 14h39
  3. Réponses: 30
    Dernier message: 30/05/2009, 18h49
  4. Réponses: 2
    Dernier message: 16/05/2007, 16h13
  5. créer une table des matières avec fop
    Par gedeon555 dans le forum XSL/XSLT/XPATH
    Réponses: 5
    Dernier message: 05/07/2005, 15h54

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