QT生成Word PDF文档
需求:将软件处理的结果保存为一个报告文档,文档中包含表格、图片、文字,格式为word的.doc和.pdf。生成word是为了便于用户编辑。
开发环境:qt4.8.4+vs2010
在qt的官网上对于pdf的操作介绍如下:http://qt-project.org/wiki/Handling_PDF 。即通过QPrinter类来创建pdf;还有通过第三方库PoDoFo、Hummus。本文主要介绍的是用QPrinter类来创建pdf。
在qt的官网上对于word的操作介绍如下:http://qt-project.org/wiki/Handling_Microsoft_Word_file_format 。即通过Word本身COM组件的形式,Qt的ActiveX框架来实现;还有通过xml来实现。本文主要介绍Qt ActiveX和html格式生成word文档。
下面举例详细说明pdf和word文档的生成:
1.pdf的生成
pdf文档里要求有表格、图片、文字,参考博客:http://blog.sina.com.cn/s/blog_a6fb6cc90101gvnx.html。里面有介绍文字、图片、表格分别是怎样通过QPrinter类来实现的。但是遇到一个麻烦就是怎样把这三种格式的东西放在一起而且排版好呢,用上述博客里的方法尝试之后,最终确定使用第三种生成表格(html格式)的方式来得到:
QPrinter printer_text;
printer_text.setOutputFormat(QPrinter::PdfFormat);
printer_text.setOutputFileName(pdfname);//pdfname为要保存的pdf文件名QTextDocument text_document;
QString html = GeneratePicWord();//自定义的函数,用来生成html代码text_document.setHtml(html);
text_document.print(&printer_text);
QTextBlock it = text_document.end();
GeneratePicWord()函数的内容大致如下:
QString html;
//文字部分
QDateTime current_date_time = QDateTime::currentDateTime();
QString current_date = current_date_time.toString("yyyy-MM-dd hh:mm:ss ddd");
html += "<h2 align=\"center\">育种管理模块</h2>";
html += "<h4 align=\"center\">" + current_date + "</h2><br>";
//图片部分
html += "<img align=\"middle\" src = \"" + imagepath + "\" width=\"600\" height=\""+QString::number(showHeight) + "\"/><br>" ;
//表格部分
html += "<table align=\"center\" border=\"0.2\" cellspacing=\"0\" cellpadding=\"0\" style=\"width: 100%; height: 100%;\">";
html +="<tr>";
QString fieldname;
for ( int i = 0; i < fieldCount; ++i)
{
fieldname = fields[i].name();
html +="<td bgcolor=\"Silver\">" + fieldname + "</td>";
}
html +="</tr></table>";

2.word的生成
word的生成可以用QActiveX来实现。博客:http://www.360doc.com/content/14/0227/16/7918060_356177077.shtml里说的比较详细了。首先新建一个模板文件Id.dot,在模板文件中事先“插入”-》“书签”,如下图所示:

