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

开发环境:qt4.8.4+vs2010

在qt的官网上对于pdf的操作介绍如下:http://qt-project.org/wiki/Handling_PDF 。即通过QPrinter类来创建pdf;还有通过第三方库PoDoFoHummus本文主要介绍的是用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格式)的方式来得到:

  1. QPrinter printer_text;
  2. printer_text.setOutputFormat(QPrinter::PdfFormat);
  3. printer_text.setOutputFileName(pdfname);//pdfname为要保存的pdf文件名
  4. QTextDocument text_document;
  5. QString html = GeneratePicWord();//自定义的函数,用来生成html代码
  6. text_document.setHtml(html);
  7. text_document.print(&printer_text);
  8. QTextBlock it = text_document.end();

GeneratePicWord()函数的内容大致如下:

  1. QString html;
  2. //文字部分
  3. QDateTime current_date_time = QDateTime::currentDateTime();
  4. QString current_date = current_date_time.toString("yyyy-MM-dd hh:mm:ss ddd");
  5. html += "<h2 align=\"center\">育种管理模块</h2>";
  6. html += "<h4 align=\"center\">" + current_date + "</h2><br>";
  7. //图片部分
  8. html += "<img align=\"middle\" src = \"" + imagepath + "\"  width=\"600\" height=\""+QString::number(showHeight) + "\"/><br>" ;
  9. //表格部分
  10. html +=  "<table align=\"center\" border=\"0.2\" cellspacing=\"0\" cellpadding=\"0\"  style=\"width: 100%; height: 100%;\">";
  11. html +="<tr>";
  12. QString fieldname;
  13. for ( int i = 0; i < fieldCount; ++i)
  14. {
  15. fieldname = fields[i].name();
  16. html +="<td bgcolor=\"Silver\">" + fieldname + "</td>";
  17. }
  18. html +="</tr></table>";

最后结果得到的pdf如图:

2.word的生成

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

书签主要在表格的第一行前两列,分别是code,ndvi。表格下面有两个书签,分别是pic,pic2。用代码插入需要的文字和图片:

  1. QAxWidget *word = new QAxWidget("Word.Application",this, Qt::MSWindowsOwnDC);
  2. word->setProperty("Visible", true);
  3. //get all documents
  4. QAxObject *documents = word->querySubObject("Documents");
  5. //build a tempetate with .dot file
  6. documents->dynamicCall("Add(QString)", QString::fromLocal8Bit("F:/Id.dot"));
  7. //get the current actived document
  8. QAxObject *document = word->querySubObject("ActiveDocument");
  9. QString code = "code";
  10. QAxObject *bookmark_code = document->querySubObject("Bookmarks(QVariant)", "code");
  11. if ( !bookmark_code->isNull())
  12. {
  13. bookmark_code->dynamicCall("Select(void)");
  14. bookmark_code->querySubObject("Range")->setProperty("Text", "textg");
  15. }
  16. QAxObject *bookmark_ndvi = document->querySubObject("Bookmarks(QVariant)", "ndvi");
  17. if ( !bookmark_ndvi->isNull())
  18. {
  19. bookmark_ndvi->dynamicCall("Select(void)");
  20. bookmark_ndvi->querySubObject("Range")->setProperty("Text", "ndvi");
  21. }
  22. QAxObject *bookmark_ndvi2 = document->querySubObject("Bookmarks(QVariant)", "ndvi");
  23. if ( !bookmark_ndvi2->isNull())
  24. {
  25. bookmark_ndvi2->dynamicCall("Select(void)");
  26. bookmark_ndvi2->querySubObject("Range")->setProperty("Text", "ndvi2");
  27. }
  28. QAxObject *bookmark_pic = document->querySubObject("Bookmarks(QVariant)", "pic");
  29. if ( !bookmark_pic->isNull())
  30. {
  31. bookmark_pic->dynamicCall("Select(void)");
  32. QAxObject *shapes = document->querySubObject("InlineShapes");
  33. shapes->dynamicCall("AddPicture(Const QString&)", "F:\\CND.jpg");
  34. }
  35. document->dynamicCall("SaveAs (const QString&)", QString("F:/testword.doc"));
  36. document->dynamicCall("Close(boolean)", false);
  37. word->dynamicCall("Quit()");

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

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

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

  1. QString html;
  2. 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文件。
  3. html =GeneratePicWord();//该函数同生产pdf文档的一样
  4. QFile outFile(docname);
  5. outFile.open(QIODevice::WriteOnly | QIODevice::Append );
  6. QTextStream ts(&outFile);
  7. ts<<html<<endl;

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

得到的结果如图:

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

注:转载请注明出处

http://blog.csdn.net/tszhangjunqiao/article/details/22681351

