在实际情况中,我们有时候会遇到需要把txt、html或者图片变成PDF文件的情况,例如把检测结果生成PDF文档给客户等等。QT4使用QPrinter来实现这个功能,QT5修改为QPdfWriter这个类。
如果你想在QT5中使用QPrinter来实现这个功能,需要增加对应的模块:
QT5把所有打印的相关类,包括QPrinter、QPrintDialog都放到了Qt Print Support模块,如果你只是在.cpp文件中包含QPrinter库,在编译阶段就会报错,你需要先修改.pro文件,加上这句:
QT += printsupport
告诉QT,这个项目需要Print Support模块,再在.cpp文件中包含QPrinter库才可以使用QPrinter:
#include
#include
注意修改完.pro文件后,项目需要重新构建下才能生效
而QT5只需要包含QtPrintSupport即可,不需要QPrinter:
#include
把文本信息生成PDF文件:
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include
#include
MainWindow::MainWindow(QWidget *parent)
: QMainWindow(parent)
, ui(new Ui::MainWindow)
{
ui->setupUi(this);
QFile pdfFile("d:\\test.pdf");//输出文件名
if(!pdfFile.open(QIODevice::WriteOnly))
{
QMessageBox::warning(this,tr("write File"),tr("Cannot open file:\n%1").arg("d:\\test.pdf"));
return;
}
QPdfWriter *pdfWriter = new QPdfWriter(&pdfFile); //实例化QPdfWriter 可以设置PDF文件的一些参数
pdfWriter->setPageSize(QPagedPaintDevice::A4); //设置纸张为A4纸
pdfWriter->setResolution(QPrinter::ScreenResolution); //设置分辨率 屏幕分辨率 打印机分辨率 高分辨率
pdfWriter->setPageMargins(QMarginsF(40, 40, 40, 40)); //设置页边距 顺序是:左上右下
QPainter *pdfPainter = new QPainter(pdfWriter); //qt绘制工具
//设置标题
QTextOption option(Qt::AlignCenter); //标题居中显示
option.setWrapMode(QTextOption::WordWrap); //标题自动换行
// 设置标题字体 需要使用QT的QFont
QFont font;
font.setFamily("Microsoft YaHei"); //设置字体 微软雅黑、宋体之类的
font.setPointSize(22); //设置字体大小
//font.setItalic(true);//斜体
//font.setUnderline(true);//设置下划线
font.setBold(true); //加粗
pdfPainter->setFont(font);
pdfPainter->drawText(QRect(3000, 0, 2100, 450), QString::fromLocal8Bit("标题"), option);//距离左边3000,上面0,标题字宽度2100,标题字高450(如果字显示不全,可以适当调整)
pdfWriter->newPage(); //换一页
//设置内容
option.setAlignment(Qt::AlignLeft);
font.setPointSize(14); //字体大小14
pdfPainter->setFont(font);
pdfPainter->drawText(QRect(500, 20, 8000, 300),
QString::fromLocal8Bit("我是第一行我是第一行我是第一行我是第一行我是第一行我是第一行我是第一"));
pdfPainter->drawText(QRect(0, 320, 8500, 300),
QString::fromLocal8Bit("我是后续我是后续我是后续我是后续我是后续我是后续我是后续我是后续我是后续"), option);
pdfPainter->drawText(QRect(0, 620, 8500, 300),
QString::fromLocal8Bit("我是后续我是后续我是后续我是后续我是后续我是后续我是后续我是后续我是后续"), option);
delete pdfPainter;
delete pdfWriter;
pdfFile.close();
QDesktopServices::openUrl(QUrl::fromLocalFile("d:\\test.pdf"));
}
可以看到drawText()接口,要求输入起始位置QRect,这样我们就可以控制段落格式。
QFile pdfFile("d:\\test.pdf");//输出文件名
if(!pdfFile.open(QIODevice::WriteOnly))
{
QMessageBox::warning(this,tr("write File"),tr("Cannot open file:\n%1").arg("d:\\test.pdf"));
return;
}
QPdfWriter *pdfWriter = new QPdfWriter(&pdfFile); //实例化QPdfWriter 可以设置PDF文件的一些参数
pdfWriter->setPageSize(QPagedPaintDevice::A4); //设置纸张为A4纸
pdfWriter->setResolution(QPrinter::ScreenResolution); //设置分辨率 屏幕分辨率 打印机分辨率 高分辨率
pdfWriter->setPageMargins(QMarginsF(40, 40, 40, 40));//设置页边距 顺序是:左上右下
QTextDocument text_document;
QString html = QString("").append(QStringLiteral("薪资")).append(" ")
.append(QStringLiteral("工号")).append(" ").append(QStringLiteral("姓名")).append(" ")
.append(QStringLiteral("薪资")).append(" 101 102 103 123 124 125
");
text_document.setHtml(html);
text_document.print(pdfWriter);
text_document.end();
QDesktopServices::openUrl(QUrl::fromLocalFile("d:\\test.pdf"));
QFile pdfFile("d:\\test.pdf");//输出文件名
if(!pdfFile.open(QIODevice::WriteOnly))
{
QMessageBox::warning(this,tr("write File"),tr("Cannot open file:\n%1").arg("d:\\test.pdf"));
return;
}
QPdfWriter *pdfWriter = new QPdfWriter(&pdfFile); //实例化QPdfWriter 可以设置PDF文件的一些参数
pdfWriter->setPageSize(QPagedPaintDevice::A4); //设置纸张为A4纸
pdfWriter->setResolution(QPrinter::ScreenResolution); //设置分辨率 屏幕分辨率 打印机分辨率 高分辨率
pdfWriter->setPageMargins(QMarginsF(40, 40, 40, 40));//设置页边距 顺序是:左上右下
QPixmap pixmap = QWidget::grab(ui->widget->rect()); //获取widget的界面 控制你要抓取的widget
QPainter painter_pixmap;
painter_pixmap.begin(pdfWriter);
QRect rect = painter_pixmap.viewport();
int scale = rect.width()/pixmap.width();
painter_pixmap.scale(scale, scale); //图像缩放 不然图片太大或者太小都不好看
painter_pixmap.drawPixmap(0, 0, pixmap); //画图
painter_pixmap.end();
QDesktopServices::openUrl(QUrl::fromLocalFile("d:\\test.pdf"));