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

Discussion :

Impression avec mise en page CSS sur Windows

  1. #1
    Membre du Club Avatar de gael21
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2016
    Messages
    44
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Cameroun

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

    Informations forums :
    Inscription : Mai 2016
    Messages : 44
    Points : 41
    Points
    41
    Par défaut Impression avec mise en page CSS sur Windows
    Bonsoir à tous !
    Je viens vers vous après près de 4 jours de recherche sur les forums.
    Je m'explique:
    je veux faire une impression (pdf) sur format A4 d'un contenu comportant une image et du texte.
    Enfait ce contenu n'est que pour mon test avant de pouvoir l'adapter à mon réel projet.
    Le souci c'est que j'ai utilisé au début la fonction renderr(). Mais elle me
    sortait juste une capture d'écran très affreuse. On m'a conseillé de passer par le html
    et d'utiliser la fonction setHtml(). Je l'ai fait et le code est plus bas.
    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
     
    int main(int argc, char *argv[])
    {
        QApplication a(argc, argv);
     
        QPrinter printer(QPrinter::PrinterResolution);
        printer.setOutputFormat(QPrinter::PdfFormat);
        printer.setOrientation(QPrinter::Portrait);
        printer.setPaperSize(QPrinter::A4);
        //printer.setOutputFileName(fileName);
        printer.setOutputFormat(QPrinter::NativeFormat);
        QPrintDialog orintDialogue(&printer);
        if(orintDialogue.exec() == 1)
        {
            QTextDocument doc;
            QString html("<html><head><meta charset='utf-8' /><style>img{width:50px; height:50px;} ul{list-style-type: none;font-size:1.5em; width:22%; height:200px; float:right; margin-right:100px; margin-bottom:10px; margin-top:25px;}#p{margin-top:100px; margin-bottom:0px;} #titre_principal{color:blue; width:30%; margin-right:68%;} #logo{width:20%; height:150px; margin-bottom: 0px;} h1{font-size:2.2em; font-weight:normal; margin-left:-17px; width:20%;} h2{font-size:1.3em; font-weight:normal; margin-top:-30px; margin-bottom:50px; margin-left:30px;} header{font-family: Helvetica, Arial, serif;}</style><title>Premiers tests du CSS</title></head><body><header><nav><ul><li> Douala, le .............</li><li><div id='p'>Le Principal</li></ul></nav><div id='titre_principal'><img src='C:/Users/Gaël/Pictures/modif/logo.jpg' alt='Logo college' id='logo' /><h1>I.P.F.</h1><h2>Institut Polyvalent Fosso</h2></div></header></body></html>");
     
            Qt::convertFromPlainText(html);
            doc.setHtml(html);
            //doc.setPageSize(printer.pageRect().size()); //permet de cacher le numero de page lord de l'impression
     
            doc.print(&printer);
        }
     
        return a.exec();
    }
    Resultat:
    J'obtiens bien un fichier pdf avec tout le contenu souhaité, sauf que la mise en forme n'est pas prise en compte. Dans mon CSS, j'utilise le positionnement absolu avec la propriété float, les bordures, et bien plus encore.

    J'ai replongé dans les forums et parfois même dans la documentation de Qt, et resultat, j'ai compris que les bordures, le positionnement absolu ne sont pas pris en compte par Qt sur l'OS Windows, mais ça l'est par contre sur LINUX. Etant sur Windows, j'ai regardé du côté de la documentation et il me semble que QPrintDialog peut bien m'aider. Le souci c'est que je ne comprends pas très bien la doc malgré son excellente structuration.

    S'il vous plaît aidez moi. C'est grave de mon côté, et je ne parle même pas de la pression que j'ai déjà sur mon projet réel. Je veux imprimer en pdf un contenu html, contenant une mise en forme CSS avec les bordures, le positionnement absolu et bien plus encore.

  2. #2
    Expert éminent sénior
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 614
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 614
    Points : 30 626
    Points
    30 626
    Par défaut
    Salut,

    Attention! Si tu veux créer un pdf à partir d'un document HTML, tu dois respecter les règles propres au HTML en ce qui concerne le média utilisé pour la sortie; surtout si le document HTML en question doit prendre une forme différente s'il est affiché dans un navigateur de celle qu'il devrait prendre s'il sert de base à la génération d'un fichier pdf

    L'idéal est alors de créer deux CSS distinctes:
    1. l'une, qui sera utilisée au travers de la balise <link rel="stylesheet" type="text/css" href="styles.css"> pour la représentation dans un navigateur et
    2. l'autre, qui sera utilisée au travers de la balise <link rel="stylesheet" type="text/css" href="impression.css" media="print"> dans le cadre de la génération du pdf


    (tu auras compris que les noms des fichiers "style.css" et "impressions.css" sont à ta bonne convenance )
    A méditer: La solution la plus simple est toujours la moins compliquée
    Ce qui se conçoit bien s'énonce clairement, et les mots pour le dire vous viennent aisément. Nicolas Boileau
    Compiler Gcc sous windows avec MinGW
    Coder efficacement en C++ : dans les bacs le 17 février 2014
    mon tout nouveau blog

  3. #3
    Membre du Club Avatar de gael21
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2016
    Messages
    44
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Cameroun

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

    Informations forums :
    Inscription : Mai 2016
    Messages : 44
    Points : 41
    Points
    41
    Par défaut
    Bonjour
    Merci Koala01 pour ta reponse.
    Mais je ne vois pas comment le fait d'avoir 02 feuille de style parrait m'aider.
    Je rappelle ici que le souci c'est le fait que certaines propriétés du CSS n'ont
    aucun effet sur l'OS Windows. Alors en procédant comme tu le me proposes, quelles
    propriétés du CSS je devrai utiliser pour le positionnement par exemple?
    A ce propos, j'ai pensé à l'utilisation d'un autre langage pour y arriver(le Python
    par exemple, même si je ne m'y connais pas).
    SVP aidez moi

  4. #4
    Expert éminent sénior
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 614
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 614
    Points : 30 626
    Points
    30 626
    Par défaut
    Cela fait un temps bête que je n'ai plus joué avec les CSS, donc je ne suis sans doute plus vraiment à jour. Mais il me semble que tu pourrais t'inspirer de ce tutoriel qui me semble pas mal.
    A méditer: La solution la plus simple est toujours la moins compliquée
    Ce qui se conçoit bien s'énonce clairement, et les mots pour le dire vous viennent aisément. Nicolas Boileau
    Compiler Gcc sous windows avec MinGW
    Coder efficacement en C++ : dans les bacs le 17 février 2014
    mon tout nouveau blog

  5. #5
    Membre du Club Avatar de gael21
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2016
    Messages
    44
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Cameroun

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

    Informations forums :
    Inscription : Mai 2016
    Messages : 44
    Points : 41
    Points
    41
    Par défaut
    Toujours pas de solution.
    J'essayé de laisser tomber le positionnement (absolu, relatif et fixe) au profit des marges. en effet, je me suis dit qu'en jouant avec les marges (margin-top, margin-left,...), je pouvais reussir. Sauf que même là, la mise en forme n'est pas appliquée.
    Là présentement j'ai vu dans la doc que je pouvais me servir de la classe QTextLayout pour dessiner n'importe où en me servant de la classe QTextCursor.
    alors je vais me lancer dans ce sens et vous reviens dès qu'il y a du nouveau.

  6. #6
    Membre du Club Avatar de gael21
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2016
    Messages
    44
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Cameroun

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

    Informations forums :
    Inscription : Mai 2016
    Messages : 44
    Points : 41
    Points
    41
    Par défaut
    C'est encore moi qui reviens bredouille de mes aventures avec Qt pour faire une impression en pdf. J'ai trouvé très fastidieux la méthode d'utiliser lun QTextLayout en me servant d'un QTextCursor. De plus, cette méthode n'est pas flexible. Par exemple, si je veux imprimer dans mon projet final des tonnes de tables dont le nombre de colonnes diffère, je serai obligé de faire autant de QTextLayout que j'aurai d'impression à faire...Catastroph!!!

    Alors j'ai cherché du côté de QPdfWritter mais ça n'a rien donné de bon sauf si quelqu'un a réussi de son côté.

    Mais ce lien https://doc.qt.io/archives/qtjambi-4...intsystem.html m'a mis sur une bonne piste. En fait il se trouve qu'en combinant QPainter, QPaintEngine et QPrintEngine, je peux réussir à faire ce que je veux. Mais pour cela, je devrai construire mon propre moteur d'impression en dérivant à la fois de QPaintEngine et QPrintEngine, et en réimplémentant la méthode void paintEvent(QPaintEvent *event). Plus bas se trouve mon Impression.cpp

    Le souci c'est que je ne connais absolument pas comment faire dans mon constructeur. J'ai l'intention de faire de cette classe, la classe de toutes mes fonctions d'impression; il me faut donc configurer mon moteur d'impression dans le/les constructeur de cette classe. Par exemple parmi les valeurs de l'enum type de la classe QPaintEngine, se trouve des valeurs relatives ausystème d'exploitation. et puisque ce qui ne marche pas chez moi(sur Windows) marche sur LINUX, j'aimerai pouvoir modifier cette valeur pour voire ce qui se passe.

    Mais je ne sais pas comment m'y prendre. En gros là presentement j'aimerai construire mon moteur d'impression . SOS
    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
    #include "impression.h"
     
    Impression::Impression(QString texte, QString titre, QWidget *parent)
        : QWidget(parent), m_texte(texte), m_titre(titre)
    {
     
    }
     
    Impression::Impression(QWidget *parent) :  QWidget(parent)
    {
     
    }
     
    void Impression::paintEvent(QPaintEvent *event)
    {
        QPainter *painter = new QPainter(this);
        QTextDocument doc;
        doc.setHtml("<strong>What's wrong</strong> with <em>this code?</em>");
        QAbstractTextDocumentLayout::PaintContext context;
        doc.setPageSize(QSize(2100,2970));
        doc.documentLayout()->draw(painter, context);
     
        delete painter;
    }
     
    Impression::~Impression()
    {
     
    }

  7. #7
    Responsable Qt & Livres


    Avatar de dourouc05
    Homme Profil pro
    Ingénieur de recherche
    Inscrit en
    Août 2008
    Messages
    26 618
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur de recherche
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2008
    Messages : 26 618
    Points : 188 593
    Points
    188 593
    Par défaut
    Qu'as-tu tenté avec QPdfWriter ? Intuitivement, c'est cette piste-là que j'explorerais en premier. Un petit exemple d'utilisation : https://stackoverflow.com/a/44757658/1066843.

    Si ça ne marche pas trop, tu as encore des bibliothèques externes : https://wiki.qt.io/Handling_PDF#Usin...arty_libraries. Ton idée de tout recoder me paraît assez hasardeuse…
    Vous souhaitez participer aux rubriques Qt (tutoriels, FAQ, traductions) ou HPC ? Contactez-moi par MP.

    Créer des applications graphiques en Python avec PyQt5
    Créer des applications avec Qt 5.

    Pas de question d'ordre technique par MP !

  8. #8
    Membre du Club Avatar de gael21
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2016
    Messages
    44
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Cameroun

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

    Informations forums :
    Inscription : Mai 2016
    Messages : 44
    Points : 41
    Points
    41
    Par défaut
    Bonsoir
    Merci dourouc05 pour ta réponse.
    J'ai regardé ton premier lien mais j'ai déjà essayé ce code sous toutes ses formes et le rendu CSS n'est toujours pas totalement pris en compte.
    En ce qui concerne l'utilisation des bibliothèques externes, je vais regarder çà demain soir et te faire un rapport. Mais si tu as une bibliothèque particulière à me proposer, fais-le stp. De preference celle qui utilise du code C++. Merci encore.

    En fait, je ne pourrai regarder le coté des bibliothèques externes que demain soir car je suis censé terminer mon projet demain avant 15h. Alors j'ai opté pour les impressions passer par un navigateur internet. en fait mon programme construira le fichier html en fonction de la requete effectuée, et transmettra ce fichier html au navigateur. Du coup, c'est le navigateur qui fera l'impression à la demande de l'utilisateur. C'est ce que j'ai pensé faire vu le temps qu'il me reste. Mais je vais revenir sur ce problème demain soir car il est vital pour moi d'avoir la solution pour mes prochains projets.

  9. #9
    Responsable Qt & Livres


    Avatar de dourouc05
    Homme Profil pro
    Ingénieur de recherche
    Inscrit en
    Août 2008
    Messages
    26 618
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur de recherche
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2008
    Messages : 26 618
    Points : 188 593
    Points
    188 593
    Par défaut
    Quand tu as une date butoir qui s'approche, n'importe quelle solution qui fonctionne convient .

    Sinon, une nouvelle piste qui vient de me venir : pourquoi ne pas garder ton rendu HTML actuel et utiliser Qt WebEngine pour l'afficher dans ton application et lancer l'impression ? Depuis Qt 5.13, une extension pour les PDF est incluse dans le module.

    Pour les bibliothèques externes, a priori, je partirais sur Hummus, qui a l'air d'être la plus maintenue (https://github.com/galkahana/PDF-Writer), mais je n'ai pas d'expérience dans le domaine.
    Vous souhaitez participer aux rubriques Qt (tutoriels, FAQ, traductions) ou HPC ? Contactez-moi par MP.

    Créer des applications graphiques en Python avec PyQt5
    Créer des applications avec Qt 5.

    Pas de question d'ordre technique par MP !

  10. #10
    Membre du Club Avatar de gael21
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2016
    Messages
    44
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Cameroun

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

    Informations forums :
    Inscription : Mai 2016
    Messages : 44
    Points : 41
    Points
    41
    Par défaut
    Bonjour
    J'ai eu l'idée de l'utiliser ce QWebEngine car j'ai même trouvé le code source de ses fonctions sur le net. Le souci c'est que j'utilise Qt5.11.2 avec mingw sur windows et malheureusement ce module n'est pas pris en compte par le compilateur mingw de ma version de Qt.
    pour l'utilisation des bibliothèques externes, j'ai trouvé la bibliothèque html2pdf. Mais j'ai beau modifié mon .pro comme recommandé mais ca ne marche pas. il y'a toujours des trucs qui manque.
    Peux-tu m'aider dans ce sens? Dois-je commencer par changer ma version de Qt pour pouvoir utiliser cette bibliothèque?

    Pour la bibliothèque Hummus, je vais me renseigner sur son mode d'emploi ce soir. Un grand merci d'ailleurs pour tes réponses. Je te tiens informé de la suite

Discussions similaires

  1. [OL-2007] impression d'un mail en pdf avec mise en page
    Par jehnkira dans le forum VBA Outlook
    Réponses: 1
    Dernier message: 11/12/2012, 11h16
  2. Mise en page CSS avec position relative
    Par hugo7 dans le forum Mise en page CSS
    Réponses: 13
    Dernier message: 13/08/2009, 12h54
  3. Impression d'un userform avec mise en page automatique
    Par cindy1808 dans le forum Macros et VBA Excel
    Réponses: 1
    Dernier message: 16/04/2008, 16h05
  4. [AJAX] Perte de mise en page css avec UpdatePanel
    Par mappy dans le forum Général JavaScript
    Réponses: 1
    Dernier message: 13/01/2008, 20h53
  5. Réponses: 11
    Dernier message: 17/05/2006, 10h48

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