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

PyQt Python Discussion :

Créer un PDF à partir d'un code HTML et CSS [QtGui]


Sujet :

PyQt Python

  1. #1
    Membre actif
    Homme Profil pro
    Conseil - Consultant en systèmes d'information
    Inscrit en
    Octobre 2008
    Messages
    330
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France

    Informations professionnelles :
    Activité : Conseil - Consultant en systèmes d'information
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2008
    Messages : 330
    Points : 207
    Points
    207
    Par défaut Créer un PDF à partir d'un code HTML et CSS
    Bonjour à tous,

    Je voudrais créer un pdf en partant d'un code HTML adosser à un CSS.
    Le problème est que le CSS ne semble pas être pris en compte à travers le processus
    J'ai essayé le code généré de l'ouvrir ans le navigateur et il a l'air correcte. Par contre lors de l'impression les informations contenu dans le fichier CSS ne sont pas intégrés (J'essaie de modifier la l'apparence du quadrillage d'une table)
    Quelqu'un a t-il une piste pour régler ce problème.
    J'ai essayé d'intégrer directement le code CSS dans le HTML mais le résultat est identique.
    Voici les morceaux de code
    Code du HTML
    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
     
            self.html = r"""
    <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
    <html lang="fr">
    <head>
    <link media="all" href="style.css" type="text/css" rel="stylesheet" />
      <title>Test Impression avec HTML et CSS</title>
    </head>  
    <body style="direction: ltr;">
    <br>
    <br>
    <div style="position: absolute; margin-left: 5669px;">
    Test de precision
    <br>
    </div>
    <br>
    <br>
    Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Aenean commodo ligula eget dolor. Aenean massa. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Donec quam felis, ultricies nec, pellentesque eu, pretium quis, sem. Nulla consequat massa quis enim. Donec pede justo, fringilla vel, aliquet nec, vulputate eget, arcu. In enim justo, rhoncus ut, imperdiet a, venenatis vitae, justo. Nullam dictum felis eu pede mollis pretium. Integer tincidunt. Cras dapibus. Vivamus elementum semper nisi. Aenean vulputate eleifend tellus. Aenean leo ligula, porttitor eu, consequat vitae, eleifend ac, enim. Aliquam lorem ante, dapibus in, viverra quis, feugiat a, tellus. Phasellus viverra nulla ut metus varius laoreet. Quisque rutrum. Aenean imperdiet. Etiam ultricies nisi vel augue. Curabitur ullamcorper ultricies nisi. Nam eget dui. Etiam rhoncus. Maecenas tempus, tellus eget condimentum rhoncus, sem quam semper libero, sit amet adipiscing sem neque sed ipsum. Nam quam nunc, blandit vel, luctus pulvinar, hendrerit id, lorem. Maecenas nec odio et ante tincidunt tempus. Donec vitae sapien ut libero venenatis faucibus. Nullam quis ante. Etiam sit amet orci eget eros faucibus tincidunt. Duis leo. Sed fringilla mauris sit amet nibh. Donec sodales sagittis magna. Sed consequat, leo eget bibendum sodales, augue velit cursus nunc, <br>
    Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Aenean commodo ligula eget dolor. Aenean massa. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Donec quam felis, ultricies nec, pellentesque eu, pretium quis, sem. Nulla consequat massa quis enim. Donec pede justo, fringilla vel, aliquet nec, vulputate eget, arcu. In enim justo, rhoncus ut, imperdiet a, venenatis vitae, justo. Nullam dictum felis eu pede mollis pretium. Integer tincidunt. Cras dapibus. Vivamus elementum semper nisi. Aenean vulputate eleifend tellus. Aenean leo ligula, porttitor eu, consequat vitae, eleifend ac, enim. Aliquam lorem ante, dapibus in, viverra quis, feugiat a, tellus. Phasellus viverra nulla ut metus varius laoreet. Quisque rutrum. Aenean imperdiet. Etiam ultricies nisi vel augue. Curabitur ullamcorper ultricies nisi. Nam eget dui. Etiam rhoncus. Maecenas tempus, tellus eget condimentum rhoncus, sem quam semper libero, sit amet adipiscing sem neque sed ipsum. Nam quam nunc, blandit vel, luctus pulvinar, hendrerit id, lorem. Maecenas nec odio et ante tincidunt tempus. Donec vitae sapien ut libero venenatis faucibus. Nullam quis ante. Etiam sit amet orci eget eros faucibus tincidunt. Duis leo. Sed fringilla mauris sit amet nibh. Donec sodales sagittis magna. Sed consequat, leo eget bibendum sodales, augue velit cursus nunc, <br>
     border="1" cellpadding="2" cellspacing="2">
    <br>
    <table cellpadding="4" style="border: 10px double #004251; border-collapse: collapse;" border="1">
      <tbody>
        <tr>
          <td >machin</td>
          <td>toto</td>
          <td>truc</td>
          <td>bidule</td>
        </tr>
        <tr>
          <td>machine 1</td>
          <td></td>
          <td></td>
          <td></td>
        </tr>
        <tr>
          <td>machine 2</td>
          <td></td>
          <td></td>
          <td></td>
        </tr>
        <tr>
          <td> machine 3</td>
          <td></td>
          <td></td>
          <td></td>
        </tr>
      </tbody>
    </table>
    <br>
    Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Aenean commodo ligula eget dolor. Aenean massa. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Donec quam felis, ultricies nec, pellentesque eu, pretium quis, sem. Nulla consequat massa quis enim. Donec pede justo, fringilla vel, aliquet nec, vulputate eget, arcu. In enim justo, rhoncus ut, imperdiet a, venenatis vitae, justo. Nullam dictum felis eu pede mollis pretium. Integer tincidunt. Cras dapibus. Vivamus elementum semper nisi. Aenean vulputate eleifend tellus. Aenean leo ligula, porttitor eu, consequat vitae, eleifend ac, enim. Aliquam lorem ante, dapibus in, viverra quis, feugiat a, tellus. Phasellus viverra nulla ut metus varius laoreet. Quisque rutrum. Aenean imperdiet. Etiam ultricies nisi vel augue. Curabitur ullamcorper ultricies nisi. Nam eget dui. Etiam rhoncus. Maecenas tempus, tellus eget condimentum rhoncus, sem quam semper libero, sit amet adipiscing sem neque sed ipsum. Nam quam nunc, blandit vel, luctus pulvinar, hendrerit id, lorem. Maecenas nec odio et ante tincidunt tempus. Donec vitae sapien ut libero venenatis faucibus. Nullam quis ante. Etiam sit amet orci eget eros faucibus tincidunt. Duis leo. Sed fringilla mauris sit amet nibh. Donec sodales sagittis magna. Sed consequat, leo eget bibendum sodales, augue velit cursus nunc, <br>
    <br>
    fin<br>
    <br>
    </body>
    </html>
        """
    Code du CSS :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    table, td
    {
    	/* border-width: 1px; */
    	border-collapse: collapse; 
    	border: 3px solid red;
    }
    p
    {
    	text-align: center;
    }
    code pour ouvrir directement dans le navigateur
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
            path = os.path.abspath('temp.html')
            self.url = 'file://' + path
     
            with open(path, 'w') as f:
                f.write(self.html)
            webbrowser.open(self.url)
    et le code qui ne fonctionne pas pour imprimer en pdf à partir du HTML et du CSS :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
            self.html1 = self.html.decode('utf-8')
            self.nomfichierpdf = u"html.pdf"
            printer = QtGui.QPrinter(QtGui.QPrinter.HighResolution)
            printer.setOutputFileName(self.nomfichierpdf) 
            printer.setOutputFormat(QtGui.QPrinter.PdfFormat)
            doc = QtGui.QTextDocument()
            doc.setHtml(self.html1)
            doc.print_(printer);
            os.startfile(self.nomfichierpdf)
    Merci pour vos pistes

  2. #2
    Expert éminent
    Avatar de tyrtamos
    Homme Profil pro
    Retraité
    Inscrit en
    Décembre 2007
    Messages
    4 462
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2007
    Messages : 4 462
    Points : 9 249
    Points
    9 249
    Billets dans le blog
    6
    Par défaut
    Bonjour,

    J'utilise pas mal ce genre de technique, et j'ai regardé un peu ton code.

    Je confirme que ton fichier .css est bien pris en compte: il suffit d'ajouter ceci à la fin du texte css:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    td {
        background-color:yellow;
        }
    pour voir toutes les cases du tableau avoir un fond jaune.

    Mais les autres lignes ne semblent pas être prises en compte: j'y vois plusieurs raisons:

    - dans le fichier html, table a DEJA une instruction "style=...", et il est possible qu'elle ait priorité. A mon avis, il faut choisir entre le fichier css ou les instructions "style" dans le html pour un même tag.

    - le "rich text" n'est qu'un sous-ensemble du html, et toutes les options ne sont pas reconnues. Par exemple, je n'ai pas vu "border-collapse" pour "table" dans la doc de Qt4. Voir ici: https://qt-project.org/doc/qt-4.8/ri...ml-subset.html.

    - et il y a des erreurs dans le "rich text": par exemple, j'ai mis les cases du tableau en jaune avec background-color, mais la doc dit que c'est bgcolor qui devrait marcher (mais qui ne marche pas).

    Bref, cette possibilité de fabriquer du pdf avec du html (pardon, du "rich text") est vraiment très intéressante, mais il y a malheureusement un tâtonnement inévitable et quelquefois long pour arriver à ce qu'on veut.

    Je fais avec ça plusieurs centaines de courriers personnalisés par an, avec entête, bas de page, images, tableaux, gestion multi-pages, extraction de base de données, etc... et j'en suis très satisfait.
    Un expert est une personne qui a fait toutes les erreurs qui peuvent être faites, dans un domaine étroit... (Niels Bohr)
    Mes recettes python: http://www.jpvweb.com

  3. #3
    Membre actif
    Homme Profil pro
    Conseil - Consultant en systèmes d'information
    Inscrit en
    Octobre 2008
    Messages
    330
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France

    Informations professionnelles :
    Activité : Conseil - Consultant en systèmes d'information
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2008
    Messages : 330
    Points : 207
    Points
    207
    Par défaut
    Merci Tyrtamos pour toutes tes informations.
    J'ai bien "nettoyé" le html. J'ai ajouté ton morceau de code et effectivement ca fonctionne.
    Par contre, j'ai toujours des problèmes avec les alignements que ce soit avec les paragraphes (p) ou avec les cellules (td ou th).
    J'ai essayé plusieurs formulations mais aucune ne fonctionne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    align: center;
    text-align: center;
    align_text: center;
    @+

  4. #4
    Expert éminent
    Avatar de tyrtamos
    Homme Profil pro
    Retraité
    Inscrit en
    Décembre 2007
    Messages
    4 462
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2007
    Messages : 4 462
    Points : 9 249
    Points
    9 249
    Billets dans le blog
    6
    Par défaut
    Bonjour,

    Effectivement, "align" n'existe pas dans les options css (http://doc-snapshot.qt-project.org/4...ock-attributes). C'est un cas où il faut utiliser une option html.

    Par exemple, ajoute ça dans ton code html:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <p align="center";>toto</p>
    Et tu verras le "toto" être affiché au milieu de la page.

    Il y a plein d'astuces comme ça qu'on trouve petit à petit.

    Dans mes codes, j'utilise assez peu les fichiers css parce qu'ils posent des problèmes dans certains cas (traitement cx_freeze): je préfère ajouter les options css au code html avec le tag "style", soit dans le head pour ce qui est général dans la page, soit dans les tags html directement. Par exemple:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <p align="center"; style="font-size:xx-large;">toto</p>
    Le texte "toto" apparaitra dans le pdf au milieu de la ligne ("align"=>option html) et en gros ("font-size"=>option css)

    A noter: os.startfile est spécifique à Windows et c'est un peu dommage de casser les bonnes dispositions du code Python à faire du multiplateforme. Voilà ce que j'utilise pour afficher n'importe quel fichier ou adresse web en appelant le programme par défaut de l'OS:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    def affiche_url(chu):
        """affiche chu (chaine unicode) avec le programme par défaut de l'OS
           chu peut être une adresse web ou un fichier sur disque
        """
        if os.path.exists(chu):
            # ajoute "file:///" si nécessaire
            url = QtCore.QUrl.fromLocalFile(os.path.abspath(chu))
        else:
            # ajoute "http://" si nécessaire
            url = QtCore.QUrl.fromUserInput(chu)
        # appelle le programme par défaut pour affichage de l'url
        QtGui.QDesktopServices.openUrl(url)
    Un expert est une personne qui a fait toutes les erreurs qui peuvent être faites, dans un domaine étroit... (Niels Bohr)
    Mes recettes python: http://www.jpvweb.com

  5. #5
    Membre actif
    Homme Profil pro
    Conseil - Consultant en systèmes d'information
    Inscrit en
    Octobre 2008
    Messages
    330
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France

    Informations professionnelles :
    Activité : Conseil - Consultant en systèmes d'information
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2008
    Messages : 330
    Points : 207
    Points
    207
    Par défaut
    Merci pour tes infos. J'avais déjà parcouru la page que tu donnes en lien mais je n'avais pas bien percuté que les options de "Block attributes" ne s'appliquaient pas au CSS .
    Enfin tout devrait rentrer dans l'ordre maintenant.
    Je voudrais pouvoir créer dynamiquement le code HTML pour pouvoir imprimer le contenu d'une QTableView en gérant les sauts de page, header, footer sans coupure du tableau en bas de page ...
    J'ai trouvé un petit utilitaire Markup.py http://markup.sourceforge.net/ qui devrait soulager mon code et qui permet également d'intégrer des styles dans les tags.
    J'essaie tout çà et je reviendrai si besoin
    @+

  6. #6
    Expert éminent
    Avatar de tyrtamos
    Homme Profil pro
    Retraité
    Inscrit en
    Décembre 2007
    Messages
    4 462
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2007
    Messages : 4 462
    Points : 9 249
    Points
    9 249
    Billets dans le blog
    6
    Par défaut
    Citation Envoyé par Triton972 Voir le message
    Je voudrais pouvoir créer dynamiquement le code HTML pour pouvoir imprimer le contenu d'une QTableView en gérant les sauts de page, header, footer sans coupure du tableau en bas de page ...
    Si tu y arrives pour un QTableView, ça m'intéresse!

    Pour un QTableView (que j'utilise pour visualiser une table d'une base de données), j'utilise pour l'instant une extraction csv pour reprise dans Excel, mais ça demande encore de la manipulation dans Excel dont je pourrais me passer.
    Un expert est une personne qui a fait toutes les erreurs qui peuvent être faites, dans un domaine étroit... (Niels Bohr)
    Mes recettes python: http://www.jpvweb.com

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

Discussions similaires

  1. Réponses: 2
    Dernier message: 08/04/2015, 20h47
  2. [FPDF] Créer un PDF à partir de mes données de MySQL
    Par legrec dans le forum Bibliothèques et frameworks
    Réponses: 4
    Dernier message: 23/07/2007, 09h53
  3. Créer un pdf à partir de delphi
    Par Petzouille57 dans le forum Delphi
    Réponses: 4
    Dernier message: 17/11/2006, 10h05
  4. [ezPDF] Générer du PDF à partir d'un formulaire HTML
    Par Shyboy dans le forum Bibliothèques et frameworks
    Réponses: 2
    Dernier message: 08/08/2006, 11h33
  5. créer un pdf à partir d'un formulaire
    Par PrinceMaster77 dans le forum ASP
    Réponses: 4
    Dernier message: 04/05/2006, 22h38

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