Qt实现生成PDF文档

零、前言

Qt生成pdf方法网上也有很多,但是大多树都是单独生成文字的PDF或者单独生成图片的PDF,要把文字和图片同时生成在一张PDF文件上还真不那么容易。

本文采用的两种方法生成PDF,一种是使用html文件的方法生成PDF文件,另一种是采用QPainter绘制的方法。两种方法都不简单,但我倾向于使用html的方法。html的方法和生成word的方法差不多,可以参考我的博客中生成word的方法:http://blog.csdn.net/toby54king/article/details/79101303。

第二种方法是采用QPainter的方法,这种方法需要注意QPainter的使用,什么时候开始绘制,什么时候结束绘制。两种方法都需要使用QPrinter,所以需要在.pro文件中加入printsupport模块。

一、html生成PDF

html生成PDF效果图:
Qt实现生成PDF文档_第1张图片

二、QPainter方法生成PDF

QPainter方法生成PDF效果图:
Qt实现生成PDF文档_第2张图片

三、核心代码

/***************************.h*************************************/
#ifndef WIDGET_H
#define WIDGET_H

#include 
#include 

namespace Ui {
class Widget;
}

class Widget : public QWidget
{
    Q_OBJECT

public:
    explicit Widget(QWidget *parent = 0);
    ~Widget();

    /// 设置PDF文件名字
    void setPdfName(QString fileName);
    /// 写入文字到pdf上
    void writeTextToPdf(QString text);
    /// 插入图片到PDF上
    void insertPictureToPdf(QString picFile);
    /// 结束绘制
    void endPainter();

    /// html转化为PDF
    QString saveHtmlToPDF();

private:
    Ui::Widget *ui;
    QPrinter *m_printer;
    QPainter *m_painter;
    int m_x;
    int m_y;
};

#endif // WIDGET_H

/***************************.cpp*************************************/
#include "widget.h"
#include "ui_widget.h"
#include 
#include 
#include 

Widget::Widget(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::Widget)
{
    ui->setupUi(this);
    m_printer = new QPrinter;
    m_painter = new QPainter;
    m_x = 0;
    m_y = 0;

    QString pdfname = "E:/testhtmlpdf.pdf";
    QPrinter printer;
    printer.setOutputFormat(QPrinter::PdfFormat);
    printer.setOutputFileName(pdfname);
    QTextDocument document;
    QString html = saveHtmlToPDF();
    document.setHtml(html);
    document.print(&printer);
    document.end();
}

Widget::~Widget()
{
    delete ui;
}

//************************************
// 函数名称:setPdfName
// 函数说明:设置PDF文件名字并启动绘制
// 作    者:ISmileLi
//************************************
void Widget::setPdfName(QString fileName)
{
    m_printer->setPageSize(QPrinter::A4);
    m_printer->setOutputFormat(QPrinter::PdfFormat);
    m_printer->setOutputFileName(fileName);
    m_painter->begin(m_printer);
}

//************************************
// 函数名称:writeTextToPdf
// 函数说明:写入文字到PDF
// 作    者:ISmileLi
//************************************
void Widget::writeTextToPdf(QString text)
{
    if(m_printer == NULL)
        return;

    int height = 10;
    int width = 300;
    m_painter->drawText(m_x,m_y,width,height,0,text);
    m_y += height;
}

//************************************
// 函数名称:insertPictureToPdf
// 函数说明:插入图片到PDF
// 作    者:ISmileLi
//************************************
void Widget::insertPictureToPdf(QString picFile)
{
    if(m_printer == NULL)
        return;

    QPixmap *pixmap = new QPixmap(picFile);

    int width = pixmap->width();
    int height = pixmap->height();
    m_painter->drawPixmap(m_x,m_y,width,height,*pixmap);
    m_y += height;
}

//************************************
// 函数名称:insertPictureToPdf
// 函数说明:结束PDF绘制操作
// 作    者:ISmileLi
//************************************
void Widget::endPainter()
{
    m_painter->end();
}

//************************************
// 函数名称:saveHtmlToPDF
// 函数说明:html方法生成PDF
// 作    者:ISmileLi
//************************************
QString Widget::saveHtmlToPDF()
{
    QString html = "";
    html += "";
    html += "";
    html += "qt实现生成PDF文档";
    html += "";
    html += "";
    html += "

测试qt实现生成PDF文档

"; html += "
"; html += "

PDF插入图片\"picture\"

"; html += "
"; html += ""; html += ""; html += ""; html += ""; html += ""; html += ""; html += ""; html += "
编程语言统计
2017-01-18---2018-01-18
"; html += ""; html += ""; html += ""; html += ""; html += ""; html += ""; html += ""; html += ""; html += ""; html += ""; html += ""; html += ""; html += ""; html += ""; html += ""; html += "
C/C++pythonjavahtmlQt
上升上升下降下降上升
"; html += ""; html += ""; return html; } /***************************main.cpp*************************************/ #include "widget.h" #include #include int main(int argc, char *argv[]) { QApplication a(argc, argv); Widget w; w.setPdfName("E:/testPDF.pdf"); QStringList testList = (QStringList()<<"测试PDF文字写入" << "测试PDF写入hello word"); foreach(QString text,testList) { w.writeTextToPdf(text); qDebug() << "text:" <

你可能感兴趣的:(Qt)