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>";
最后结果得到的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 += "<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文件中去。
得到的结果如图:
pdf和word的生成就完成了,具体得到的结果可能格式上还需要调整,html对于调格式还是很方便的。
注:转载请注明出处
http://blog.csdn.net/tszhangjunqiao/article/details/22681351
Qt 生成word、pdf文档的更多相关文章
- 使用FastReport报表工具生成报表PDF文档
在我们开发某个系统的时候,客户总会提出一些特定的报表需求,固定的报表格式符合他们的业务处理需要,也贴合他们的工作场景,因此我们尽可能做出符合他们实际需要的报表,这样我们的系统会得到更好的认同感.本篇随 ...
- 将Word,PDF文档转化为图片
#region 将Word文档转化为图片 /// <summary> /// 将Word文档转化为图片 /// </summary> /// <param name=&q ...
- iOS - 开发中加载本地word/pdf文档说明
最近项目中要加载一个本地的word/pdf等文件比如<用户隐私政策><用户注册说明>,有两种方法加载 > 用QLPreviewController控制器实现 步骤 : & ...
- javadoc生成word接口文档
1.下载DocFlex/Doclet 下载地址 http://www.filigris.com/downloads/ 2.ecplise->project->generate javado ...
- 自动把动态的jsp页面(或静态html)生成PDF文档,并且上传至服务器
置顶2017年11月06日 14:41:04 阅读数:2311 这几天,任务中有一个难点是把一个打印页面自动给生成PDF文档,并且上传至服务器,然而公司框架只有手动上传文档,打印时可以保存为PDF在本 ...
- 使用itextsharp创建PDF文档——图片集合
文档管理系统中 ,扫描模块将文档或证件扫描后.为了便于保存多个图片,拟将多个图片生成一个PDF文档进行保存. 这里我们就需要PDF生成工具了.你可以在这里下载.PDFCreator 主要使用了开源工具 ...
- 使用Spire PDF for .NET将HTML转换成PDF文档
目录 开发环境说明 Spire PDF for .NET (free edition)体验 资源下载 开发环境说明 Microsoft Visual Studio 2013 Ultimate Edit ...
- Java 设置PDF文档背景色
一般生成的PDF文档默认的文档底色为白色,我们可以通过一定方法来更改文档的背景色,以达到文档美化以及保护双眼的作用. 以下内容提供了Java编程来设置PDF背景色的方法.包括: 设置纯色背景色 设置图 ...
- Java 设置PDF文档背景——单色背景、图片背景
一般生成的PDF文档默认的文档底色为白色,我们可以通过一定方法来更改文档的背景色,以达到文档美化的作用. 以下内容提供了Java编程来设置PDF背景色的方法.包括2种设置方法: 设置纯色背景色 设置图 ...
- 使用TCPDF输出完美的中文PDF文档
TCPDF是一个用于快速生成PDF文件的PHP5函数包.TCPDF基于FPDF进行扩展和改进.支持UTF-8,Unicode,HTML和XHTML.在基于PHP开发的Web应用中,使用它来输出PDF文 ...
随机推荐
- maven的坑: Exception in thread "pool-1-thread-1" java.lang.NoClassDefFoundError: org/eclipse/aether/spi/connector/Transfer$State
搭建ReboletricSample的环境: 搭建完成,执行的时候报错: Exception in thread "main" java.lang.NoClassDefFoundE ...
- 关于erlang中的timer:tc/3
timer:tc/3对于统计函数运行时间是个很不错的函数, 截图timer:tc/1,tc/2,tc/3的API: 拿斐波那契数列入手做个讲解: -module(fib). -export([fib/ ...
- eclipse中run as无run as server选项的解决方案
在项目->右击->Properties->Project Facets->Modify Project,选择Java和DynamicWeb Module
- GreenPlum 安装方法详解
一.安装环境准备 1.磁盘环境准备 磁盘分区典型配置如下: 文件系统 文件格式 大小 / ext3 50GB,Linux系统的根目录,所有的目录都挂在这个目录下面,建议大小为 ...
- RecyclerView的那点事儿
RecyclerView 控件简单介绍 ListView的升级版 LinearLayoutManager GridLayoutManager StaggeredGridLayoutManager 定制 ...
- Erlang二进制模式匹配
Erlang的模式匹配用来处理二进制数据可谓是得心应手.不仅直观,而且超乎想象的简单.在C++中,处理二进制数据首先要管理缓冲区.然后再按字节进行操作,如果要处理的数据不是按字节对齐,则需要进行位移等 ...
- EasyDarwin开源音频解码项目EasyAudioDecoder:EasyPlayer Android音频解码库(第二部分,封装解码器接口)
上一节我们讲了如何基于ffmpeg-Android工程编译安卓上的支持音频的ffmpeg静态库:http://blog.csdn.net/xiejiashu/article/details/52524 ...
- 1 Maven简介
一.构建(build) 清理.编译.测试.打包.部署等一系列操作. 二.maven介绍: maven是一个强大的构建工具,能够帮助我们自动化构建过程:从清理(clean).编译(com ...
- 20170306 处理adobe flash player报错
网页总是弹出Adobe Flash Player弹窗报错怎么办?打开网页时经常被Adobe Flash Player报错提示框困扰. 其实是因为系统安装了Debug版本的Flash Player,可是 ...
- Linux升级安装GCC G++ 6.2
使用yum安装是不可能了,各大仓库也没有,只能自己编译安装了. 系统为CentOS 6.5,gcc为4.4.7 1 下载源代码包 当前最新版为6.2: wget http://ftp.gnu.org/ ...