零、前言
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();
}