Qt 生成word、pdf文档

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

开发环境: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文档。ui

下面举例详细说明pdf和word文档的生成:this

1.pdf的生成spa

pdf文档里要求有表格、图片、文字,参考博客:http://blog.sina.com.cn/s/blog_a6fb6cc90101gvnx.html。里面有介绍文字、图片、表格分别是怎样经过QPrinter类来实现的。可是遇到一个麻烦就是怎样把这三种格式的东西放在一块儿并且排版好呢,用上述博客里的方法尝试以后,最终肯定使用第三种生成表格(html格式)的方式来获得:.net

[cpp]  view plain  copy
 
 在CODE上查看代码片派生到个人代码片
  1. QPrinter printer_text;  
  2. printer_text.setOutputFormat(QPrinter::PdfFormat);  
  3. printer_text.setOutputFileName(pdfname);//pdfname为要保存的pdf文件名  
  4.   
  5. QTextDocument text_document;  
  6. QString html = GeneratePicWord();//自定义的函数,用来生成html代码  
  7.   
  8. text_document.setHtml(html);  
  9. text_document.print(&printer_text);  
  10. QTextBlock it = text_document.end();  

GeneratePicWord()函数的内容大体以下:code

 

[cpp]  view plain  copy
 
 在CODE上查看代码片派生到个人代码片
  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如图:orm

2.word的生成xml

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

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

 

[cpp]  view plain  copy
 
 在CODE上查看代码片派生到个人代码片
  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.   
  10. QString code = "code";  
  11. QAxObject *bookmark_code = document->querySubObject("Bookmarks(QVariant)", "code");  
  12. if ( !bookmark_code->isNull())  
  13. {  
  14.     bookmark_code->dynamicCall("Select(void)");  
  15.     bookmark_code->querySubObject("Range")->setProperty("Text", "textg");  
  16. }  
  17. QAxObject *bookmark_ndvi = document->querySubObject("Bookmarks(QVariant)", "ndvi");  
  18. if ( !bookmark_ndvi->isNull())  
  19. {  
  20.     bookmark_ndvi->dynamicCall("Select(void)");  
  21.     bookmark_ndvi->querySubObject("Range")->setProperty("Text", "ndvi");  
  22. }  
  23.   
  24. QAxObject *bookmark_ndvi2 = document->querySubObject("Bookmarks(QVariant)", "ndvi");  
  25. if ( !bookmark_ndvi2->isNull())  
  26. {  
  27.     bookmark_ndvi2->dynamicCall("Select(void)");  
  28.     bookmark_ndvi2->querySubObject("Range")->setProperty("Text", "ndvi2");  
  29. }  
  30.   
  31. QAxObject *bookmark_pic = document->querySubObject("Bookmarks(QVariant)", "pic");  
  32. if ( !bookmark_pic->isNull())  
  33. {  
  34.     bookmark_pic->dynamicCall("Select(void)");  
  35.     QAxObject *shapes = document->querySubObject("InlineShapes");  
  36.     shapes->dynamicCall("AddPicture(Const QString&)", "F:\\CND.jpg");  
  37.       
  38. }  
  39. document->dynamicCall("SaveAs (const QString&)", QString("F:/testword.doc"));  
  40. document->dynamicCall("Close(boolean)", false);  
  41. word->dynamicCall("Quit()");  

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

 

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

固然不能直接把生成pdf的文件名改为doc就好了,还须要作下面一个事情:

 

[cpp]  view plain  copy
 
 在CODE上查看代码片派生到个人代码片
  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.   
  5. QFile outFile(docname);  
  6. outFile.open(QIODevice::WriteOnly | QIODevice::Append );  
  7. QTextStream ts(&outFile);  
  8. ts<<html<<endl;  

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

 

获得的结果如图:

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

 

注:转载请注明出处

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

相关文章
相关标签/搜索