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 :

non okay
QPainter::begin: A paint device can only be painted by one painter at a time.
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 page

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 :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
./htmltopdf http://www.developpez.net dossierDestination
(dossierDestination ne fonctionne pas encore, il faut aller le modifier directement dans le code source)