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 :

Impossible d'imprimer une simple String!


Sujet :

Langage Java

  1. #1
    Membre confirmé
    Inscrit en
    Mars 2007
    Messages
    179
    Détails du profil
    Informations forums :
    Inscription : Mars 2007
    Messages : 179
    Par défaut Impossible d'imprimer une simple String!
    Bonjour bonjour
    J'essaie depuis quelques temps déjà d'imprimer une pauvre petite chaîne de caractères via mon application Swing, sous PC... et là je suis vraiment en train de craquer parce que j'avance pas...
    C'est juste du cdoe, y a pas d'interface, j'essaie de me connecter à l'imprimante par défaut, et je fais ce qu'il faut, en utilisant le docFlavor :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    DocFlavor.STRING.TEXT_PLAIN
    Mon erreur c'est
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    sun.print.PrintJobFlavorException: invalid flavor
    Je comprends pas, c'est pourtant le plus simple, non? C'est le DocFlabor de base je pense.
    Je pète vraiment un cable là et je dois faire marcher çà pour demain soir, donc pleeeaaase aidez-moi je craque!!!

    Nico.

  2. #2
    Membre éclairé
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    314
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations forums :
    Inscription : Octobre 2004
    Messages : 314
    Par défaut
    Voici des exemples bien commenté pour lancer des impression

    clique ici

  3. #3
    Membre confirmé
    Inscrit en
    Mars 2007
    Messages
    179
    Détails du profil
    Informations forums :
    Inscription : Mars 2007
    Messages : 179
    Par défaut
    Hey merci pour le lien, j'ai regardé mais moi ce que je veux c'est imprimer une chaine de caractères, pas un composant Swing ou quoique ce soit. Du coup ton exemple ne peut pas s'appliquer (j'ai quand même vérifié, mais le printerJob attend un Printable, qui se créé à partir d'un Graphics... or moi je veux faire çà depuis mon serveur, donc pas de Swing...)

  4. #4
    Rédacteur
    Avatar de CyberChouan
    Homme Profil pro
    Directeur technique
    Inscrit en
    Janvier 2007
    Messages
    2 752
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Directeur technique
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Janvier 2007
    Messages : 2 752
    Par défaut
    Rien ne t'empêche d'utiliser la classe Graphics, même sans avoir d'IHM Swing sur ton serveur.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Graphics g = new Graphics();
    g.drawString("une chaîne", 0, 0);
    // impression de l'objet g...
    Avant de poster, pensez à regarder la FAQ, les tutoriaux, la Javadoc (de la JRE que vous utilisez) et à faire une recherche
    Je ne réponds pas aux questions techniques par MP: les forums sont faits pour ça
    Mes articles et tutoriaux & Mon blog informatique

  5. #5
    Membre confirmé
    Inscrit en
    Mars 2007
    Messages
    179
    Détails du profil
    Informations forums :
    Inscription : Mars 2007
    Messages : 179
    Par défaut
    OK merci j'essaierais demain matin mais bon c'est un poil tordu sachant qu'il y a plus simple mais que, allez savoir pourquoi, çà ne marche pas avec moi
    Je parle de PrintService, de DocPrintJob and so on....
    Je vous dirais ce qu'il en est.

  6. #6
    Rédacteur/Modérateur

    Avatar de bouye
    Homme Profil pro
    Information Technologies Specialist (Scientific Computing)
    Inscrit en
    Août 2005
    Messages
    6 897
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : Nouvelle-Calédonie

    Informations professionnelles :
    Activité : Information Technologies Specialist (Scientific Computing)
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Août 2005
    Messages : 6 897
    Billets dans le blog
    54
    Par défaut
    Citation Envoyé par CyberChouan Voir le message
    Rien ne t'empêche d'utiliser la classe Graphics, même sans avoir d'IHM Swing sur ton serveur.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Graphics g = new Graphics();
    g.drawString("une chaîne", 0, 0);
    // impression de l'objet g...
    Geuh ? Non ce n'est pas possible, Graphics etant une classe abstraite attachee a un "peripherique" (qui peut etre l'ecran, l'imprimante, une image, un fichier au format vectoriel, etc...), on ne peut pas l'instancier comme ca. Il faut l'obtenir d'une maniere ou d'une autre.

    nicdo77, cependant, meme si tu veux utiliser les PrintService (qui semblent avoir peu d'utilisateur par ici car les questions relatives a ces classes trouvent generalement peu de reponses), tu peux effectivement dans un premier temps tenter une impression directe avec le package d'impression (java.awt.print sur lequel repose les PrintService). Faire un Printable qui imprime du texte est assez simple et le Graphics en question (l'imprimante) t'est fourni par le PrinterJob que tu utiliseras. Sinon la methodologie est similaire a l'impression de composant : il faut dessiner dans le Graphics a l'aide de drawString(). Ensuite si le texte est long et fait plusieurs ligne il faut s'aider des objets permettant le layout du texte comme java.awt.font.TextLayout
    Merci de penser au tag quand une réponse a été apportée à votre question. Aucune réponse ne sera donnée à des messages privés portant sur des questions d'ordre technique. Les forums sont là pour que vous y postiez publiquement vos problèmes.

    suivez mon blog sur Développez.

    Programming today is a race between software engineers striving to build bigger and better idiot-proof programs, and the universe trying to produce bigger and better idiots. So far, the universe is winning. ~ Rich Cook

  7. #7
    Rédacteur
    Avatar de CyberChouan
    Homme Profil pro
    Directeur technique
    Inscrit en
    Janvier 2007
    Messages
    2 752
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Directeur technique
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Janvier 2007
    Messages : 2 752
    Par défaut
    Citation Envoyé par bouye Voir le message
    Geuh ? Non ce n'est pas possible, Graphics etant une classe abstraite attachee a un "peripherique" (qui peut etre l'ecran, l'imprimante, une image, un fichier au format vectoriel, etc...), on ne peut pas l'instancier comme ca. Il faut l'obtenir d'une maniere ou d'une autre.
    Oups...
    Autant pour moi. J'ai répondu trop rapidement sans même aller vérifier la javadoc de la classe: mea culpa.
    Avant de poster, pensez à regarder la FAQ, les tutoriaux, la Javadoc (de la JRE que vous utilisez) et à faire une recherche
    Je ne réponds pas aux questions techniques par MP: les forums sont faits pour ça
    Mes articles et tutoriaux & Mon blog informatique

  8. #8
    Membre confirmé
    Inscrit en
    Mars 2007
    Messages
    179
    Détails du profil
    Informations forums :
    Inscription : Mars 2007
    Messages : 179
    Par défaut
    Citation Envoyé par bouye Voir le message
    nicdo77, cependant, meme si tu veux utiliser les PrintService (qui semblent avoir peu d'utilisateur par ici car les questions relatives a ces classes trouvent generalement peu de reponses), tu peux effectivement dans un premier temps tenter une impression directe avec le package d'impression (java.awt.print sur lequel repose les PrintService). Faire un Printable qui imprime du texte est assez simple et le Graphics en question (l'imprimante) t'est fourni par le PrinterJob que tu utiliseras. Sinon la methodologie est similaire a l'impression de composant : il faut dessiner dans le Graphics a l'aide de drawString(). Ensuite si le texte est long et fait plusieurs ligne il faut s'aider des objets permettant le layout du texte comme java.awt.font.TextLayout
    C'st quand même fou qu'il y ait peu d'utilisateur de PrintService. Enfin je suis quand même pas le seul être humain à développer une app d'entreprise dont l'une des fonctionnalités est d'imprimer!!!
    Bon ben pour l'instant je vais feinter l'adversaire alors : j'enregistrerais le contenu dans un fichier texte que je vais essayer d'ouvrir directement... et l'utilsiateur ira l'imprimer lui-même.
    Peut-être que cette technique de Graphics et TextLayout marche, mais c'est pas le chemin le plus simple, y a moyen que j'y perde du temps, que je tombe sur d'autres problèmes.... Et un grand sage m'a un jour dit que si tu réussis à faire marcher ton code mais que tu ne sais pas pourquoi, alors il y a un souci....

    Donc MERCI pour vos solutions, merci vraiment mais je veux alelr au plus simple et plus maintenable et moins tordu.

    Donc voilà je repars donc depuis le début :
    Pourquoi mon imprimate ne veut pas reconnaître la flavor
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    DocFlavor.STRING.TEXT_PLAIN
    Pourtant 1) c'est une type de données de base il me semble
    2) si je me connecte depuis mon Mac (machine de dév) et que j'essaie le même code, l'imprimante (la même) reconnait ce type de données. C'est FOU quand même

  9. #9
    Modérateur
    Avatar de dinobogan
    Homme Profil pro
    ingénieur
    Inscrit en
    Juin 2007
    Messages
    4 073
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France

    Informations professionnelles :
    Activité : ingénieur
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 4 073
    Par défaut
    Citation Envoyé par nicdo77 Voir le message
    C'st quand même fou qu'il y ait peu d'utilisateur de PrintService. Enfin je suis quand même pas le seul être humain à développer une app d'entreprise dont l'une des fonctionnalités est d'imprimer!!!
    Pour ma part, j'utilise iText pour générer du PDF, et ensuite un programme externe (Foxit reader) pour imprimer. Ca marche nickel, jamais eu le moindre soucis, et la qualité d'impression est excellente.
    D'autres programmes génèrent une BufferedImage qui est enregistrée (jpeg, gif, png...) et imprimée toujours via un programme externe (Irfan Viewer par exemple).
    Ses impressions sont "offscreen", elle ne sont pas affichées pour l'utilisateur.
    Lorsque j'aurai le temps, je chercherais une solution pour ne pas passer par le disque dur. Mais comme on dit : "ça marche, pas le temps de faire mieux, on passe à autre chose..."
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java
    Que la force de la puissance soit avec le courage de ta sagesse.

  10. #10
    Membre confirmé
    Inscrit en
    Mars 2007
    Messages
    179
    Détails du profil
    Informations forums :
    Inscription : Mars 2007
    Messages : 179
    Par défaut
    Hey çà m'intéresse ce que tu dis, mais suis pas sûr d'avoir compris.
    Dans ton exemple de IrfanViewer par exemple, est-ce que tu peux tout faire via ton code Java? genre lancer IrfanViewer et demander à l'application d'imprimer? Ou l'impression reste un geste utilisateur (et du coup faut sauvegarder sur le disque, bla bla bla)?

  11. #11
    Membre confirmé
    Inscrit en
    Mars 2007
    Messages
    179
    Détails du profil
    Informations forums :
    Inscription : Mars 2007
    Messages : 179
    Par défaut
    Ouais j'en ai essayé d'autres.
    L'une d'elles marchent: DocFlavor.INPUT_STREAM_AUTOSENSE.
    Le probleme avec çà, c'est que c'est pour les flux de bytes.
    Et par exemple, si je l'utilise avec un texte qui dépasse la largeur de la page (une très grande ligne sans retour chariot)... ben il va pas à la ligne lors de l'impression. Bizarre quand même non?
    De plus, il semble avoir un problème avec l'encodage...

  12. #12
    Modérateur
    Avatar de dinobogan
    Homme Profil pro
    ingénieur
    Inscrit en
    Juin 2007
    Messages
    4 073
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France

    Informations professionnelles :
    Activité : ingénieur
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 4 073
    Par défaut
    Citation Envoyé par nicdo77 Voir le message
    Hey çà m'intéresse ce que tu dis, mais suis pas sûr d'avoir compris.
    Dans ton exemple de IrfanViewer par exemple, est-ce que tu peux tout faire via ton code Java? genre lancer IrfanViewer et demander à l'application d'imprimer? Ou l'impression reste un geste utilisateur (et du coup faut sauvegarder sur le disque, bla bla bla)?
    Le principe : tu écris sur le disque une image ou un PDF en 100% Java. Ensuite, toujours en Java, tu lances un programme externe avec le fichier en paramètre.
    Irfan Viewer (pour les images) ou Foxit Reader (pour le PDF) acceptent entre autre un fichier en paramètre. Pour Irfan Viewer, l'utilisateur ne s'en rend pas compte. Par contre, Foxit Reader s'ouvre avec le contenu du fichier, ce qui fait pour l'utilisateur un "aperçu avant impression". Les viewer acceptent très souvent pleins de paramètres différents. A toi de trouver celui qui te convient et de lire la doc associée ;-)
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java
    Que la force de la puissance soit avec le courage de ta sagesse.

  13. #13
    Membre confirmé
    Inscrit en
    Mars 2007
    Messages
    179
    Détails du profil
    Informations forums :
    Inscription : Mars 2007
    Messages : 179
    Par défaut
    Citation Envoyé par dinobogan Voir le message
    Le principe : tu écris sur le disque une image ou un PDF en 100% Java. Ensuite, toujours en Java, tu lances un programme externe avec le fichier en paramètre.
    Irfan Viewer (pour les images) ou Foxit Reader (pour le PDF) acceptent entre autre un fichier en paramètre. Pour Irfan Viewer, l'utilisateur ne s'en rend pas compte. Par contre, Foxit Reader s'ouvre avec le contenu du fichier, ce qui fait pour l'utilisateur un "aperçu avant impression". Les viewer acceptent très souvent pleins de paramètres différents. A toi de trouver celui qui te convient et de lire la doc associée ;-)
    OK ouais c'est la solution que j'ai trouvée pour l'instant. Je laisse les logiciels imprimer eux-même.
    Donc je mets mon texte dans un .txt et je l'ouvre ainsi :

    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
    Process p = null;
            try {
     
                if (runsOnMac()){
                    p = Runtime.getRuntime().exec("open " + absolutePath);
                } else if (runsOnWindows()){
                    p = Runtime.getRuntime().exec("rundll32 SHELL32.DLL,ShellExec_RunDLL " + absolutePath);
                }
     
     
                p.waitFor();
                LOG.info("Launched file " + absolutePath);
            } catch (InterruptedException e) {
                e.printStackTrace();  //To change body of catch statement use File | Settings | File Templates.
            } catch (IOException e) {
                e.printStackTrace();  //To change body of catch statement use File | Settings | File Templates.
            }
            return true;
    et

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
        public static boolean runsOnMac(){
            String osName = System.getProperty("os.name");
            return (osName.indexOf("Mac")>-1);
        }
     
        public static boolean runsOnWindows(){
            String osName = System.getProperty("os.name");
            return (osName.indexOf("Windows")>-1);
        }

  14. #14
    Modérateur
    Avatar de dinobogan
    Homme Profil pro
    ingénieur
    Inscrit en
    Juin 2007
    Messages
    4 073
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France

    Informations professionnelles :
    Activité : ingénieur
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 4 073
    Par défaut
    Oui, c'est ça. C'est catastrophique pour la portabilité, mais c'est royal pour la qualité des imprimés. La gestion de l'impression, c'est le plus gros reproche que je fais à Java depuis le début.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java
    Que la force de la puissance soit avec le courage de ta sagesse.

  15. #15
    Membre confirmé
    Inscrit en
    Mars 2007
    Messages
    179
    Détails du profil
    Informations forums :
    Inscription : Mars 2007
    Messages : 179
    Par défaut
    Héhé.
    Je dois avouer que j'ai tiré une petite larme en écrivant ce code, mon éthique de la programmation en a pris un coup ;-)

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

Discussions similaires

  1. [WD16] Impossible d'imprimer une table sur PDF
    Par Céroline77 dans le forum WinDev
    Réponses: 6
    Dernier message: 04/04/2014, 11h50
  2. [IIS 7.5] Impossible d'exécuter une simple page aspx sur IIS
    Par abbepierre94 dans le forum IIS
    Réponses: 0
    Dernier message: 05/07/2012, 00h02
  3. transformer un vecteur<string> en une simple string
    Par Ganondorf dans le forum Débuter
    Réponses: 16
    Dernier message: 21/08/2010, 10h24
  4. Impossible d'afficher une simple image
    Par Space23 dans le forum Servlets/JSP
    Réponses: 1
    Dernier message: 20/07/2008, 21h20
  5. impossible de supprimer une imprimate réseau
    Par sony351 dans le forum Administration
    Réponses: 4
    Dernier message: 27/10/2005, 12h30

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