Qt數(shù)據(jù)庫應(yīng)用之實(shí)現(xiàn)圖片轉(zhuǎn)pdf
一、前言
用戶的需求真的是千奇百怪,剛做完不同頁面橫向縱向排版的需求,又來個需要圖片轉(zhuǎn)pdf的需求,提供靜態(tài)函數(shù)直接使用。 經(jīng)過這么些年的社會的毒打,我的原則是:用戶是上帝和大爺,盡量站在用戶的角度換位思考,只要是合理或者基本合理的需求,甚至說只要不是太過分,給錢就干。
接到這個需求的時候,第一時間想到的就是用QPainter繪制圖片到打印機(jī)對象,之前就用QPainter繪制了200多個自定義控件,對于QPainter如何繪制,心中早有代碼自動生成了,現(xiàn)在看到真實(shí)世界的很多東西,尤其是圖形,都自動在腦海中轉(zhuǎn)成了代碼,比如公交車上的路線圖,到某個站點(diǎn)自動點(diǎn)亮。既然QPrinter支持QPainter繪制,這兩者結(jié)合就是對程序員的繪制功底要求高,熟悉了以后繪制起來還是非常順手的,因?yàn)樗悸泛头椒ㄍ耆粯印?/p>
在封裝的本函數(shù)中,可以直接傳入圖片文件名稱,需要保存的文件名,如果保存的文件名為空,則取同名文件,就拓展名格式不一樣,還可以傳入資源文件中的圖片,可以設(shè)置如何縮放,是拉伸填充還是等比例縮放等。
二、功能特點(diǎn)
- 組件同時集成了導(dǎo)出數(shù)據(jù)到csv、xls、pdf和打印數(shù)據(jù)。
- 所有操作全部提供靜態(tài)方法無需new,數(shù)據(jù)和屬性等各種參數(shù)設(shè)置采用結(jié)構(gòu)體數(shù)據(jù),極為方便。
- 同時支持QTableView、QTableWidget、QStandardItemModel、QSqlTableModel等數(shù)據(jù)源。
- 提供靜態(tài)方法直接傳入QTableView、QTableWidget控件,自動識別列名、列寬和數(shù)據(jù)內(nèi)容。
- 每組功能都提供單獨(dú)的完整的示例,注釋詳細(xì),非常適合各階段Qter程序員。
- 原創(chuàng)導(dǎo)出數(shù)據(jù)機(jī)制,不依賴任何office組件或者操作系統(tǒng)等第三方庫,支持嵌入式linux。
- 速度超快,9個字段10萬行數(shù)據(jù)只需要2秒鐘完成。
- 只需要四個步驟即可開始急速導(dǎo)出海量數(shù)據(jù)比如100W條記錄到Excel。
- 同時提供直接寫入數(shù)據(jù)接口和多線程寫入數(shù)據(jù)接口,不卡主界面。
- 可設(shè)置標(biāo)題、副標(biāo)題、表名。
- 可設(shè)置導(dǎo)出數(shù)據(jù)的字段名、列名、列寬。
- 可設(shè)置末尾列自動拉伸填充,默認(rèn)拉伸更美觀。
- 可設(shè)置是否啟用校驗(yàn)過濾數(shù)據(jù),啟用后符合規(guī)則的數(shù)據(jù)特殊顏色顯示。
- 可指定校驗(yàn)的列、校驗(yàn)規(guī)則、校驗(yàn)值、校驗(yàn)值數(shù)據(jù)類型。
- 校驗(yàn)規(guī)則支持 精確等于==、大于>、大于等于>=、小于<、小于等于<=、不等于!=、包含contains。
- 校驗(yàn)值數(shù)據(jù)類型支持 整型int、浮點(diǎn)型float、雙精度型double,默認(rèn)文本字符串類型。
- 可設(shè)置隨機(jī)背景顏色及需要隨機(jī)背景色的列集合。
- 支持分組輸出數(shù)據(jù),比如按照設(shè)備分組輸出數(shù)據(jù),方便查看。
- 可設(shè)置csv分隔符、行內(nèi)容分隔符、子內(nèi)容分隔符。
- 可設(shè)置邊框?qū)挾?、自動填?shù)據(jù)類型,默認(rèn)自動數(shù)據(jù)類型開啟。
- 可設(shè)置是否開啟數(shù)據(jù)單元格樣式,默認(rèn)不開啟,不開啟可以節(jié)約大概30%的文件體積。
- 可設(shè)置橫向排版、紙張邊距等,比如導(dǎo)出到pdf以及打印數(shù)據(jù)。
- 提供圖文混排導(dǎo)出數(shù)據(jù)到pdf以及打印示例,自動分頁,支持多圖。
- 提供一個打印樣板中同時包括橫向縱向排版示例。
- 提供靜態(tài)函數(shù)將控件截圖導(dǎo)出到pdf文件。
- 提供靜態(tài)函數(shù)將圖片轉(zhuǎn)成pdf文件。
- 提供靜態(tài)函數(shù)將csv文件轉(zhuǎn)成xls文件,支持列寬表名等參數(shù)設(shè)置。
- 針對每列可分別設(shè)置字段對齊樣式、內(nèi)容對齊樣式,包括左對齊、居中對齊、右對齊。
- 靈活性超高,可自由更改源碼設(shè)置對齊方式、文字顏色、背景顏色等。
- 支持任意excel表格軟件,包括但不限于excel2003-2021、wps、openoffice等。
- 純Qt編寫,支持任意Qt版本+任意編譯器+任意系統(tǒng)。
三、體驗(yàn)地址
體驗(yàn)地址:https://pan.baidu.com/s/1eeL5MTz0rifwtVLegRpkoQ 提取碼:erxm 文件名:bin_dataout.zip
國內(nèi)站點(diǎn):https://gitee.com/feiyangqingyun
國際站點(diǎn):https://github.com/feiyangqingyun
四、效果圖

