1. 程式人生 > >Qt 生成word、pdf文件

Qt 生成word、pdf文件

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

開發環境:qt4.8.4+vs2010

在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的生成


書籤主要在表格的第一行前兩列,分別是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對於調格式還是很方便的。

注:轉載請註明出處

相關推薦

Qt 生成wordpdf

需求:將軟體處理的結果儲存為一個報告文件,文件中包含表格、圖片、文字,格式為word的.doc和.pdf。生成word是為了便於使用者編輯。 開發環境:qt4.8.4+vs2010 在qt的官網上

將jsp頁面生成wordexcelpdf

      開發過程中,有時要求將顯示查詢結果的jsp頁面生成word、excel、pdf等型別的文件,甚至可能要求將那些格式的文件下載下來,因為這樣更符合客戶的需求,也更利於他們的辦公使用。        基於此,上網查閱了一些資料,現簡單整理一下,以供自己和大家學習。

Asp.net或C#使用word模板生成替換後的Wordpdf-總結

在企業管理專案開發中,經常會有使用給定的模板檔案,以及使用者提交到資料裡的資料,按照一定的格式,生成指定的word和pdf文件。在這裡進行一個總結:注意:(1)要再專案中新增引用:using System.Collections.Generic; using System.

利用python3爬蟲下載圖片pdf

環境 語言環境:python3.6 作業系統:Win10 第三方庫 requests 網際網路上的資源大都是以二進位制形式儲存和運輸的,如圖片、pdf、音訊、視訊等,像.dat、.ts等這些不常用的檔案也都是二進位制。我們知道python3爬蟲是利用爬蟲模擬瀏覽器向服務端傳送請求

Java小技巧自動生成註釋api

cmd 命令 javadoc的使用 win+R彈出執行視窗 輸入cmd回車,進入dos介面,輸入java -version,檢查java是否配置好。如下圖所示 配置好java後,我們新建一個含有公共類的java檔案,在裡面寫點東西。 然後儲存到資料夾test裡面

java對officepdf線上預覽解析(融合進專案中)

最近在專案中要做一個文件的預覽,在網上搜了好多demo,都可以實現其功能,但是放在自己的專案中有點複雜。 先說明本人的開發環境(win7+tomcat7+maven+svn+myeclipse),接下來最直觀的專案需求,如下圖: 當用戶點選預覽的時候能看各種文件,其實在這

aspose利用word模板生成wordPDF

專案需求:表單歸檔時生成表單word、PDF檔案 先上效果圖 1、word模板(部分)書籤  2、生成結果圖 開始上程式碼 Dictionary<string, string> dictSource = new Dictionary<string,

通過swagger2markup+asciidoctorj生成html和pdf並解決asciidoctorj生成pdf檔案中文顯示不全問題(maven方式及java程式碼方式)

通過swagger2markup+asciidoctorj生成html和pdf文件(maven方式及java程式碼方式) 任務:通過同事的json檔案生成相應的html和pdf文件 前言 開始時swagger2markup和asciidocto

java 編碼填充 word 模板生成 word合同,並將word合同轉成pdf

                        &nbs

利用QT生成Word

   前段時間因一個專案的需要,需要用Qt生成Word報告,網上查閱並借鑑了相關資料終於解決了基本的問題。本文件中主要是基本資料的填充、資料表格和圖片幾種型別,所以是用word模板(.dot)和書籤進行操作。(網上看有種方法是利用巨集來進行操作,表示不是很懂,哈哈)。 一、

Qt實現生成PDF

Qt生成pdf方法網上也有很多,但是大多樹都是單獨生成文字的PDF或者單獨生成圖片的PDF,要把文字和圖片同時生成在一張PDF檔案上還真不那麼容易。 本文采用的兩種方法生成PDF,一種是使用html檔案的方法生成PDF檔案,另一種是採用QPainter繪製的方

java通過url線上預覽Wordexcelpptpdftxt中的內容【只獲得其中的文字】

在頁面上顯示各種文件中的內容。在servlet中的邏輯 word:  BufferedInputStream bis = null;   URL url = null;   HttpURLConnection httpUrl = null; // 建立連結   url

java 編碼填充 word 模板生成 word合同,並將word合同轉成pdf

                                                                                      java 編碼填充  word 模板生成  word合同,並將word合同轉成pdf  文件 一、

Qt程序關於路徑用戶目錄路徑臨時夾位置獲取方法

lis 靜態函數 目錄下的文件 兩個 top 存儲 class ber ron   比如我們有一個程序在:   C:/Qt/examples/tools/regexp/regexp.exe 1. 程序所在目錄   QString QCoreApplication::appl

ST MCU生成PDF+壓縮解壓

需要 ren aud 文件 無奈 .com 導致 壓縮解壓 str 之前碰到過,STM32F407上做文件壓縮,無奈壓縮文件時,哈夫曼編碼需要耗費很大的RAM,導致失敗。後來在論壇壇主的幫助下,了解了LZ77壓縮。 今天看論壇的時候,了解到MCU上,用pdflib庫,可以做

編輯PDF太難的話,只需要將PDF轉換成Word就行了

pdf pdf轉換 word 現在網上下載下來的很多文檔,資料,都是PDF格式的,而我們下載下來,希望可以摘取裏面的一部分內容來使用或者參考,又或者希望能夠修改裏面的一些內容或者數據,那我們應該如何做到呢?我們可以在PDF裏面直接進行編輯,不過這個需要借助其他的軟件,今天我們就不說這方面的方法,我

生成PDF

open() nbsp rec order name wid ons fwrite epo @Action("report_exportPdf") public String exportPdf() throws Exception{ //查詢出滿足當前

Java 使用 jacob 將 word 檔轉換為 pdf

打開文檔 image form 不用 以及 利用 lin sts source   網上查詢了許許多多的博客,說利用 poi、iText、Jsoup、jdoctopdf、使用 jodconverter 來調用 openOffice 的服務來轉換等等,我嘗試了很多種,但要麽顯

史上最強php生成pdf,html轉pdf方法

是不是 下載地址 註意 pdflib min views 開發者 lan 輸入 之前有個客戶需要把一些html頁面生成pdf文件,然後我就找一些用php把html頁面圍成pdf文件的類。方法是可謂是找了很多很多,什麽html2pdf,pdflib,FPDF這些都試過了,但是

頁面生成PDF。。。。

filesize .cn str cat 找到 req 百度網 百度網盤 range 終於找到一個能完美生成pdf文件的包了,TCPDF。 官網:www.tecnick.com 真的是找了好久。 我的百度網盤裏有這個,http://pan.baidu.com/s/1nv