需求:将软件处理的结果保存为一个报告文档,文档中包含表格、图片、文字,格式为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. 记使用WaitGroup时的一个错误

    记使用WaitGroup时的一个错误 近期重构我之前写的server代码时,不当使用了WaitGroup,碰到了个错误,记录下. package main import ( "fmt&quo ...

  2. 使用 QWorker 做为计划任务引擎

    QWorker 提供了 Plan 函数来提供计划任务功能的支持.每个任务做为一个作业,可以在指定的时间点被触发执行.而 cron 作为 Linux 操作系统下计划任务的标准被广大用户所熟知,QWork ...

  3. VCL里的构造函数

    好奇,为什么Create函数明明是个构造函数,还要带上override;这是C++里没有的事情.我虽然也明白其大致的作用和目的,但还是没有见到官方和权威的说法.如果哪位大大见到此文,还望给一个详细一点 ...

  4. windowbuilder安装

    windowbuilder,也就是原来的SWT Designer.Google收购了Instantiations,把它的工具也重新免费发布了.用过swt designer的人都知它是非常好用的swin ...

  5. 牛客练习赛14 D 比较月亮大小 【水】

    链接:https://www.nowcoder.com/acm/contest/82/D 来源:牛客网 比较月亮大小 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 262144K,其 ...

  6. IDEA 打开多个项目

    简单的说只需要以下几步: 1.将需要同时打开的模块放在一个文件夹下,e.g. AModel 和 BModel 同时放在 Project 文件夹下. 2.在 IDEA 初始导入项目页面选择 open - ...

  7. java基础以及操作Excle

    今天把会经常用的几个集合的迭代方法又练习了一下,放在这里,经常复习! map集合迭代 /*** 迭代map[1]*/ for (Integer key : map.keySet()) {//迭代key ...

  8. 数据结构之 字符串---字符串匹配(kmp算法)

    串结构练习——字符串匹配 Time Limit: 1000MS Memory limit: 65536K 题目描述   给定两个字符串string1和string2,判断string2是否为strin ...

  9. (转)如何使用Java、Servlet创建二维码

    归功于智能手机,QR码逐渐成为主流,它们正变得越来越有用.从候车亭.产品包装.家装卖场.汽车到很多网站,都在自己的网页集成QR码,让人们快速找到它们.随着智能手机的用户量日益增长,二维码的使用正在呈指 ...

  10. SQL:内连接、左外连接、右外连接、全连接、交叉连接区别

    有两个表A和表B.表A结构如下: Aid:int:标识种子,主键,自增ID Aname:varchar 数据情况,即用select * from A出来的记录情况如下图1所示: 图1:A表数据表B结构 ...