Qt 生成word、pdf文档的更多相关文章

  1. 使用FastReport报表工具生成报表PDF文档

    在我们开发某个系统的时候,客户总会提出一些特定的报表需求,固定的报表格式符合他们的业务处理需要,也贴合他们的工作场景,因此我们尽可能做出符合他们实际需要的报表,这样我们的系统会得到更好的认同感.本篇随 ...

  2. 将Word,PDF文档转化为图片

    #region 将Word文档转化为图片 /// <summary> /// 将Word文档转化为图片 /// </summary> /// <param name=&q ...

  3. iOS - 开发中加载本地word/pdf文档说明

    最近项目中要加载一个本地的word/pdf等文件比如<用户隐私政策><用户注册说明>,有两种方法加载 > 用QLPreviewController控制器实现 步骤 : & ...

  4. javadoc生成word接口文档

    1.下载DocFlex/Doclet 下载地址 http://www.filigris.com/downloads/ 2.ecplise->project->generate javado ...

  5. 自动把动态的jsp页面(或静态html)生成PDF文档,并且上传至服务器

    置顶2017年11月06日 14:41:04 阅读数:2311 这几天,任务中有一个难点是把一个打印页面自动给生成PDF文档,并且上传至服务器,然而公司框架只有手动上传文档,打印时可以保存为PDF在本 ...

  6. 使用itextsharp创建PDF文档——图片集合

    文档管理系统中 ,扫描模块将文档或证件扫描后.为了便于保存多个图片,拟将多个图片生成一个PDF文档进行保存. 这里我们就需要PDF生成工具了.你可以在这里下载.PDFCreator 主要使用了开源工具 ...

  7. 使用Spire PDF for .NET将HTML转换成PDF文档

    目录 开发环境说明 Spire PDF for .NET (free edition)体验 资源下载 开发环境说明 Microsoft Visual Studio 2013 Ultimate Edit ...

  8. Java 设置PDF文档背景色

    一般生成的PDF文档默认的文档底色为白色,我们可以通过一定方法来更改文档的背景色,以达到文档美化以及保护双眼的作用. 以下内容提供了Java编程来设置PDF背景色的方法.包括: 设置纯色背景色 设置图 ...

  9. Java 设置PDF文档背景——单色背景、图片背景

    一般生成的PDF文档默认的文档底色为白色,我们可以通过一定方法来更改文档的背景色,以达到文档美化的作用. 以下内容提供了Java编程来设置PDF背景色的方法.包括2种设置方法: 设置纯色背景色 设置图 ...

  10. 使用TCPDF输出完美的中文PDF文档

    TCPDF是一个用于快速生成PDF文件的PHP5函数包.TCPDF基于FPDF进行扩展和改进.支持UTF-8,Unicode,HTML和XHTML.在基于PHP开发的Web应用中,使用它来输出PDF文 ...

随机推荐

  1. Java ClassLoader详解(转载)

    Java ClassLoader详解 类加载器是 Java 语言的一个创新,也是 Java 语言流行的重要原因之一.它使得 Java 类可以被动态加载到 Java 虚拟机中并执行.类加载器从 JDK ...

  2. java_类型强转

    class Father{ public void fromFather(){ System.out.println("fromFather"); } } interface in ...

  3. Drupal 初次使用感受,兴许补充。

    非常久曾经就接触过.下载下来安装,结果界面太丑,太难看,直接删除. 近期又一次想到开源CMS,好奇看到那么多人推崇drupal.也便下载来又一次研究了下. 刚接触了下.只是总体使用感觉非常差.尤其几个 ...

  4. MySQL 存储过程 (3)

    以下介绍下像数据库循环插入数据操作 第一步:建立存储过程用到的信息表

  5. pygame 安装教程

    步骤: 1.去官网下载PyGame 注意:要下载对应版本的包 官网地址:http://www.pygame.org/download.shtml 其中,如果python为以下版本: python 3. ...

  6. Node中的Socket.IO 简单Demo及说明

    注:下面Demo的Server和Client都是纯后端. 并没有web页面. Server端代码: var express = require('express'); var app = expres ...

  7. java使用ftp局域网内多线程上传图片过慢

    多线程ftp上传文件时候,图片上传很慢,调试和查询资料发现主要在:storeFile方法 解决方案如下: FTPClient fc设置setBufferSize 可以根据内存大小适当设置大点的缓冲区: ...

  8. ubuntu 16.04安装Jenkins

    快速安装: sudo wget -q -O - http://pkg.jenkins.io/debian-stable/jenkins.io.key | sudo apt-key add - sudo ...

  9. github for unity

  10. source insight 快捷键

    source insight 返回上一视图 快捷键:ALT+, 浏览项目符号:F7 全局浏览查找某个名称开头的函数或结构体等