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

Langage Java Discussion :

Imprimer directement depuis un programme java


Sujet :

Langage Java

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    129
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Septembre 2006
    Messages : 129
    Points : 81
    Points
    81
    Par défaut Imprimer directement depuis un programme java
    Bonjour

    Je cherche depuis quelques temps une solution pour imprimer directement depuis le code source les rapports générés par mon application. Je les génère en HTML au départ (mais si il faut j'arrive déjà à les transformer en PDF et d'autres conversions sont certainement faisables).

    Je rencontre divers problemes :
    * en utilisant la bibliothèque javax.print.*; j'arrive a imprimer mais uniquement le contenu du HTML donc les balises HTML y compris (hors je veux uniquement le "rendu" évidemment. J'ai également essayer d'imprimer des PDF de cette manière. Malheureusement l'attribut DocFlavor.INPUT_STREAM.PDF n'est pas réellement implémenté malgré ce que son nom pourrait laisser entendre...
    * En cherchantici même j'ai déterré ce topic (http://www.developpez.net/forums/showthread.php?t=53139) qui me permetrait de fusionner mes en tetes, corps de page et pied de page etc... mais malheureusement chez moi le code fournit n'est pas vraiment fonctionnel (la partie centrale n'apparait pas, le texte est concentré sur la partie gauche de la page et va a la ligne beaucoup trop tot, et encore d'autres soucis...).

    Donc voilà je voudrais savoir s'il existe une solution à mon problème je pense avoir cherché en vain jusqu'a présent pour quelque chose de vraiment fonctionnel...

    Merci!

  2. #2
    Membre confirmé
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    365
    Détails du profil
    Informations personnelles :
    Localisation : Maroc

    Informations forums :
    Inscription : Janvier 2006
    Messages : 365
    Points : 495
    Points
    495
    Par défaut
    Salut,
    J'ai eu ce même type de problème pour imprimer directement depuis un programme Java. L'API javax.print.* est intéressante, mais malheureusement la plupart des DocFlavor ne sont pas toujours supportées par les différentes imprimantes. Il faut donc des "Renderer" pour imprimer un type particulier de document, d'où le problème avec les documents PDF car il n'existe pas encore de "Renderer" de PDF supporté dans Java. Par contre, pour les documents HTML, on peut utiliser le composant JEditorPane et l'api java.awt.print.* C'est ce qui est fait dans le topic que tu cites et c'est ce que j'ai fait aussi. Je te donne ici un code qui fonctionne chez moi.
    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
     
    import java.awt.Graphics;
    import java.awt.Graphics2D;
    import java.awt.print.PageFormat;
    import java.awt.print.Printable;
    import java.io.File;
    import java.io.IOException;
    import java.net.MalformedURLException;
    import java.net.URL;
    import javax.swing.JEditorPane;
    import javax.swing.JOptionPane;
    import javax.swing.text.html.HTMLDocument;
    import javax.swing.text.html.HTMLEditorKit;
     
     
    public class MyHTMLEditorPane extends JEditorPane implements Printable {
     
        /** Creates a new instance of MyHTMLEditorPane */
        public MyHTMLEditorPane() {
            String filePath = "C:\\Projects\\doc\\print_sample.html";
            File file = new File(filePath);
            URL url = null;
            try {
                url = file.toURL();
                createDocument();
                setPage(url);
                setEditable(false);
            }
            catch (MalformedURLException e) {
                JOptionPane.showMessageDialog(null, "Erreur url : " + e.getMessage(), "URL error", JOptionPane.ERROR_MESSAGE);
            }
            catch (IOException e) {
                JOptionPane.showMessageDialog(null, "Erreur IO : " + e.getMessage(), "IO error", JOptionPane.ERROR_MESSAGE);
            }
        }
     
        // Creates the associated document
        private void createDocument() {
            HTMLEditorKit kit = new HTMLEditorKit();
            setEditorKit(kit);
            setDocument((HTMLDocument)kit.createDefaultDocument());
            setContentType("text/html");
        }
     
        public int print(Graphics g, PageFormat pf, int pageIndex) {
            if (pageIndex > 0) {
                return Printable.NO_SUCH_PAGE;
            }
            Graphics2D g2 = (Graphics2D)g;
     
            // Calculate the scale factor to fit the component to the page
            double scaleX = pf.getImageableWidth() / getWidth();
            double scaleY = pf.getImageableHeight() / getHeight();
     
            double scale = Math.min(scaleX, scaleY); // get the minimum factor       
     
            // Move paper origin to page printing area corner
            g2.translate(pf.getImageableX(), pf.getImageableY());
            g2.scale(scale, scale); // Apply the scale factor
     
            // Draw the component
            print(g2);
            return Printable.PAGE_EXISTS;        
        }
     
    }
    Et voici un code pour tester cet objet "Printable" :
    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
     
    import java.awt.print.PageFormat;
    import java.awt.print.Paper;
    import java.awt.print.PrinterException;
    import java.awt.print.PrinterJob;
    import javax.print.PrintService;
    import javax.swing.JOptionPane;
     
    public class TestPrinter {
     
        private MyHTMLEditorPane htmlEditorPane = null;    
     
        /** Creates a new instance of TestPrinter */
        public TestPrinter(MyHTMLEditorPane htmlPane) {
            this.htmlEditorPane = htmlPane;
        }
     
        public void printDocument() {
            PrinterJob printJob = PrinterJob.getPrinterJob();
            // Get the default print service
            PrintService printer = printJob.getPrintService();
            if (printer == null) {
                JOptionPane.showMessageDialog(null, "Pas d'imprimante disponible", "Erreur d'impression", JOptionPane.ERROR_MESSAGE);
                return;
            }
     
            // set up the page format
            PageFormat pageFormat = printJob.defaultPage();
            Paper paper = pageFormat.getPaper();
            paper.setImageableArea(48, 72, paper.getWidth() - 2*48.0, paper.getHeight() - 2*72.0); // Tu indiques les valeurs que tu veux ici
            pageFormat.setPaper(paper); 
     
            // set the Printable object
            printJob.setPrintable(htmlEditorPane, pageFormat);
     
            if (printJob.printDialog()) {
                try {
                    printJob.print();
                }
                catch (PrinterException pe) {
                    JOptionPane.showMessageDialog(null, "Erreur lors de l'impression", "Print error", JOptionPane.ERROR_MESSAGE);
                }
            }
        }
     
        public static void main(String[] args) {        
            MyHTMLEditorPane html = new MyHTMLEditorPane();
            html.setSize(666, 482); // Tu peux indiquer tes propres valeurs
            (new TestPrinter(html)).printDocument();        
        }    
    }
    Evidemment, tu peux très bien ajouter un objet "MyHTMLEditorPane" dans un JScrollPane pour l'affichage dans une fenêtre Swing.
    Ah, autre chose, ce code ne permet d'imprimer qu'une seule page (à cause de la condition
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    if (pageIndex > 0) {
                return Printable.NO_SUCH_PAGE;
            }
    dans la méthode print() ci-dessus. Evidemment on pourrait réfléchir à un algorithme qui permettrait de déterminer le nombre de page à imprimer afin d'adapter cette condition d'arrêt. Je pense que c'est ce qui est fait dans le topic que tu cites. De même, ceci ne prend pas en compte le besoin de header et footer identiques pour toutes les pages imprimées. Je pense que là encore il faudrait approfondir avec le topic dont tu as donné le lien.
    Voilà, j'espère que ça t'aide.

  3. #3
    Membre régulier
    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    129
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Septembre 2006
    Messages : 129
    Points : 81
    Points
    81
    Par défaut
    Merci je vais étudier un peu tout ça!

    C'est quand même étonnant qu'il n'existe pas de manière "plus simple" pour faire ça, c'est quand même fort utile pour toute application...

Discussions similaires

  1. Ecouter http://localhost:PP depuis un programme java
    Par benwit dans le forum Langage
    Réponses: 9
    Dernier message: 09/03/2007, 11h11
  2. Réponses: 7
    Dernier message: 08/01/2007, 12h11
  3. Lancer un programme java depuis un programme java
    Par TheBAT dans le forum Entrée/Sortie
    Réponses: 6
    Dernier message: 06/01/2007, 16h45
  4. Réponses: 5
    Dernier message: 20/02/2006, 14h11
  5. Problème sur la commande COPY depuis un programme Java
    Par klereth dans le forum PostgreSQL
    Réponses: 10
    Dernier message: 10/02/2006, 14h14

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