2016-09-30 2 views
1

Я хочу создать pdf-файл из html и CSS-файла. В настоящее время я пытаюсь использовать QT с помощью QWebView, поскольку QwebEngineView не поддерживается для Ubuntu, поскольку нет MVC2013 или хрома.QT html и CSS для создания pdf без QWebEngineView

Я хочу, чтобы создатель был независимым от платформы. Я показываю весь код здесь

QDir::setCurrent(QCoreApplication::applicationDirPath()); 

    QFile htmlFile ("myhtml.html"); 
    if (!htmlFile.open(QIODevice::ReadOnly | QIODevice::Text)){ 
     return -1; 
    } 


    QWebView *pWebView = new QWebView(); 
    pWebView->load(QUrl::fromLocalFile(QFileInfo(htmlFile).path())); 


    QPrinter printer(QPrinter::HighResolution); 
    printer.setPageSize(QPrinter::A4); 
    printer.setOutputFormat(QPrinter::PdfFormat); 

    printer.setOutputFileName("output.pdf"); 

    pWebView->print(&printer); 
    delete pWebView; 

Файл HTML выглядит следующим образом

<html> 

<head> 
    <link rel="stylesheet" href="style.css" /> 
</head> 
<body> 
    <h1> <center> ULTRA TECH LABORATORIES PRIVATE LIMITED </center> </h1> 
    <h3> <center> CLOTH MARKET, G.E. ROAD KUMHARI, DIST-DRUG(C.G.) </center> </h3> 
    <h1> <center> TLD MONITORING SERVICE - DOSE REPORT </center> </h1> 
    <p> 
     INSTITUTION NO. 017303 
     <span>SERVICE PERIOD: APR-JUN 2012</span> 
    </p> 
    <p> 
     ASHOK LABORATORY, KOLKATA 
     <span>SERVICE FREQUENCY: QUARTERLY</span> 
    </p> 
    <center> 
     <ul> 
     <li>lorem ipsum dolor</li> 
     <li>sit amet</li> 
     <li>foo</li> 
     <li>bar</li> 
     </ul> 
    </center> 
</body> 

Файл CSS выглядит следующим образом

ul { 
    width: 500px; 
    } 
li { 
     width: 50%; 
     float: left; 
     border: 1px solid #000; 
     margin: 0; 
     list-style-type: none; 
     box-sizing: border-box; 
} 
li:nth-child(odd) { 
    clear: left; 
} 

p { 
    text-align:left; 
} 
span { 
    float:right; 
} 
+0

Я также попытался QWebView :: setHtml() и QWebView :: setDefaultStyleSheet() Они также дают неформатированный вывод. – user3864806

+0

Я нахожу эту библиотеку wkhtmltopdf, которая использует QtWebKit для этого. Я пытаюсь выяснить, как они это делают, но код испорчен. – user3864806

ответ

0

Во-первых, заменить

pWebView->load(QUrl::fromLocalFile(QFileInfo(htmlFile).path())); 

в

pWebView->load(QUrl::fromLocalFile(QFileInfo(htmlFile).absoluteFilePath())); 

Я не изменить что-то в HTML или CSS. Css находится рядом с html.

Затем выполните сохранение в pdf в слот, подключенный к сигналу loadFinished. Потому что, когда вы сохраняете страницу в pdf, она еще не загружена.

connect (pWebView,SIGNAL(loadFinished(bool)), this,SLOT(savePDF(bool))); 

и

void Form::savePDF(bool ok) 
{ 
    QPrinter printer(QPrinter::HighResolution); 
    printer.setPageSize(QPrinter::A4); 
    printer.setOutputFormat(QPrinter::PdfFormat); 
    printer.setOutputFileName("output.pdf"); 
    ui->webView->print(&printer); 
} 

После того, как ваш код работает для меня.

Edit:

Я использую Form класс только для тестирования, вам нужно поместить код в свой класс.

form.h:

class Form: public QObject{ 
    Q_OBJECT 

public: 
    explicit Form(QObject * parent = 0); 

private: 
    QWebView* webView; 

private slots: 
    void savePDF(bool ok); 
}; 

form.cpp:

Form::Form(QObject *parent): 
    QObject(parent) 
{ 

    webView = new QWebView(); 
    QFile htmlFile ("html/index.html"); 
    if (!htmlFile.open(QIODevice::ReadOnly | QIODevice::Text)){ 
     qDebug()<<"nosuch file"; 
    } 
    webView->load(QUrl::fromLocalFile(QFileInfo(htmlFile).absoluteFilePath())); 
    connect (webView,SIGNAL(loadFinished(bool)), this,SLOT(savePDF(bool))); 
    webView->show(); //comment it to hide webview windows 
} 

void Form::savePDF(bool ok) 
{ 
    QPrinter printer(QPrinter::HighResolution); 
    printer.setPageSize(QPrinter::A4); 
    printer.setOutputFormat(QPrinter::PdfFormat); 
    printer.setOutputFileName("output.pdf"); 
    webView->print(&printer); 
} 
+0

Можете ли вы дать мне все файлы? Что такое класс формы? Где вы пишете функцию подключения? – user3864806

+0

Объект :: connect: нет такого слота MainWindow :: savePDF (bool) эта ошибка появилась в моем коде во время выполнения. – user3864806

Смежные вопросы