需求:将软件处理的结果保存为一个报告文档,文档中包含表格、图片、文字,格式为word的.doc和.pdf。生成word是为了便于用户编辑。

开发环境:qt4.8.4+vs2010

在qt的官网上对于pdf的操作介绍如下:http://qt-project.org/wiki/Handling_PDF 。即通过QPrinter类来创建pdf;还有通过第三方库PoDoFo

在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 += "

育种管理模块

";

html += "

" + current_date + "
";

//图片部分

html += "
" ;

//表格部分

html +=  "

html +="

";

QString fieldname;

for ( int i = 0; i

{

fieldname = fields[i].name();

html +="

" + fieldname + "";

}

html +="

";

最后结果得到的pdf如图:

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 documents

QAxObject *documents = word->querySubObject("Documents");

//build a tempetate with .dot file

documents->dynamicCall("Add(QString)", QString::fromLocal8Bit("F:/Id.dot"));

//get the current actived document

QAxObject *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()");

得到的结果就不贴了。存在有两个问题:1.在生成的word里图片的大小非常小,需要人为把它拉大才看得到;2.表格数据只会插入到第一行已经预设好书签的位置。对于有多条数据,还不知道怎样动态创建书签来插入数据。在网上找了些资料,未能很好的通过模板书签的方式来解决这两个问题。

那么想通过上面生成pdf时的html能不能直接保存为.doc文件呢?答案是能!而且节约了很多时间,只需一次生成固定格式的html,就可以保存为pdf和doc文件,多好的事情啊,为什么要用Qt ActiveX呢。

当然不能直接把生成pdf的文件名改成doc就行了,还需要做下面一个事情:

QString html;

html += "

"; //这句可加可不加。主要是因为我在word里把doc另存为html文件后,看到有这么个头标签,由此想到直接将html文档保存为doc文件。

html =GeneratePicWord();//该函数同生产pdf文档的一样

QFile outFile(docname);

outFile.open(QIODevice::WriteOnly | QIODevice::Append );

QTextStream ts(&outFile);

ts<

主要在后面那4行,将html输出到doc文件中去。

得到的结果如图:

pdf和word的生成就完成了,具体得到的结果可能格式上还需要调整,html对于调格式还是很方便的。

注:转载请注明出处

linux qt 生成word报告_Qt 生成word、pdf文档相关推荐

  1. PDF to Word Document Converter for Mac(PDF文档转换器)

    如何将pdf文件转换为word.PPT.html.jpg等文件?PDF to Word&Document Converter是一个PDF文档转换器,可让您快速将PDF文档转换为其他格式的文件. ...

  2. android pdf生成 路径,android – 如何从指向PDF文档的URI获取文件路径?

    现在我的代码打开了默认下载视图,它只显示我下载的PDF.我选择了一个PDF文件,我得到了这个: content://com.android.providers.downloads.documents/ ...

  3. pdf 加深 扫描件_为什么PDF文档不能像Word文档一样随便编辑?如何免费将PDF转换为Word?...

    PDF文档是一种非常难编辑的文档,有时候我们需要编辑或者复制PDF文档里面的内容,把PDF文档转换为Word就是我们最佳的选择.为什么PDF文档这么难编辑?我们怎么免费把PDF文档转换为Word文档? ...

  4. java-使用 flying-saucer 通过 xhtml 生成 pdf 文档支持 css 和 图片

    java-使用 flying-saucer 通过 xhtml 生成 pdf 文档支持 css 和 图片 重要说明: 1.使用 xhtml 生成 pdf ,对于 xhtml 的语法要求非常严格: 2.中 ...

  5. java实现word文档转换pdf文档并且添加水印功能使用插件Aspose.Words

    前段时间,项目需要自动生成word文档,用WordFreeMarker生成word文档后,又要求生成的文档能在浏览器浏览,思来想去,把word文档转成pdf就好了,于是乎研究了一下. 将word文档转 ...

  6. 利用Django生成PDF文档

    利用Django生成PDF文档 本小节说明如何利用Django视图动态生成PDF文档.此功能是由优秀的开源Python PDF库ReportLab实现的. 动态生成PDF文档的好处在于你可以定制PDF ...

  7. mac字体或windows字体安装到linux,解决linux服务器word文档生成pdf文档出现乱码

    安装原因:在进行程序开发时,有时会遇到某些场景会需要此操作.比如服务器端生成word文档转pdf文档,因为linux没有某些字体导致生成端pdf出现乱码. 安装步骤 服务器目录 /usr/share/ ...

  8. matlab自动生成报告,一种基于MATLAB的Word报告自动生成方法

    总第 182期 一 种基于MATLAB的Word报告自动生成方法 孙 剑 (信阳农林学院,河南 信阳 464000) 摘要:自动生成Word文档报告功能是办公 自动化系统中的重要组成部分.为高效的完成 ...

  9. python根据模板生成pdf文件_程序生成word与PDF文档的方法(python)

    程序导出word文档的方法 将web/html内容导出为world文档,再java中有很多解决方案,比如使用Jacob.Apache POI.Java2Word.iText等各种方式,以及使用free ...

  10. Java使用freemarker生成word文档并转pdf文档

    Java使用freemarker生成word文档后转pdf 先来看看效果图 进入正题 项目需求: 为订单后生成对应的pdf文档,文档内包含图片. 方案一:使用freemarker和itext把html ...

最新文章

  1. 2019年全球企业人工智能发展现状分析报告
  2. npm 安装包失败 --- 清除npm缓存
  3. Android API Demo程序框架
  4. 互联网1分钟 |1120
  5. [提示]使用普通用户,通过sealos安装ks,默认还是要通过root用户才能正常使用kubectl等命令
  6. python zookeeper_ZooKeeper的安装以及客户端Kazoo(Python语言)的安装与使用
  7. vue传值到后端_Vue.js快速入门就从这儿开始特别是后端程序员
  8. python网络爬虫的方法有几种_Python网络爬虫过程中5种网页去重方法简要介绍
  9. art-template用户注册方法
  10. 再见了Spring!这个架构有点厉害,甚至干掉了Dubbo!
  11. OpenShift 4 之Istio-Tutorial (8) 在服务之间配置Mutual TLS双向传输安全
  12. python | 实现多行向量(matrix)两两计算余弦距离、欧几里德距离
  13. php5.3 appache phpstudy win7win8win10下 运行速度慢
  14. 解读Android12 CDD中针对隔离环境(TEE)的要求
  15. 小米云测平台远程真机调试使用教程
  16. 联想惠普谁才是pc的最后王者
  17. 1+x证书Web前端开发HTML+CSS专项练习测试题(八)
  18. 全量备份/增量备份/差异备份说明
  19. 机器学习读书笔记之6 - 贝叶斯系列
  20. Discuz论坛 创始人密码忘记解决办法!

热门文章

  1. 转载:矩阵L2,1范数及矩阵L2,p范数的求导
  2. 使用VC++6.0创建.cpp文件工程
  3. Windows NT各版本对应关系
  4. could not resolve property: qid of: org.lxh.myzngt.vo.Answer
  5. iOS端抓包工具-stream
  6. eclipse如何配置Maven
  7. maven仓库repositories和mirrors的配置及区别详解(轻松搞明白)
  8. linux火狐快捷键设置,使用火狐浏览器所有的快捷键大全
  9. 计算机组装有哪些,详解电脑组装配置有哪些
  10. fastadmin列表中,时间显示,格式设置