需求:將軟件處理的結果保存為一個報告文檔,文檔中包含表格、圖片、文字,格式為word的.doc和.pdf。生成word是為了便於用戶編輯。

開發環境:qt4.8.4+vs2010

在qt的官網上對於pdf的操作介紹如下:http://qt-project.org/wiki/Handling_PDF 。即通過QPrinter類來創建pdf;還有通過第三方庫PoDoFo

在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 += "

育種管理模塊

";

html += "

" + current_date + "
";

//圖片部分

html += "
" ;

//表格部分

html += "

html +="

";

QString fieldname;

for ( int i = 0; i < fieldCount; ++i)

{

fieldname = fields[i].name();

html +="

" + fieldname + "";

}

html +="

";

最后結果得到的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 += "

"; //這句可加可不加。主要是因為我在word里把doc另存為html文件后,看到有這么個頭標簽,由此想到直接將html文檔保存為doc文件。

html =GeneratePicWord();//該函數同生產pdf文檔的一樣

QFile outFile(docname);

outFile.open(QIODevice::WriteOnly | QIODevice::Append );

QTextStream ts(&outFile);

ts<

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

得到的結果如圖:

pdf和word的生成就完成了,具體得到的結果可能格式上還需要調整,html對於調格式還是很方便的。

注:轉載請注明出處

linux qt 生成word,Qt 生成word、pdf文檔相关推荐

  1. [Linux]Linux打開world、Excel、pdf文檔,常用Linux命令總結

    Linux打開world.Excel.pdf文檔 ---- 常用Linux命令總結 一.在Linux中打開world文檔(需要安裝openoffice) 1.1.打开或编辑.doc .odt等文本文档 ...

  2. java操作office和pdf文件java读取word,excel和pdf文档内容

    在平常应用程序中,对office和pdf文档进行读取数据是比较常见的功能,尤其在很多web应用程序中.所以今天我们就简单来看一下Java对word.excel.pdf文件的读取.本篇博客只是讲解简单应 ...

  3. 如何将Word图片转换成PDF文档

    Word转为PDF一直以来都是很多人常提起的话题,尤其像一些经常处理各类文档的编辑,各种文档格式直接的转换也是常遇到的事.网上教程讲解很多,但是换了其他的形式就不会做了.例如最近我自己制作了一个图片形 ...

  4. word怎么转换成pdf文档——两种转换方法分享

    当大家碰到Word转PDF问题的时候,第一反应应该就是百度找方法,但是网上关于这类问题的解决方法五花八门,推荐的软件也是中用和不中用的都有,根本无从下手,那么,面对如何将word转换成pdf文档的问题 ...

  5. java根据pdf模板生成pdf_Java 复制、压缩PDF文档

    在日常办公中,掌握操作PDF文档的能力尤为重要.在前文中我使用Java程序来演示过如何合并和拆分PDF文档.本文将介绍如何复制和压缩文档.通常复制文档有两种形式,一种是跨文档复制,即将一个文档复制到另 ...

  6. java 生成纯色图片_Java 给PDF文档设置背景色(纯色、背景图片)

    import com.spire.pdf.PdfDocument; import com.spire.pdf.PdfPageBase; import java.awt.*; public class ...

  7. java html 生成 pdf_Java实现HTML代码生成PDF文档

    1.IText实现html2pdf,速度快,纠错能力差,支持中文(要求HTML使用unicode编码),但中支持一种中文字体,开源. 2.Flying Sauser实现html2pdf,纠错能力差,支 ...

  8. QT5 界面截图保存到本地+输出PDF/WORD格式文档+QT界面中文乱码及输出PDF中文乱码的解决(亲身实践并且成功)

    最近做了一个和QT5有关的项目,遇到很多问题也学习到不少,特意写下来希望帮到更多的人.(我的版本VS2017+QT5.12.0) 一.QT5截图并保存到本地 在头文件添加必须项 #include &l ...

  9. 关于python:如何将Word文档批量转换为PDF文档

    Q:         我们在实际工作中很容易发现,有些时候我们需要将Word文档转换为PDF文档,如果只是一个文件,我们也只是需要通过Word提供的转换为PDF文档的功能就可以实现了.但是WPS需要收 ...

最新文章

  1. 除了计算机中的二进制还有哪些进位制,除了十进位制还有什么进位制
  2. Java™ 教程(Queue接口)
  3. uart——51程序
  4. 1043:整数大小比较
  5. python数据分析基础教程考试试卷_Python数据分析-自测试卷5
  6. 轮子一定要是圆的吗?
  7. Python学习笔记:模块与包
  8. 用C#连接到数据库实现学生学籍管理系统
  9. 在线摇骰子/色子工具
  10. AngularJS Providers 详解
  11. 空间留言工具_新房,拖把等清洁工具都放哪?
  12. tkinter 文本框 值改变_【动图详解】PPT中文本框的使用方法,初学者必看!
  13. html文章标题加粗,织梦去除推荐文章标题加粗标签的方法
  14. oj1029统计素数并求和
  15. python布尔类型的两个值_布尔人有两个可能的值。是否有三种可能值的类型?
  16. iPad 生产力指南:如何把MathType7安装在iPad中,方便写公式,写论文,公式编辑器,完全免费
  17. 有原函数,可积、变限积分
  18. C++实现基于博弈树的5x5一子棋人机对战
  19. 短期python培训机构
  20. 【小程序】小程序托管平台的功能展望与想法

热门文章

  1. 综述 | 基于深度学习的目标检测算法
  2. 基于多阈值注意U-Net(MTAU)的MRI多模态脑肿瘤分割模型
  3. 【OpenCV 4开发详解】轮廓发现与绘制
  4. 第十五篇:依存语法Dependency Grammar
  5. Leetcode (396 旋转函数)
  6. VC++ GetSafeHwnd()和GetSafeHandle()
  7. MySQL双主一致性架构优化
  8. 爱上MVC3系列~分部视图中的POST
  9. 浅谈分布式计算的开发与实现(一)
  10. runtime 任意类型 model 数据库方便存储