在实际情况中,我们有时候会遇到需要把txt、html或者图片变成PDF文件的情况,例如把检测结果生成PDF文档给客户等等。QT4使用QPrinter来实现这个功能,QT5修改为QPdfWriter这个类。

一、QT5的修改

如果你想在QT5中使用QPrinter来实现这个功能,需要增加对应的模块:
QT5把所有打印的相关类,包括QPrinter、QPrintDialog都放到了Qt Print Support模块,如果你只是在.cpp文件中包含QPrinter库,在编译阶段就会报错,你需要先修改.pro文件,加上这句:

QT += printsupport

告诉QT,这个项目需要Print Support模块,再在.cpp文件中包含QPrinter库才可以使用QPrinter:

#include <QtPrintSupport/QPrinter>
#include <QtPrintSupport/QtPrintSupport>

注意修改完.pro文件后,项目需要重新构建下才能生效

而QT5只需要包含QtPrintSupport即可,不需要QPrinter:

#include <QtPrintSupport/QtPrintSupport>

二、text信息生成PDF文件

把文本信息生成PDF文件:

#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QtPrintSupport/QPrinter>
#include <QtPrintSupport/QtPrintSupport>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的QFontQFont 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);                                       //字体大小14pdfPainter->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,这样我们就可以控制段落格式。

三、HTML生成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));//设置页边距 顺序是:左上右下QTextDocument text_document;QString html = QString("<html><body><table border=\"6\"><caption>").append(QStringLiteral("薪资")).append("</caption><tr><td>").append(QStringLiteral("工号")).append("</td><td>").append(QStringLiteral("姓名")).append("</td><td>").append(QStringLiteral("薪资")).append("</td></tr><tr><td>101</td><td>102</td><td>103</td></tr><tr><td>123</td><td>124</td><td>125</td></tr></table></body>");text_document.setHtml(html);text_document.print(pdfWriter);text_document.end();QDesktopServices::openUrl(QUrl::fromLocalFile("d:\\test.pdf"));

结果如下(可以用于打印表格之类的):

四、图片生成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的界面 控制你要抓取的widgetQPainter 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"));

原本界面:

结果:

(十七)QT生成PDF文件相关推荐

  1. Qt 生成pdf文件

    运行效果: 代码: #include <QPdfWriter> #include <QPainter> #include <QDesktopServices>voi ...

  2. python使用fpdf生成pdf文件章节(chapter),包含:页眉、页脚、章节主题、数据排版等;

    python使用fpdf生成pdf文件章节(chapter),包含:页眉.页脚.章节主题.数据排版等: #仿真数据 The year 1866 was marked by a bizarre deve ...

  3. python使用fpdf生成pdf文件:配置多种语言字体写入多种文字

    python使用fpdf生成pdf文件:配置多种语言字体写入多种文字 目录

  4. 一步快速将Smartform output转成生成PDF文件

    世间竟有如此盖世神功!最简单的smart form output转化成 PDF文件的方式.   Form打印预览界面在事务栏输入T-code:PDF!,注意!为半角英文状态下的感叹号. 输入T-cod ...

  5. 安装texlive并用latex编写一段中文,最后生成pdf文件

    安装texlive并用latex编写一段中文,最后生成pdf文件 **#一.下载安装(**链接https://tug.org/texlive/) ##1.第一步 ##2.第二步 ##3.第三步 ##4 ...

  6. 小容量单片机生成pdf文件

    工作上要求使用小容量单片机生成直接生成pdf文件. 经过一段时间的摸索,其中参考了libharu,库太大,不适合在单片机上使用 页参考了与非网上一位前辈的库,占用的RAM太大,不适合小容量单片机, 主 ...

  7. php输出PDF的文件流_怎么用PHP在HTML中生成PDF文件

    译文:使用PHP在html中生成PDF 译者:dwqs 利用PHP编码生成PDF文件是一个非常耗时的工作.在早期,开发者使用PHP并借助FPDF来生成PDF文件.但是如今,已经有很多函数库可以使用了, ...

  8. python数据生成pdf,Python生成pdf文件的方法

    摘要:这篇Python开发技术栏目下的"Python生成pdf文件的方法",介绍的技术点是"python生成pdf文件.python生成pdf.生成pdf文件.Pytho ...

  9. java调用wkhtmltopdf生成pdf文件,美观,省事

    最近项目需要导出企业风险报告,文件格式为pdf,于是搜了一大批文章都是什么Jasper Report,iText ,flying sauser ,都尝试了一遍,感觉不是我想要的效果, 需要自己调整好多 ...

最新文章

  1. [Shell]条件判断与流程控制:if, case, for, while, until
  2. WPF插件开发:使用FrameworkElementAdapters时VS报错的问题
  3. 光遇服务器维护都在干什么,光遇:全图毕业后该做什么?老玩家建议,这四件事不做会后悔...
  4. css3实现的一些灰色的导航条按钮
  5. linux账户管理代码和截图,linux 用户管理(示例代码)
  6. fpgrowth算法实战 mlib_sparkmllib关联规则算法(FPGrowth,Apriori)
  7. Win32_1深入浅出windows消息机制
  8. es java 创建索引_Elasticsearch(ES) 创建索引
  9. c语言运行的快捷键是什么,c语言执行命令快捷键是什么??
  10. mysqld: [ERROR] Found option without preceding group in config file /etc/my.cnf at line 1
  11. osx 续航测试软件,苹果吹牛了吗?多款Macbook续航测试结果出炉
  12. 戴尔计算机的机械硬盘容量,新款戴尔g3加装机械硬盘教程终极版
  13. package.json 详解
  14. python中setattr(),getattr(),hasattr()函数的使用
  15. Win10 Plants VS Zombies 运行时出现 Fatal Error
  16. 如何防守住企业的生死大门?
  17. QNX与Linux两家未来有望独霸车载电子操作系统
  18. bing Map 在vue项目中的使用
  19. 史上最浅显易懂的 RxJava 入门教程
  20. Revit2018使用lumion插件DAE格式模型,revit崩溃解决方法

热门文章

  1. WebAssembly 学习笔记
  2. RegExp——正则表达式
  3. ..\Src\INA226.c(142): error: #20: identifier “GPIO_IDR_IDR9“ is undefined
  4. 文墨绘学艺术学堂邀请中国书法学会副会长锻铁林弘扬中国“正统书法”
  5. 青少年python编程比赛试题答案_Python编程及应用-中国大学mooc-试题题目及答案
  6. 三星Galaxy折叠屏系列及生态新品:打造智能生活方式
  7. Docker搭建Pikachu靶场
  8. 苹果手机无法更新系统问题
  9. TP5做工资条群发系统
  10. 中考计算机考试辽宁,中考考哪些科目(2019辽宁中考科目及分值)