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

AWT/Swing Java Discussion :

Taille Page pour impression


Sujet :

AWT/Swing Java

  1. #1
    Membre éclairé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Janvier 2007
    Messages
    697
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Calvados (Basse Normandie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Janvier 2007
    Messages : 697
    Par défaut Taille Page pour impression
    Bonjour,
    je voudrais faire une application gérant l'impression des documents et je me demandais ce qu'il fallait utiliser comme composant pour avoir des pages automatiquement de la taille de l'impression(21-29,7/A4). Sachant que je ne veux pas écrire mais dessiner sur mon composant. Existe-t'il des composants préformatés pour l'impression. Je précise que je veux pouvoir avoir plusieurs pages.
    Autres choses je veux ajouter des composants à ce composant seront t'ils
    gérés par l'impression.
    Merci d'avance pour vos réponses parce que là je suis bloqué...

  2. #2
    Membre éclairé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Janvier 2007
    Messages
    697
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Calvados (Basse Normandie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Janvier 2007
    Messages : 697
    Par défaut
    Voici mon code recupéré sur la FAQ :
    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
     
    public PartitionImprimable() {
            Container cont = getContentPane();
            PrintJob job = getToolkit().getPrintJob(this,"essai", null);
            if (job != null) {
                    /** Recupere le Graphics dans lequel on va ecrire */
                    Graphics g = job.getGraphics();
                    if (g != null) {
                            /** Sur le Container imprime l'ensemble de ses Components  */
                            cont.printAll(g);
                            g.dispose();
                    } 
                    /** Finit le travail  */
                    job.end();
            } 
     
        }
    Mais ma question reste toujour en suspend. Comment dois-je faire pour que mes JPanel soit de la taille/forme d'une page ?
    Merci pour vos reponse

  3. #3
    Membre éclairé
    Homme Profil pro
    Inscrit en
    Avril 2005
    Messages
    277
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39

    Informations forums :
    Inscription : Avril 2005
    Messages : 277
    Par défaut
    Alors la tu te lance dans un truc super chaud ... lol

    Il faut rendre ton composant PRINTABLE ... Puis faire une méthode PRINT() ...

    Ensuite il te faudra utiliser des GRAPHICS, et la tu as le champ LIBRE !!!

    Pour adapter a ta page, fixe la taille de la page AVANT la methode print, puis tu devra mettre a l'echelle tes objets ...

    Petit bout de code qui traine chez moi pour la premiere partie :
    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
        margin = 36;
     
        // Zone imprimable
        paper = new Paper();
        paper.setSize( 594.72, 841.68);
        paper.setImageableArea(margin, margin, paper.getWidth() - margin * 2, paper.getHeight() - margin * 2);
     
        // Disposition de la feuille
        pf = new PageFormat();
        pf.setOrientation( PageFormat.PORTRAIT );
        pf.setPaper(paper);
     
        // On lui balance tout ca ...
        pj = PrinterJob.getPrinterJob();
        pj.setPrintable( this, pf );
    Puis
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    pj.print(); // Et on lance l'impression
    Infos en vrac :
    -> Il te reste a faire la méthode PRINT();
    -> Les mesures sont en 1/72ème de pouce ... Hé oui ... Donc convertir de cm en pouce, puis diviser par 72 ... lol

    Il existe surement de meilleures méthodes, mais celle la est celle que j'ai utilisé et elle marche ^^

    Bon courage !

  4. #4
    Membre éclairé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Janvier 2007
    Messages
    697
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Calvados (Basse Normandie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Janvier 2007
    Messages : 697
    Par défaut
    autre chose, j'ai fait un test chez moi (avec mon code, je n'ai pas encore regardé le tient )et donc non seulement ce n'est pas centré comme je le veux, en effet mon panel n'est pas imprimer un entier(mais ton code devrais resoudre ce problème)mais en plus c'est imprimer en noire et blanc. Existe-t'il un moyen d'imprimer un couleur ?
    PS: j'utilise PDF Creator pour simuler l'impression.

  5. #5
    Membre éclairé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Janvier 2007
    Messages
    697
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Calvados (Basse Normandie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Janvier 2007
    Messages : 697
    Par défaut
    J'ai trouvé une classe fait spécialement pour l'impression.Génial!!!
    je la poste au cas ou elle interesserait quelqu'un
    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
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    177
    178
    179
    180
    181
    182
    183
    184
    185
    186
    187
    188
    189
    190
    191
    192
    193
    194
    195
    196
    197
    198
    199
    200
    201
    202
    203
    package print;
     
    import java.awt.Color;
    import java.awt.Dimension;
    import java.awt.Font;
    import java.awt.Graphics;
    import java.awt.Graphics2D;
    import java.awt.GridBagLayout;
    import java.awt.RenderingHints;
    import java.awt.print.PageFormat;
    import java.awt.print.Paper;
    import java.awt.print.Printable;
    import java.awt.print.PrinterException;
    import java.awt.print.PrinterJob;
    import java.util.Vector;
    import javax.swing.JPanel;
     
     
    /**
     * 
     * @author mep
     *
     */
    public class MPanelPrinter implements Printable{
    //==================champs de la classe==========================
        private JPanel panel;
        private boolean showPrintZone;
        private boolean fitIntoPage;
        private boolean wrapComponent;
        private PageFormat pageFormat;
        private PrinterJob printJob;
        private Vector taillePages;
        private String documentTitle;
        public static final int PORTRAIT = 1;
        public static final int LANDSCAPE = 0;
    //====================constructeur================================
        public MPanelPrinter(JPanel panel){
            documentTitle = "";
            this.panel = panel;
            initPrintablePanel();
        }
     
        public void initPrintablePanel(){
            showPrintZone = false;
            fitIntoPage = false;
            wrapComponent = false;
            printJob = PrinterJob.getPrinterJob();
            pageFormat = printJob.defaultPage();
            pageFormat.setOrientation(1);
        }
    //======================methodes d'impression======================================
        public int print(Graphics g, PageFormat pf, int pageIndex) throws PrinterException{
            Dimension tailleDoc = panel.getSize();
            double hauteurDocu = tailleDoc.getHeight();
            double hauteurPage = pf.getImageableHeight();
            double largeurDocu = tailleDoc.getWidth();
            double largeurPage = pf.getImageableWidth();
            int totalNumPages = (int)Math.ceil(hauteurDocu / hauteurPage);
            if(wrapComponent){
                totalNumPages = taillePages.size();
            }//if
            else{
                if(fitIntoPage){
                    totalNumPages = 1;            
                }//if
            }//else
     
            double scaleX = largeurPage / largeurDocu;
            double scaleY = hauteurPage / hauteurDocu;
            if(pageIndex >= totalNumPages){
                return 1;
            }//if
            Graphics2D g2d = (Graphics2D)g;
            g2d.setRenderingHint(RenderingHints.KEY_INTERPOLATION, RenderingHints.VALUE_INTERPOLATION_BICUBIC);
            g2d.setRenderingHint(RenderingHints.KEY_TEXT_ANTIALIASING, RenderingHints.VALUE_TEXT_ANTIALIAS_ON);
            g2d.translate(pf.getImageableX(), pf.getImageableY());
            if(fitIntoPage){
                double ratio = Math.min(scaleX, scaleY);
                g2d.scale(ratio, ratio);
            }//if
            else{
                if(wrapComponent){
                    if(pageIndex > 0){
                        g2d.translate(0.0D, -((Double)taillePages.get(pageIndex - 1)).doubleValue());
                    }//if
                }//if 
                else{
                    g2d.translate(0.0D, (double)(-pageIndex) * hauteurPage);
                }//else
            }//else    
            panel.paint(g2d);
            if(wrapComponent){
                double hauteurBlanc = ((Double)taillePages.get(pageIndex)).doubleValue();
                g2d.setColor(Color.WHITE);
                g2d.fillRect(0, (int)hauteurBlanc, (int)largeurPage, (int)hauteurBlanc + (int)hauteurPage);
            }//if
            if(wrapComponent){
                if(pageIndex > 0){
                    g2d.translate(0.0D, ((Double)taillePages.get(pageIndex - 1)).doubleValue());
                }//if
            }//if
            else{
                g2d.translate(0.0D, (double)pageIndex * hauteurPage);
            }//else
            g2d.setColor(Color.BLACK);
            g2d.setFont(new Font("Verdanna", 2, 10));
            g2d.drawString(documentTitle + " - [" + (pageIndex + 1) + "/" + totalNumPages + "]", 0, (int)pf.getImageableHeight() - 20);
            return 0;
        }
     
        public void print(){
            printJob.setPrintable(this, pageFormat);
            try{
                if(printJob.printDialog()){
                    if(wrapComponent){
                        calculatePages();
                    }//if
                    Paper paper = pageFormat.getPaper();
                    Paper save = pageFormat.getPaper();
                    paper.setImageableArea(paper.getImageableX(), paper.getImageableY(), paper.getWidth() - paper.getImageableX(), paper.getHeight() - paper.getImageableY());
                    pageFormat.setPaper(paper);
                    printJob.setPrintable(this, pageFormat);
                    printJob.print();
                    pageFormat.setPaper(save);
                }//if
            }//try
            catch(PrinterException pe){
                System.out.println("Erreur lors de l'impression du document: " + toString());
            }//catch
        }
     
        private void calculatePages(){
            taillePages = new Vector();
            double hauteurPage = pageFormat.getImageableHeight();
            double hauteurTotal = 0.0D;
            double hauteurCumul = 0.0D;
            for(int i = 0; i < panel.getComponentCount(); i++){
                int gridBagInsets = 0;
                if(panel.getLayout() instanceof GridBagLayout){
                    gridBagInsets = ((GridBagLayout)panel.getLayout()).getConstraints(panel.getComponent(i)).insets.bottom + ((GridBagLayout)panel.getLayout()).getConstraints(panel.getComponent(i)).insets.top;
                }//if
                double hauteurComponent = panel.getComponent(i).getSize().getHeight() + (double)gridBagInsets;
                if(hauteurComponent > hauteurPage){
                    wrapComponent = false;
                    return;
                }//if
                hauteurTotal += hauteurComponent;
                if(hauteurTotal > hauteurPage){
                    hauteurTotal -= hauteurComponent;
                    hauteurCumul += hauteurTotal;
                    taillePages.add(new Double(hauteurCumul));
                    hauteurTotal = hauteurComponent;
                }//if
            }//for
     
            hauteurCumul += hauteurTotal;
            taillePages.add(new Double(hauteurCumul));
        }
    //==============================accesseurs========================================
        public void setOrientation(int orientation){
            pageFormat.setOrientation(orientation);
        }
     
        public void setPrintZoneVisible(boolean status){
            showPrintZone = status;
        }
     
        public void setWrapComponent(boolean status){
            wrapComponent = status;
        }
     
        public void setFitIntoPage(boolean status){
            fitIntoPage = status;
        }
     
        public int getPageWidth(){
            return (int)pageFormat.getImageableWidth();
        }
     
        public double getMarginTop (){
            return pageFormat.getImageableY();
        }
     
        public double getMarginLeft (){
            return pageFormat.getImageableX();
        }
     
        public void setLRMargins(int margin){
            Paper paper = pageFormat.getPaper();
            paper.setImageableArea(paper.getImageableX() - (double)(margin / 2), paper.getImageableY(), paper.getImageableWidth() + (double)(margin / 2), paper.getImageableHeight());
            pageFormat.setPaper(paper);
        }
     
        public void setTBMargins(int margin){
            Paper paper = pageFormat.getPaper();
            paper.setImageableArea(paper.getImageableX(), paper.getImageableY() - (double)(margin / 2), paper.getImageableWidth(), paper.getImageableHeight() + (double)(margin / 2));
            pageFormat.setPaper(paper);
        }
     
        public void setDocumentTitle(String title){
            documentTitle = title;
        }
    }
    J'espère quelle resoudra mes problèmes
    En tous cas elle à déjà résolu le problème de la couleur.
    reste le retaillage...

    Si quelqu'un pouvais m'expliquer clairement(pour les null ) la façon dont on doit calculer la taille du panel que l'on veut imprimer je suis un peut perdu.

  6. #6
    Membre confirmé
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    68
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 68
    Par défaut
    Bonjour,

    tu devrais te renseigner sur les méthodes translate() et scale() de Graphics2D :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
       /**
        * Implémentation de l'interface Printable
        */
    public int print(Graphics g, PageFormat pf, int indexPage) throws PrinterException {
    	if(indexPage>0) return Printable.NO_SUCH_PAGE;
    	Graphics2D g2 = (Graphics2D)g;
    	g2.translate(pf.getImageableX(), pf.getImageableY());
    	g2.scale( pf.getImageableWidth()/getContentPane().getWidth(),pf.getImageableHeight()/getContentPane().getHeight());
    	getContentPane().printAll(g2);
    	return Printable.PAGE_EXISTS;
    }
    Une utilisation similaire à l'exemple ci dessus devrait te permettre de "caler" ton image au sein de ta page... Sachant que dans cet exemple j'imprime le contenu de mon ContentPane !

  7. #7
    Membre éclairé Avatar de donnadieujulien
    Développeur informatique
    Inscrit en
    Avril 2008
    Messages
    433
    Détails du profil
    Informations personnelles :
    Âge : 40

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2008
    Messages : 433
    Par défaut Salut
    J'ai utilisé ta classe, ca marche bien ,mais avant l'impression ca me donne 9999 pages, et je ne vois pas d'ou vient le problème?

    Meric

  8. #8
    Membre confirmé
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    68
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 68
    Par défaut
    Bonjour,

    Je crois savoir que tu as la méthode setCopies() de la classe PrinterJob qui te permet de modifier le nombre de copies.

Discussions similaires

  1. Mise en page pour impression
    Par seb591 dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 01/06/2007, 08h44
  2. Saut de page pour impression...
    Par Mr6 dans le forum Langage
    Réponses: 1
    Dernier message: 06/04/2006, 20h13
  3. page pour impression
    Par maximenet dans le forum Balisage (X)HTML et validation W3C
    Réponses: 3
    Dernier message: 03/01/2006, 10h23

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