书签主要在表格的第一行前两列,分别是code,ndvi。表格下面有两个书签,分别是pic,pic2。用代码插入需要的文字和图片:
QAxWidget *word = new QAxWidget("Word.Application",this, Qt::MSWindowsOwnDC);word->setProperty("Visible", true);//get all documentsQAxObject *documents = word->querySubObject("Documents");//build a tempetate with .dot filedocuments->dynamicCall("Add(QString)", QString::fromLocal8Bit("F:/Id.dot"));//get the current actived documentQAxObject *document = word->querySubObject("ActiveDocument");QString code = "code";QAxObject *bookmark_code = document->querySubObject("Bookmarks(QVariant)", "code");if ( !bookmark_code->isNull()){bookmark_code->dynamicCall("Select(void)");bookmark_code->querySubObject("Range")->setProperty("Text", "textg");}QAxObject *bookmark_ndvi = document->querySubObject("Bookmarks(QVariant)", "ndvi");if ( !bookmark_ndvi->isNull()){bookmark_ndvi->dynamicCall("Select(void)");bookmark_ndvi->querySubObject("Range")->setProperty("Text", "ndvi");}QAxObject *bookmark_ndvi2 = document->querySubObject("Bookmarks(QVariant)", "ndvi");if ( !bookmark_ndvi2->isNull()){bookmark_ndvi2->dynamicCall("Select(void)");bookmark_ndvi2->querySubObject("Range")->setProperty("Text", "ndvi2");}QAxObject *bookmark_pic = document->querySubObject("Bookmarks(QVariant)", "pic");if ( !bookmark_pic->isNull()){bookmark_pic->dynamicCall("Select(void)");QAxObject *shapes = document->querySubObject("InlineShapes");shapes->dynamicCall("AddPicture(Const QString&)", "F:\\CND.jpg");}document->dynamicCall("SaveAs (const QString&)", QString("F:/testword.doc"));document->dynamicCall("Close(boolean)", false);word->dynamicCall("Quit()");
只会插入到第一行已经预设好书签的位置。对于有多条数据,还不知道怎样动 态创建 书签来插入数据。在网上找了些资料,未能很好的通过模板书签的方式来解决这两个问题。
那么想通过上面生成pdf时的html能不能直接保存为.doc文件呢?答案是能!而且节约了很多时间,只需一次生成固定格式的html,就可以保存为pdf和doc文件,多好的事情啊,为什么要用Qt ActiveX呢。
当然不能直接把生成pdf的文件名改成doc就行了,还需要做下面一个事情:
QString html;
html += "<html xmlns:o=\"urn:schemas-microsoft-com:office:office\" xmlns:w=\"urn:schemas-microsoft-com:office:word\" xmlns=\"http://www.w3.org/TR/REC-html40\"><head><meta http-equiv=Content-Type content=\"text/html; charset=gb2312\" >"; //这句可加可不加。主要是因为我在word里把doc另存为html文件后,看到有这么个头标签,由此想到直接将html文档保存为doc文件。
html =GeneratePicWord();//该函数同生产pdf文档的一样QFile outFile(docname);
outFile.open(QIODevice::WriteOnly | QIODevice::Append );
QTextStream ts(&outFile);
ts<<html<<endl;
主要在后面那4行,将html输出到doc文件中去。
得到的结果如图:
相关文章:
QT生成Word PDF文档
需求:将软件处理的结果保存为一个报告文档,文档中包含表格、图片、文字,格式为word的.doc和.pdf。生成word是为了便于用户编辑。 开发环境:qt4.8.4vs2010 在qt的官网上对于pdf的操作介绍如下:http://qt-project.org/…...
阿里云服务器搭建WordPress建站教程基于Windows系统
本教程是使用阿里云服务器镜像系统选择的是Windows操作系统,手动安装WordPress博客网站全过程。本教程介绍如何在Windows操作系统的ECS实例上搭建WordPress网站。 目录 准备工作 搭建WordPress网站 解析WordPress网站域名 准备工作 创建Windows操作系统的ECS实…...
动态链接(8/11)
静态链接的缺点:生成的可执行文件体积较大,当多个程序引用相同的公共代码时,这些公共代码会多次加载到内存,浪费内存资源。 为了解决这个问题,动态链接对静态链接做了一些优化:对一些公用的代码࿰…...
Python 之 Http 获取网页的 html 数据,并去掉 html 格式等相关信息
Python之 Http 获取网页的 html 数据,并去掉 html 格式等相关信息 目录 Python之 Http 获取网页的 html 数据,并去掉 html 格式等相关信息...
干不完根本干不完,我也不想加班,快来围观时间管理大师
时间不够用,怎么办? 成功不靠加班。生产队的驴都不加班,你加什么班?到点就下班,该玩玩,该学习认真学,累了就睡觉。 你可以做任何事,但不必做所有事。 时间管理,不是管…...
常见设计模式
概念 设计模式是怎么解决问题的一种方案 常见的设计模式 单例模式 概念:保证一个类仅有一个实例,并提供一个访问它的全局访问点。 应用:项目封装个websocket用于大屏,redux,vuex都应用了单例模式的思想;…...
Android之版本号、版本别名、API等级对应关系(全)(一百六十二)
简介: CSDN博客专家,专注Android/Linux系统,分享多mic语音方案、音视频、编解码等技术,与大家一起成长! 优质专栏:Audio工程师进阶系列【原创干货持续更新中……】🚀 人生格言: 人生…...
Redis的简介,安装(Linux、Windows),配置文件的修改---详细介绍
Redis基础 文章目录 Redis基础1、Redis入门1.1、Redis简介1.2、Redis下载与安装1.2.1、在Linux系统安装Redis1.2.2、在Windows系统安装Redis 1.3、Redis服务启动与停止1.3.1、在Linux中启动服务1.3.2、在Windows中启动服务1.3.3、设置密码校验1.3.4、redis的远程连接 Redis是一…...
Vscode-工具使用
Vscode ,这玩意儿是开源的,以前用收费的破解版,过段时间就高版本不匹配,这次搞个不要钱的玩玩,记录使用心得 下载 下载地址:官网 点击下载,但是这里有个问题下载比较慢,解决办法&a…...
Ceph Reef版本 RBD 性能测试:80万写IOPS(10节点、60个NVMe SSD)
2023-05-16 08:30 发表于上海 摘自:https://mp.weixin.qq.com/s/mKkPElmCktoZaRk0m0IbqA 1、背景 Ceph 社区最近冻结了即将发布的 Ceph Reef 版本,今天我们研究一下 Ceph Reef 版本在 10 个节点、60 个 NVMe 磁盘的集群上的 RBD 性能。 在确保硬件没有…...
微信小程序调用map数据 并在wxml中对数组进行截取的操作
wxs文件的位置如图 实现数组截取 只保留五张图片 <wxs module"filter" src"./slicefunc.wxs"></wxs> <view class"wrap"><view class"search-box" bindtap"toSearch"><view class"v1"…...
前端项目打包
前端项目打包指的是将前端项目的源代码打包成一个或多个静态文件,以便于部署到服务器上,供用户访问。下面是一些常用的前端项目打包工具和打包步骤: 1、Webpack:Webpack 是一个强大的打包工具,可以将多个 JavaScript、…...
venv使用教程及pyvenv与python3-venv的区别
推荐使用python3-venv 原因:官方公告称——pyvenv自3.6 版本起弃用 原文:pyvenv 是针对 Python 3.3 和 3.4 创建虚拟环境的推荐工具,并在 Python 3.6 中被弃用。 Linux下创建虚拟环境(以Ubuntu为例) 首先安装依赖包 sudo apt-get instal…...
协程(一)单机--》并发--》协程
目录 一 协程的概述1.1 并行与并发1.2 线程1.3 新的思路1.4 Goroutine 二 第一个入门程序 一 协程的概述 我查看了网上的一些协程的资料,发现每个人对协程的概念都不一样,但是我认可的一种说法是:协程就是一种轻量级的线程框架(K…...
P1722 矩阵 II
题目背景 usqwedf 改编系列题。 题目描述 如果你在百忙之中抽空看题,请自动跳到第六行。 众所周知,在中国古代算筹中,红为正,黑为负…… 给定一个12n 的矩阵(usqwedf:这不是一个 2n 的队列么ÿ…...
【数据结构】树和二叉树的概念及结构
1.树概念及结构 1.1树的概念 树是一种非线性的数据结构,它是由n(n>0)个有限结点组成一个具有层次关系的集合。把它叫做树是因为它看起来像一棵倒挂的树,也就是说它是根朝上,而叶朝下的。 有一个特殊的结点&#…...
8.1.tensorRT高级(3)封装系列-模型编译过程封装,简化模型编译代码
目录 前言1. 模型编译过程封装2. 问答环节总结 前言 杜老师推出的 tensorRT从零起步高性能部署 课程,之前有看过一遍,但是没有做笔记,很多东西也忘了。这次重新撸一遍,顺便记记笔记。 本次课程学习 tensorRT 高级-模型编译过程封装…...
化工行业案例 | 甄知科技助力万华化学重构IT服务价值,打造信息中心ERP!
随着科技的发展,新材料的应用领域与日俱增,近年来,全球化工新材料产业发展整体步入高技术引领、产品迭代速度快、产业规模和需求不断扩大的阶段。一体化协同与数字化转型策略是实现化工新材料生产原料自给、节能降耗、降低排放和物料成本的重…...
day6 STM32时钟与定时器
STM32时钟系统的概述 概念 时钟系统是由振荡器(信号源)、定时唤醒器、分频器等组成的电路。 常用的信号有晶体振荡器和RC振荡器。 意义 时钟是嵌入式系统的脉搏,处理器内核在时钟驱动下完成指令执行,状态变换等动作ÿ…...
【JavaEE进阶】SpringBoot 配置文件
文章目录 SpringBoot配置文件1. 配置文件的作用2. 配置文件的格式3. properties 配置文件说明3.1 properties 基本语法3.2 读取配置文件3.3 properties 优缺点分析 4. yml配置文件说明4.1 yml 基本语法4.2 yml 配置读取 5. properties和yml的对比 SpringBoot配置文件 1. 配置文…...
安宝特方案丨XRSOP人员作业标准化管理平台:AR智慧点检验收套件
在选煤厂、化工厂、钢铁厂等过程生产型企业,其生产设备的运行效率和非计划停机对工业制造效益有较大影响。 随着企业自动化和智能化建设的推进,需提前预防假检、错检、漏检,推动智慧生产运维系统数据的流动和现场赋能应用。同时,…...
视频字幕质量评估的大规模细粒度基准
大家读完觉得有帮助记得关注和点赞!!! 摘要 视频字幕在文本到视频生成任务中起着至关重要的作用,因为它们的质量直接影响所生成视频的语义连贯性和视觉保真度。尽管大型视觉-语言模型(VLMs)在字幕生成方面…...
【单片机期末】单片机系统设计
主要内容:系统状态机,系统时基,系统需求分析,系统构建,系统状态流图 一、题目要求 二、绘制系统状态流图 题目:根据上述描述绘制系统状态流图,注明状态转移条件及方向。 三、利用定时器产生时…...
PL0语法,分析器实现!
简介 PL/0 是一种简单的编程语言,通常用于教学编译原理。它的语法结构清晰,功能包括常量定义、变量声明、过程(子程序)定义以及基本的控制结构(如条件语句和循环语句)。 PL/0 语法规范 PL/0 是一种教学用的小型编程语言,由 Niklaus Wirth 设计,用于展示编译原理的核…...
【服务器压力测试】本地PC电脑作为服务器运行时出现卡顿和资源紧张(Windows/Linux)
要让本地PC电脑作为服务器运行时出现卡顿和资源紧张的情况,可以通过以下几种方式模拟或触发: 1. 增加CPU负载 运行大量计算密集型任务,例如: 使用多线程循环执行复杂计算(如数学运算、加密解密等)。运行图…...
高防服务器能够抵御哪些网络攻击呢?
高防服务器作为一种有着高度防御能力的服务器,可以帮助网站应对分布式拒绝服务攻击,有效识别和清理一些恶意的网络流量,为用户提供安全且稳定的网络环境,那么,高防服务器一般都可以抵御哪些网络攻击呢?下面…...
Device Mapper 机制
Device Mapper 机制详解 Device Mapper(简称 DM)是 Linux 内核中的一套通用块设备映射框架,为 LVM、加密磁盘、RAID 等提供底层支持。本文将详细介绍 Device Mapper 的原理、实现、内核配置、常用工具、操作测试流程,并配以详细的…...
DingDing机器人群消息推送
文章目录 1 新建机器人2 API文档说明3 代码编写 1 新建机器人 点击群设置 下滑到群管理的机器人,点击进入 添加机器人 选择自定义Webhook服务 点击添加 设置安全设置,详见说明文档 成功后,记录Webhook 2 API文档说明 点击设置说明 查看自…...
论文阅读:LLM4Drive: A Survey of Large Language Models for Autonomous Driving
地址:LLM4Drive: A Survey of Large Language Models for Autonomous Driving 摘要翻译 自动驾驶技术作为推动交通和城市出行变革的催化剂,正从基于规则的系统向数据驱动策略转变。传统的模块化系统受限于级联模块间的累积误差和缺乏灵活性的预设规则。…...
嵌入式学习之系统编程(九)OSI模型、TCP/IP模型、UDP协议网络相关编程(6.3)
目录 一、网络编程--OSI模型 二、网络编程--TCP/IP模型 三、网络接口 四、UDP网络相关编程及主要函数 编辑编辑 UDP的特征 socke函数 bind函数 recvfrom函数(接收函数) sendto函数(发送函数) 五、网络编程之 UDP 用…...