五、相關(guān)代碼
void DataOther::toPdf(const QPixmap &pixmap, const QString &fileName, int scale)
{
QPrinter printer(QPrinter::HighResolution);
if (scale > 1) {
printer.setResolution(96);
}
printer.setFullPage(false);
printer.setOutputFormat(QPrinter::PdfFormat);
printer.setOutputFileName(fileName);
#if (QT_VERSION >= QT_VERSION_CHECK(5,3,0))
printer.setPageSize(QPageSize(QPageSize::A4));
printer.setPageOrientation(QPageLayout::Portrait);
#else
printer.setPaperSize(QPrinter::A4);
printer.setOrientation(QPrinter::Portrait);
#endif
//調(diào)整圖片大小比如等比例縮放拉伸填充等
QRectF rect = printer.pageRect(QPrinter::DevicePixel);
QPixmap pix = pixmap;
//保存原圖看下效果
#if 0
QString file = fileName;
file.replace("pdf", "png");
pix.save(file, "png");
#endif
if (scale == 0) {
//pix = pix.scaled(rect.width(), rect.height(), Qt::KeepAspectRatio, Qt::FastTransformation);
pix = pix.scaled(rect.width(), rect.height(), Qt::KeepAspectRatio, Qt::SmoothTransformation);
} else if (scale == 1) {
pix = pix.scaled(rect.width(), rect.height());
}
QPainter painter;
painter.begin(&printer);
int x = 0;
int y = 0;
//圖片寬度小于繪制區(qū)域?qū)挾葲]有縮放處理過的圖片 才需要按照比例自動居中繪制
if (pixmap.width() < rect.width() && scale > 1) {
x = rect.center().x() - pix.width() / 2;
//y = rect.center().y() - pix.height() / 2;
}
painter.drawPixmap(QPoint(x, y), pix);
painter.end();
}
void DataOther::widgetToPdf(QWidget *widget, const QString &fileName, int scale)
{
#if (QT_VERSION >= QT_VERSION_CHECK(5,0,0))
QPixmap pixmap = QApplication::primaryScreen()->grabWindow(widget->winId());
#else
QPixmap pixmap = QPixmap::grabWindow(widget->winId());
#endif
toPdf(pixmap, fileName, scale);
}
QString DataOther::imageToPdf(const QString &imageFile, const QString &pdfFile, int scale)
{
//為空則同名文件
QString fileName = pdfFile;
if (fileName.isEmpty()) {
fileName = imageFile;
fileName.replace("." + QFileInfo(imageFile).suffix(), ".pdf");
}
//資源文件則當(dāng)前目錄下
if (imageFile.startsWith(":/")) {
fileName = qApp->applicationDirPath() + "/" + QFileInfo(imageFile).baseName() + ".pdf";
}
toPdf(QPixmap(imageFile), fileName, scale);
return fileName;
}
到此這篇關(guān)于Qt數(shù)據(jù)庫應(yīng)用之實(shí)現(xiàn)圖片轉(zhuǎn)pdf的文章就介紹到這了,更多相關(guān)Qt 圖片轉(zhuǎn)pdf內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
C++調(diào)用迅雷接口解析XML下載功能(迅雷下載功能)
這篇文章主要介紹了C++調(diào)用迅雷接口,封裝解析XML下載的類,功能簡單,大家參考使用吧2013-11-11
如何使用arm-none-eabi-gcc編譯器搭建STM32的Vscode開發(fā)環(huán)境
這篇文章主要介紹了使用arm-none-eabi-gcc編譯器搭建STM32的Vscode開發(fā)環(huán)境,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2023-07-07
Qt數(shù)據(jù)庫應(yīng)用之實(shí)現(xiàn)通用數(shù)據(jù)庫采集
這篇文章主要為大家介紹了Qt中是如何實(shí)現(xiàn)通用數(shù)據(jù)庫采集的,文中的示例代碼講解詳細(xì),對我們學(xué)習(xí)Qt有一定幫助,感興趣的小伙伴可以了解一下2022-03-03
C語言字符串函數(shù)與內(nèi)存函數(shù)精講
這篇文章主要介紹一些c語言中常用字符串函數(shù)和內(nèi)存函數(shù)的使用,并且為了幫助讀者理解和使用,也都模擬實(shí)現(xiàn)了他們的代碼,需要的朋友可以參考一下2022-04-04

