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

Graphisme Java Discussion :

reduire la marge supérieur et inférieure


Sujet :

Graphisme Java

  1. #1
    Membre confirmé
    Inscrit en
    Janvier 2010
    Messages
    113
    Détails du profil
    Informations forums :
    Inscription : Janvier 2010
    Messages : 113
    Par défaut reduire la marge supérieur et inférieure
    Salut tout le monde,

    j'ai un petit soucis en java ou j'ai une feuille remplis par des informations et je veux réduire la marge supérieure et inférieure au max afin de gagner de l'espace.

    voici mon code:
    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
    public int print(Graphics g, PageFormat pageFormat, int page) throws PrinterException {
    		Graphics2D g2d = (Graphics2D) g;
    		int imageableWidth = (int)pageFormat.getImageableWidth();
    		int imageableHeight = (int)pageFormat.getImageableHeight();
    		System.out.println(imageableWidth);
    		System.out.println(imageableHeight);
    		g2d.translate(pageFormat.getImageableX(), pageFormat.getImageableY());
    		//g2d.translate(460, 697);
     
    		new ArticlePrintModel(this.article1, g2d, imageableWidth, imageableHeight, this.group);
    		g2d.setStroke(new BasicStroke(1, BasicStroke.CAP_BUTT, BasicStroke.JOIN_BEVEL, 0, new float[] {1,2}, 0));
    		int pageYCenter = imageableHeight/2;
    		g2d.drawLine(0, pageYCenter, imageableWidth, pageYCenter);
     
    		if(this.article2!=null) {
    			g2d.translate(0, pageYCenter+40);
    			new ArticlePrintModel(this.article2, g2d, imageableWidth, imageableHeight/2, this.group);
    		}
    		return PAGE_EXISTS;
    	}

    Merci d'avance

  2. #2
    Modérateur
    Avatar de joel.drigo
    Homme Profil pro
    Ingénieur R&D - Développeur Java
    Inscrit en
    Septembre 2009
    Messages
    12 430
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D - Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2009
    Messages : 12 430
    Billets dans le blog
    2
    Par défaut
    Salut,

    Normalement, c'est l'utilisateur qui choisit, en fonction des limites et contraintes du service d'impression, les marges qu'il veut. Et dans la méthode print() tu dois en tenir compte.

    Tu peux forcer ces marges : la classe PageFormat dispose d'une méthode qui retourne une instance de classe Paper, qui modélise la feuille de papier. Cette classe a une méthode qui te permet d'imposer une zone d'impression : setImageableArea(double x, double y, double width, double height). Il faut faire attention au capacité du service d'impression (la plupart des imprimantes à tambour ont une marge minimum dans laquelle il est impossible d'imprimer pour des raisons mécaniques : les parties que tu dessineras dans cette zone seront donc invisibles sur le papier et ton impression incomplète). En général, c'est plutôt sur les bords droite et gauche (en format portrait), donc peut être que tu pourras réduire au max les marges supérieures et inférieures (mais ne pas considérer que parce que ça marche avec ton imprimante, ça marchera partout).

    Il est possible d'intervenir avant que l'utilisateur choisir le format, si tu affiches un dialogue qui lui permet de le choisir, afin de mettre des marges par défaut (normalement, le service corrigera automatiquement les marges pour qu'elles ne soient pas inférieures au minimum possible) et si l'utilisateur choisit des marges plus grandes, il faudra en tenir compte. Il est possible de récolter les marges par défaut d'un service d'impression, mais ce n'est pas sûr que cela soit les marges minimum.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    PrinterJob job = PrinterJob.getPrinterJob(); // obtient un job d'impression
     
    PageFormat pageformat = job.defaultPage(); // obtient le format par défaut, par lequel tu peux obtenir le format de papier (Paper), donc les marges (par défaut). Et les changer.
    ensuite
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    job.setPrintable(printable, pageformat); // affectation du printable au job (il y a une alternative, le Pageable, qui porte le format de page, donc le Paper, donc les marges)
    if (job.printDialog()) { // appelle d'un dialogue d'impression
          job.print(); // impression
    }
    Il y a un autre type de dialogue qui justement permet de paramétrage le format :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    PrinterJob job = PrinterJob.getPrinterJob();
    PrintRequestAttributeSet aset = new HashPrintRequestAttributeSet();
    PageFormat pageformat  = job.pageDialog(aset); // on affiche le dialogue, on récupère un format, qu'on peut modifier
    job.setPrintable(printable, pageformat);
    if ( job.printDialog(aset) ) {
        job.print();
    }
    L'expression "ça marche pas" ne veut rien dire. Indiquez l'erreur, et/ou les comportements attendus et obtenus, et donnez un Exemple Complet Minimal qui permet de reproduire le problème.
    La plupart des réponses à vos questions sont déjà dans les FAQs ou les Tutoriels, ou peut-être dans une autre discussion : utilisez la recherche interne.
    Des questions sur Java : consultez le Forum Java. Des questions sur l'EDI Eclipse ou la plateforme Eclipse RCP : consultez le Forum Eclipse.
    Une question correctement posée et rédigée et vous aurez plus de chances de réponses adaptées et rapides.
    N'oubliez pas de mettre vos extraits de code entre balises CODE (Voir Mode d'emploi de l'éditeur de messages).
    Nouveau sur le forum ? Consultez Les Règles du Club.

  3. #3
    Membre confirmé
    Inscrit en
    Janvier 2010
    Messages
    113
    Détails du profil
    Informations forums :
    Inscription : Janvier 2010
    Messages : 113
    Par défaut
    Merci pour votre réponse.

    Est ce que je peux réduire au max la marge supérieure ou inférieure au niveau du programme pour gagner de l'espace sachant que j'imprime:

    format: A4
    imprimante: Microsoft XPS Document writer
    nombre de pages: 2000

    voici mon code:

    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
    public int print(Graphics g, PageFormat pageFormat, int page) throws PrinterException {
    		Graphics2D g2d = (Graphics2D) g;
    		int imageableWidth = (int)pageFormat.getImageableWidth();
    		int imageableHeight = (int)pageFormat.getImageableHeight();
     
    		PrintRequestAttributeSet attributs = new HashPrintRequestAttributeSet();
            PrinterJob travail = PrinterJob.getPrinterJob();
            PageFormat pageFormat2 = travail.getPageFormat(attributs);
            Paper papier = new Paper();
            papier.setSize(595, 842);
     
            pageFormat2.setPaper(papier);
            pageFormat2.setOrientation(PageFormat.PORTRAIT);
     
    		g2d.translate(pageFormat2.getImageableX(),pageFormat2.getImageableY());
     
    		new ArticlePrintModel(this.article1, g2d, imageableWidth, imageableHeight, this.group);
    		g2d.setStroke(new BasicStroke(1, BasicStroke.CAP_BUTT, BasicStroke.JOIN_BEVEL, 0, new float[] {1,2}, 0));
    		int pageYCenter = imageableHeight/2;
    		g2d.drawLine(0, pageYCenter, imageableWidth, pageYCenter);
     
    		if(this.article2!=null) {
    			g2d.translate(0, pageYCenter+40);
    			new ArticlePrintModel(this.article2, g2d, imageableWidth, imageableHeight/2, this.group);
    		}
     
    		return PAGE_EXISTS;
    	}
    Cordialement

  4. #4
    Modérateur
    Avatar de joel.drigo
    Homme Profil pro
    Ingénieur R&D - Développeur Java
    Inscrit en
    Septembre 2009
    Messages
    12 430
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D - Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2009
    Messages : 12 430
    Billets dans le blog
    2
    Par défaut
    Citation Envoyé par sitws Voir le message
    [...]sachant que j'imprime:

    format: A4
    imprimante: Microsoft XPS Document writer
    nombre de pages: 2000
    C'est très spécifique comme programme. C'est sûr que ce n'est pas pour imprimer de manière générale, ce sera uniquement sur cette imprimante ?

    Alors oui, tu peux faire ce que tu veux, mais ça ne risque de fonctionner que dans ton cas précis.

    [QUOTE=sitws;9717980][...]
    voici mon code:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    public int print(Graphics g, PageFormat pageFormat, int page) throws PrinterException {
    	/**...**/
    		PrintRequestAttributeSet attributs = new HashPrintRequestAttributeSet();
            PrinterJob travail = PrinterJob.getPrinterJob();
            PageFormat pageFormat2 = travail.getPageFormat(attributs);
            Paper papier = new Paper();
            papier.setSize(595, 842);
     
            pageFormat2.setPaper(papier);
            pageFormat2.setOrientation(PageFormat.PORTRAIT);
     
    /**...**/
    Alors non, ce code n'a rien à faire ici. La méthode print est là pour faire le "dessin" de ce qui est imprimé, pas pour lancer un job d'impression, et encore moins paramétrer le format et l'orientation, et c'est en tout cas bien trop tard pour le faire (puisqu'on est déjà en train d'imprimer). C'est dans l'action d'impression qu'on lance le job et le Printable c'est justement ta classe où il y'a cette méthode print.

    Si ton code est hyper spécifique, tu peux simplement ignorer l'imageablearea. C'est ça qui définit l'espace imprimable, donc le format hors marges.

    Si tu écris :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    public int print(Graphics g, PageFormat pageFormat, int page) throws PrinterException {
    		Graphics2D g2d = (Graphics2D) g;
                    g2d.draw(new Rectangle2D.Double(pageFormat.getImageableX(),
                                                pageFormat.getImageableY(),
                                                pageFormat.getImageableWidth(),
                                                pageFormat.getImageableHeight()));
    }
    le rectangle imprimé correspondra aux marges.

    Si tu écris :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    public int print(Graphics g, PageFormat pageFormat, int page) throws PrinterException {
    		Graphics2D g2d = (Graphics2D) g;
                    g2d.draw(new Rectangle2D.Double(0,
                                                0,
                                                pageFormat.getWidth(),
                                                pageFormat.getHeight()));
    }
    Tu dessineras dans l'ensemble de la feuille y compris donc dans les marges. Si tu imprimes ça sur du papier, tu verras si et comment ton rectangle est "coupé", ce qui te permettra de constater l'espace physiquement imprimable par ton imprimante.
    Donc ensuite, tu peux ajuster en trouvant l'espace maximal imprimable et utiliser ça comme base, du genre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    private static final double maMargeEnHaut = ...;
    private static final double maMargeEnBas = ...;
    public int print(Graphics g, PageFormat pageFormat, int page) throws PrinterException {
    		Graphics2D g2d = (Graphics2D) g;
    		int imageableWidth = (int)pageFormat.getImageableWidth();
    		int imageableHeight = (int)(pageFormat.getHeight()-maMargeEnHaut-maMargeEnBas);
     
                    /**....**/
                    g2d.translate(pageFormat2.getImageableX(),maMargeEnHaut);

    A noter qu'il ne faut pas retourner systématiquement PAGE_EXISTS, sinon tu vas imprimer une infinité de page. Il faut à un moment donné (lorsque tout est imprimé), retourner NO_SUCH_PAGE. Et il faut tenir compte du paramètre page, pour savoir quoi imprimer. On peut fonctionner en lazy, en dessinant tout et en translatant, mais avec 2000 pages, ça risque de prendre un temps de malade. On pourrait tout dessiner et cropper, mais ça peut prendre énormément de mémoire. Le meilleur compris est de translater, utiliser du clipping, et filtrer ce qu'on imprime. Le processus d'impression étant monothread, on peut faire du précalcul et stocker le résultat dans une variable).
    L'expression "ça marche pas" ne veut rien dire. Indiquez l'erreur, et/ou les comportements attendus et obtenus, et donnez un Exemple Complet Minimal qui permet de reproduire le problème.
    La plupart des réponses à vos questions sont déjà dans les FAQs ou les Tutoriels, ou peut-être dans une autre discussion : utilisez la recherche interne.
    Des questions sur Java : consultez le Forum Java. Des questions sur l'EDI Eclipse ou la plateforme Eclipse RCP : consultez le Forum Eclipse.
    Une question correctement posée et rédigée et vous aurez plus de chances de réponses adaptées et rapides.
    N'oubliez pas de mettre vos extraits de code entre balises CODE (Voir Mode d'emploi de l'éditeur de messages).
    Nouveau sur le forum ? Consultez Les Règles du Club.

Discussions similaires

  1. [Débutant] Marges gauche, droite, supérieur et inférieur dans un richtextbox
    Par thierry007 dans le forum VB.NET
    Réponses: 3
    Dernier message: 17/01/2015, 09h20
  2. Arrondir un nombre à sa valeur supérieure ou inférieure
    Par philben dans le forum Contribuez
    Réponses: 5
    Dernier message: 08/02/2013, 12h35
  3. [PHP-JS] Double chevron supérieur ou inférieur
    Par Korko Fain dans le forum Langage
    Réponses: 4
    Dernier message: 18/04/2007, 19h41
  4. [JTextPane] Comment laisser une marge supérieur?
    Par doudine dans le forum AWT/Swing
    Réponses: 5
    Dernier message: 21/06/2006, 11h59

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