Bonjour à tous,
je suis débutant en Qt et je cherche à faire un petit programme pour exporté une page html en pdf.
Donc l'idée c'est d'utiliser QWebPage pour interpréter une page html et ensuite de l'exporté en PDF avec QPrinter. J'ai deux classes : webview qui s'occupe des donnés relative à QWebPage et Print qui s'occupe des données de QPrinter.
Dans le main j'ai liée le signale loadFinished au slot PrintPDF
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10 Print *pdf = new Print(args); webview *nav = new webview(); nav->setPrinter(pdf->getPrinter()); if(nav->load(args) == false) { qDebug() << "can't load page"; return 0; } //when the page page is ready, we will print it QObject::connect(nav->getFrame(), SIGNAL(loadFinished(bool)), nav, SLOT(printPDF(bool)));
et donc voici ma classe webview.cpp
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 #include "webview.h" webview::webview() { page = new QWebPage; printer = 0; } webview::~webview() { delete page; } bool webview::load(Arguments *args) { QRegularExpression url("^(file|http)://"); QRegularExpression fullPath("^/"); QRegularExpressionMatch pathMatch = fullPath.match(args->getSource()); QRegularExpressionMatch urlMatch = url.match(args->getSource()); // see http://qt-project.org/doc/qt-4.8/qwebsettings.html#WebAttribute-enum for more informations page->settings()->setAttribute(QWebSettings::LocalStorageEnabled, true); page->settings()->setAttribute(QWebSettings::AutoLoadImages, true); page->settings()->setAttribute(QWebSettings::JavascriptEnabled, true); page->settings()->setAttribute(QWebSettings::PrintElementBackgrounds, true); page->settings()->setAttribute(QWebSettings::PluginsEnabled, true); if(pathMatch.hasMatch()) { page->mainFrame()->load(QUrl::fromLocalFile(args->getSource())); } else { if (urlMatch.hasMatch()) { page->mainFrame()->load(QUrl(args->getSource())); } else { fprintf(stderr, "%s\n", qPrintable(QApplication::translate("main", "Error: Invalide source file"))); return false; } } return true; } void webview::printPDF(bool ok) { if(ok == true) { qDebug() << "okay"; } else qDebug() << "non okay"; if(printer != 0) page->mainFrame()->print(printer); }
et donc voici ce que j'ai en console :
Donc j'ai remarquer que dans la méthode printPDF si je créer une variable local ça supprime le message : "QPainter::begin: A paint device can only be painted by one painter at a time", c'est étrange parce que je passe le pointeur de QPrinter (donc ça devrais pointé sur la même classe ...) mais de toute façon ça imprime une page blanche (en gros j'ai vraiment l'impréssion que le problème viens du chargement de la pagenon okay
QPainter::begin: A paint device can only be painted by one painter at a time.
J'ai vraiment aucune idée d'où l'erreur peux venir. Je vous donne les sources : http://paf.im/9zSsL
Les arguments à passer sont :
(dossierDestination ne fonctionne pas encore, il faut aller le modifier directement dans le code source)
Code : Sélectionner tout - Visualiser dans une fenêtre à part ./htmltopdf http://www.developpez.net dossierDestination
Partager