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效果图:
这里写图片描述

二、QPainter方法生成PDF

QPainter方法生成PDF效果图:
这里写图片描述

三、核心代码

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

#include <QWidget>
#include <QPrinter>

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 <QPainter>
#include <QPixmap>
#include <QTextDocument>

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 += "<head>";
    html += "<title>qt实现生成PDF文档</title>";
    html += "<head>";
    html += "<body bgcolor=\"#ccccff\">";
    html += "<h1 style=\"background-color:red\">测试qt实现生成PDF文档</h1>";
    html += "<hr>";
    html += "<p>PDF插入图片<img src=\"E:/work/girl.jpg\" alt=\"picture\" width=\"100\" height=\"100\"></p>";
    html += "<hr>";
    html += "<table width=\"100%\" border=\"1\" cellspacing=\"1\" cellpadding=\"4\" align=\"center\">";
      html += "<tr>";
        html += "<td align=\"center\" height=\"60\">编程语言统计</td>";
      html += "</tr>";
      html += "<tr>";
        html += "<td align=\"center\" height=\"25\">2017-01-18---2018-01-18</td>";
      html += "</tr>";
    html += "</table>";
    html += "<table width=\"100%\" border=\"1\" cellspacing=\"1\" cellpadding=\"4\" bgcolor=\"#cccccc\" align=\"center\">";
        html += "<tr>";
            html += "<th>C/C++</th>";
            html += "<th>python</th>";
            html += "<th>java</th>";
            html += "<th>html</th>";
            html += "<th>Qt</th>";
        html += "</tr>";
        html += "<tr>";
            html += "<th>上升</th>";
            html += "<th>上升</th>";
            html += "<th>下降</th>";
            html += "<th>下降</th>";
            html += "<th>上升</th>";
        html += "</tr>";
    html += "</table>";
    html += "</body>";
    html += "</html>";
return html;
}

/***************************main.cpp*************************************/
#include "widget.h"
#include <QApplication>
#include <QDebug>

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:" <<text;
    }
    w.insertPictureToPdf("E:/Monitor.png");
    w.insertPictureToPdf("E:/map.png");
    w.insertPictureToPdf("E:/girl.jpg");
    w.endPainter();
    w.show();
    return a.exec();
}
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值