需求:将软件处理的结果保存为一个报告文档,文档中包含表格、图片、文字,格式为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. Python中十六进制和字符串的转换(转载)

    调用Python内置int()函数把该字串转为数字.以下为在Python解释器编程环境下的操作示范: 把十六进制的字串转为十进制数字:Python代码>>> print int('f ...

  2. Winform拖拽改变无边框窗体大小

    大家在进行Winform开发过程中,很容易就可以完成一个窗口的布局工作,但现在的软件界面美化效果一个比一个好,很多软件都是无边框的,于是乎,你是不是也感叹:winform的带边框的窗体如此丑陋,我一定 ...

  3. Vue数据双向绑定探究

    前面的啰嗦话,写一点吧,或许就有点用呢 使用过vue的小伙伴都会感觉,哇,这个框架对开发者这么友好,简直都要笑出声了. 确实,使用过vue的框架做开发的人都会感觉到,以前写一大堆操作dom,bom的东 ...

  4. codeforces776E

    传送门 这题看着很唬人,但实际上是道水题... f[n]通过打表或证明,可以发现就是欧拉函数,g[n]恒等于n,所以题目的意思就是让你求n的k次欧拉函数. 可以发现实际上k次欧拉函数,n的数值减小得很 ...

  5. 拓展gcd求不定方程通解

    void gcd(LL a,LL b,LL &d,LL &x,LL &y){ ){d=a;x=;y=;return;} gcd(b,a%b,d,x,y); int t=x; x ...

  6. javase练习题

    偶然看到一份javase的练习题,mark一下,以后练习下 [程序1] 题目:古典问题:有一对兔子,从出生后第3个月起每个月都生一对兔子,小兔子长到第三个月后每个月又生一对兔子,假如兔子都不死,问每个 ...

  7. ansible使用中遇到的问题

    前提是,可以ssh无秘钥过去,但是使用ansible就报这个错误, 正在找造成的原因及解决方法 第一步, 明白了,,如何已经打通ssh无秘钥后,就不能再 hosts中加入ansible_ssh_pas ...

  8. HTML页面下雪特效

    1. [代码][HTML]代码     <a  href="javascript:void(function(){var d = document,a = 'setAttribute' ...

  9. [原创]java对word文档的在线打开

    一.材料准备 百度一下:PageOffice,从官网下载PageOffice for Java.压缩包文件: 二. 实现步骤: 1. 打开“集成文件”目录,拷贝“WEB-INF\lib”目录中的pag ...

  10. C语言中数组做函数参数的问题

    数组做函数参数,会退化成为一个指针变量.因此在进行数组参数传递的同时,需要传递一个数组长度的参数变量. 数组长度可以通过sizeof(arr)/siezof(arr[0])来得到.关于这个sizeof ...