Bonjour,
Je souhaite pouvoir générer automatiquement des fichiers au format PDF dans une application.
D'après mes renseignements, le plus simple est de créer un contenu HTML que l'on assigne à un QTextDocument que l'on affiche à l'aide d'un QPrinter qui est configuré pour générer un document PDF.
Cette solution me convient parfaitement car mes données sont dans des fichiers XML et que je peux ainsi utiliser XSLT pour générer le code HTML.
Mon problème est que l'impression en PDF ne prends pas en compte la totalité du code CSS, rendant mon affichage incohérent.
J'aimerais donc savoir si cela vient d'une mauvaise utilisation de Qt de ma part ou si cette méthode de génération de PDF est limitée dans le nombre de propriété CSS reconnues.
Mon code :
Je vous épargne la partie XML/XSLT ainsi que XHTML/CSS car le résultat contenu dans la variable "html" rends bien un affichage correcte que ce soit dans un navigateur classique ou dans un QWebView.
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 QXmlQuery requeteXml(QXmlQuery::XSLT20); QString cheminFichierXml = "donnees/2009/167.xml"; QString cheminFichierXsl = "donnees/demandesToPdf.xsl"; if (!QFile::exists(cheminFichierXml)) { throw new FileNotExistsException(cheminFichierXml); } if (!requeteXml.setFocus(QUrl(cheminFichierXml))) { throw new FileCantBeReadException(cheminFichierXml); } if (!QFile::exists(cheminFichierXsl)) { throw new FileNotExistsException(cheminFichierXsl); } requeteXml.setQuery(QUrl(cheminFichierXsl)); if (!requeteXml.isValid()) { throw new FileCantBeReadException(cheminFichierXsl); } QString html; requeteXml.evaluateTo(&html); QTextDocument doc; doc.setHtml(html); doc.print(&printer);
Merci d'avance pour votre aide.
[ EDIT ]
Bonjour,
Dans mon cas le problème venait de deux choses différentes.
Premièrement, pensez à vérifier l'attribut "media" de la balise de déclaration de votre CSS.
Deuxièmement, il semble être préférable de passer par un QWebView que par un QTextDocument pour obtenir un résultat correct. Effectivement le QTextDocument ne prends pas correctement en compte le CSS. Pour preuve, peut importe la valeur de l'attribut "media" le résultat est le même.
Ci-dessous un récapitulatif du code nécessaire :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8 QString html; // Contient le code HTML de votre page QPrinter printer(QPrinter::PrinterResolution); printer.setOutputFileName("mon_fichier.pdf"); printer.setOutputFormat(QPrinter::PdfFormat); QWebView webView; webView.setHtml(html); webView.print(&printer);
Partager