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 du HTML


Sujet :

Langage Java

  1. #1
    Nouveau membre du Club
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Décembre 2012
    Messages
    37
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Service public

    Informations forums :
    Inscription : Décembre 2012
    Messages : 37
    Points : 29
    Points
    29
    Par défaut Imprimer du HTML
    Mon application génère du HTML que je voudrais imprimer (pas le code HTML mais le rendu). Je passe par un JEditorPane et ça fonctionne bien... sauf que je voudrais:
    a) que les pages soient numérotées (sauf la première page).
    b) que le traitement des "break-page" soit pris en compte et entraîne bien un changement de page (au pire le changement de page doit pouvoir être pris en compte via le CSS pour les h1 et h2, actuellement c'est via un attribut "style").

    Je peux générer les "pages" HTML isolément (dans un List<String> par exemple) pour bien identifier les changements de page forcés au lieu d'utiliser le "page-break" dans le HTML.

    Si vous avez un code fonctionnel, ou une API à m'indiquer, je vous en remercie.

  2. #2
    doc
    doc est déconnecté
    Membre averti

    Profil pro
    Inscrit en
    Août 2002
    Messages
    86
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2002
    Messages : 86
    Points : 416
    Points
    416
    Par défaut
    peut être imprimer au format Pdf avec des API comme flyingsaucer ou openhtmltopdf
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  3. #3
    Nouveau membre du Club
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Décembre 2012
    Messages
    37
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Service public

    Informations forums :
    Inscription : Décembre 2012
    Messages : 37
    Points : 29
    Points
    29
    Par défaut
    Merci du conseil, j'y avais effectivement pensé mais je ne voudrais pas ajouter une dépendance supplémentaire. Ce que je cherche c'est le code d'une class HtmlPrinter qui puisse directement imprimer le HTML fourni. Par exemple dans mon appli j'ai créé les class "ComponentPrinter" et "TablePrinter", ce qui me manque pour compléter c'est une "HtmlPrinter".

  4. #4
    Expert éminent sénior
    Homme Profil pro
    Analyste/ Programmeur
    Inscrit en
    Juillet 2013
    Messages
    4 631
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Analyste/ Programmeur

    Informations forums :
    Inscription : Juillet 2013
    Messages : 4 631
    Points : 10 558
    Points
    10 558

  5. #5
    Modérateur

    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    12 551
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 551
    Points : 21 607
    Points
    21 607
    Par défaut
    Pas compris ce que t'essaie de dire, foetus.

    Pour favdb, j'ai quand même un peu l'impression que tu réalises pas la somme de travail que représente un moteur de rendu CSS. Java en proposait un petit peu à l'époque, comme accompagnement de son style de document HTML simplifié, et il en propose encore un petit peu en ces temps modernes avec JavaFX. Mais une véritable implémentation qui fonctionne au point où on peut dire que ça gère CSS comme un navigateur que quelqu'un utiliserait gère CSS ? Soyons déjà heureux qu'il existe des solutions tierces, en lieu et place que seuls les deux moteurs de rendu de navigateurs le fassent.

    A mon avis, tu perds rien à attendre quelques jours de recherche des fois que quelqu'un connaisse un truc qui t'ira mieux, mais 'faut pas trop compter dessus indéfiniment. En termes réalistes, il est peu probable qu'il y ait grand-chose de plus que ce que tu as déjà vu.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  6. #6
    Expert éminent sénior
    Homme Profil pro
    Analyste/ Programmeur
    Inscrit en
    Juillet 2013
    Messages
    4 631
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Analyste/ Programmeur

    Informations forums :
    Inscription : Juillet 2013
    Messages : 4 631
    Points : 10 558
    Points
    10 558
    Par défaut
    Citation Envoyé par thelvin Voir le message
    Pas compris ce que t'essaie de dire, foetus.
    Dans tes feuilles CSS, tu peux rajouter des Media Queries. Et tu en as 1 (en mettant le type de média à print) pour gérer comment rendre ta page HTML lors de l'impression.

    Après, il faut savoir à quel niveau le CSS est géré et si ce Media Queries fonctionne et comment

    Édit 1: 1 truc comme cela
    Code css : 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
    @media print {
      header, footer, aside, form {
        display: none;
      }
    }
     
    @page:right{
      @bottom-right {
        content: counter(page);
      }
    }
     
    @page:left{
      @bottom-left {
        content: counter(page);
      }
    }

    Édit 2: après quelques tests et 1 peu de recherche, il semblerait que les 16 positions pour @page ne fonctionnent pas (@top-left-corner, @top-left, @top-middle, @top-right, @top-right-corner, @left-top, @left-middle, @left-bottom, @right-top, @right-middle, @right-bottom, @bottom-left-corner, @bottom-left, @bottom-middle, @bottom-right, @bottom-right-corner)
    Il faut comme d'habitude soit passer par des bidouilles avec des div et/ ou javascript, soit utiliser des solutions payantes soit afficher les entêtes/ pieds de page de l'impression
    Donc voila les Media Queries était la meilleure solution, mais dans la réalité cela ne sert à rien pour l'impression parce que le support est partiel.

  7. #7
    Modérateur

    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    12 551
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 551
    Points : 21 607
    Points
    21 607
    Par défaut
    .... Et... Tu as essayé ces media queries dans un document HTML que tu imprimes avec JEditorPane ?
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  8. #8
    Nouveau membre du Club
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Décembre 2012
    Messages
    37
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Service public

    Informations forums :
    Inscription : Décembre 2012
    Messages : 37
    Points : 29
    Points
    29
    Par défaut
    Citation Envoyé par thelvin Voir le message
    .... Et... Tu as essayé ces media queries dans un document HTML que tu imprimes avec JEditorPane ?
    D'après ce que j'ai lu et compris ça ne peut pas marcher dans la mesure où le JEditorPane traite du HTML3 avec CSS1.

  9. #9
    Nouveau membre du Club
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Décembre 2012
    Messages
    37
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Service public

    Informations forums :
    Inscription : Décembre 2012
    Messages : 37
    Points : 29
    Points
    29
    Par défaut
    Finalement, j'ai trouvé la solution, elle était très simple et ne correspondait pas du tout à ce que j'avais cherché initialement. Je la mets ci-après pour ceux qui chercheraient la même chose:
    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
     
    	public static void printHtml(Component parent, String html, String header, String footer) {
    		String xheader = header == null || header.isEmpty() ? "" : header,
    		   xfooter = footer == null || footer.isEmpty() ? "{0}" : footer;
    		JEditorPane t = new JEditorPane("text/html", html);
     
    		PrinterJob pj = PrinterJob.getPrinterJob();
    		if (pj.printDialog()) {
    			PrintService ps = pj.getPrintService();
    			try {
    				t.print(new MessageFormat(xheader), new MessageFormat(xfooter), false, ps, null, true);
    				JOptionPane.showMessageDialog(parent,
    				   I18N.getMsg("print.ok"),
    				   I18N.getMsg("print"),
    				   JOptionPane.INFORMATION_MESSAGE);
    			} catch (PrinterException ex) {
    				LOG.err("Printing error", ex);
    				JOptionPane.showMessageDialog(parent,
    				   I18N.getMsg("print.error", ex.getLocalizedMessage()),
    				   I18N.getMsg("print"),
    				   JOptionPane.ERROR_MESSAGE);
    			}
    		}
    	}
    À noter que le I18N est la gestion de l'internationalisation dans mon logiciel et LOG mon module de signalement des erreurs.

    Merci à ceux qui avaient tenté de m'aider.

  10. #10
    Modérateur

    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    12 551
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 551
    Points : 21 607
    Points
    21 607
    Par défaut
    Oui donc pour les page breaks t'as laissé tomber, quoi.

    Enfin au moins ça permet d'imprimer les numéros de page sans se prendre la tête, je savais pas que JEditorPane avait nativement des trucs pour ça.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  11. #11
    Nouveau membre du Club
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Décembre 2012
    Messages
    37
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Service public

    Informations forums :
    Inscription : Décembre 2012
    Messages : 37
    Points : 29
    Points
    29
    Par défaut
    Citation Envoyé par thelvin Voir le message
    Oui donc pour les page breaks t'as laissé tomber, quoi.
    Oui, je pense que ce n'est pas possible en l'état. Il faudrait re-dévopper le JTextComponent.print pour faire ça.

  12. #12
    Nouveau membre du Club
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Décembre 2012
    Messages
    37
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Service public

    Informations forums :
    Inscription : Décembre 2012
    Messages : 37
    Points : 29
    Points
    29
    Par défaut
    Voici une version qui force le saut de page. En réalité ça génère une nouvelle tâche d'impression pour chaque page virtuelle.
    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
     
    	public static void printHtml(Component component, List<String> ls, String header, String footer) {
    		HTMLEditorKit kit = new HTMLEditorKit();
    		try {
    			PrinterJob printJob = PrinterJob.getPrinterJob();
    			if (printJob.printDialog()) {
    				PrintService ps = printJob.getPrintService();
    				JEditorPane ed = new JEditorPane();
    				printJob.setPrintable(new ComponentPrinter.ComponentPrintable(ed, true));
    				ed.setEditorKit(kit);
    				ed.setContentType("text/html");
    				for (int n = 0; n < ls.size(); n++) {
    					ed.setText(ls.get(n));
    					ed.print(new MessageFormat(header),
    					   new MessageFormat(footer + " " + (n+1) + ".{0}"),
    					   false, ps, null, true);
    				}
    			}
    		} catch (PrinterException ex) {
    			ex.printStackTrace(System.err);
    		}
    	}
    La liste des pages "List<String> ls" correspond aux pages HTML complètes (avec les tags de début, du header, du body, et ceux de la fin). Le
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    new MessageFormat(footer + " " + (n+1) + ".{0}")
    permet d'avoir une numérotation sous la forme "page 1.1" sinon la numérotation repart à 1, sachant que footer est passé avec le texte "page".

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

Discussions similaires

  1. Comment imprimer du HTML
    Par weabow dans le forum Débuter avec Java
    Réponses: 9
    Dernier message: 26/06/2013, 06h13
  2. Imprimer du HTML
    Par hannibal.76 dans le forum Débuter
    Réponses: 5
    Dernier message: 18/05/2012, 10h40
  3. [D7][IE]Faire imprimer un html
    Par jbat dans le forum Web & réseau
    Réponses: 3
    Dernier message: 08/02/2009, 11h26
  4. Réponses: 22
    Dernier message: 17/02/2006, 11h51
  5. [VB6] Imprimer directement une page html
    Par Debra dans le forum VB 6 et antérieur
    Réponses: 4
    Dernier message: 23/04/2004, 11h24

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