Qt數據庫應用之實現圖片轉pdf
一、前言
用戶的需求真的是千奇百怪,剛做完不同頁面橫向縱向排版的需求,又來個需要圖片轉pdf的需求,提供靜態函數直接使用。 經過這麼些年的社會的毒打,我的原則是:用戶是上帝和大爺,盡量站在用戶的角度換位思考,隻要是合理或者基本合理的需求,甚至說隻要不是太過分,給錢就幹。
接到這個需求的時候,第一時間想到的就是用QPainter繪制圖片到打印機對象,之前就用QPainter繪制瞭200多個自定義控件,對於QPainter如何繪制,心中早有代碼自動生成瞭,現在看到真實世界的很多東西,尤其是圖形,都自動在腦海中轉成瞭代碼,比如公交車上的路線圖,到某個站點自動點亮。既然QPrinter支持QPainter繪制,這兩者結合就是對程序員的繪制功底要求高,熟悉瞭以後繪制起來還是非常順手的,因為思路和方法完全一樣。
在封裝的本函數中,可以直接傳入圖片文件名稱,需要保存的文件名,如果保存的文件名為空,則取同名文件,就拓展名格式不一樣,還可以傳入資源文件中的圖片,可以設置如何縮放,是拉伸填充還是等比例縮放等。
二、功能特點
- 組件同時集成瞭導出數據到csv、xls、pdf和打印數據。
- 所有操作全部提供靜態方法無需new,數據和屬性等各種參數設置采用結構體數據,極為方便。
- 同時支持QTableView、QTableWidget、QStandardItemModel、QSqlTableModel等數據源。
- 提供靜態方法直接傳入QTableView、QTableWidget控件,自動識別列名、列寬和數據內容。
- 每組功能都提供單獨的完整的示例,註釋詳細,非常適合各階段Qter程序員。
- 原創導出數據機制,不依賴任何office組件或者操作系統等第三方庫,支持嵌入式linux。
- 速度超快,9個字段10萬行數據隻需要2秒鐘完成。
- 隻需要四個步驟即可開始急速導出海量數據比如100W條記錄到Excel。
- 同時提供直接寫入數據接口和多線程寫入數據接口,不卡主界面。
- 可設置標題、副標題、表名。
- 可設置導出數據的字段名、列名、列寬。
- 可設置末尾列自動拉伸填充,默認拉伸更美觀。
- 可設置是否啟用校驗過濾數據,啟用後符合規則的數據特殊顏色顯示。
- 可指定校驗的列、校驗規則、校驗值、校驗值數據類型。
- 校驗規則支持 精確等於==、大於>、大於等於>=、小於<、小於等於<=、不等於!=、包含contains。
- 校驗值數據類型支持 整型int、浮點型float、雙精度型double,默認文本字符串類型。
- 可設置隨機背景顏色及需要隨機背景色的列集合。
- 支持分組輸出數據,比如按照設備分組輸出數據,方便查看。
- 可設置csv分隔符、行內容分隔符、子內容分隔符。
- 可設置邊框寬度、自動填數據類型,默認自動數據類型開啟。
- 可設置是否開啟數據單元格樣式,默認不開啟,不開啟可以節約大概30%的文件體積。
- 可設置橫向排版、紙張邊距等,比如導出到pdf以及打印數據。
- 提供圖文混排導出數據到pdf以及打印示例,自動分頁,支持多圖。
- 提供一個打印樣板中同時包括橫向縱向排版示例。
- 提供靜態函數將控件截圖導出到pdf文件。
- 提供靜態函數將圖片轉成pdf文件。
- 提供靜態函數將csv文件轉成xls文件,支持列寬表名等參數設置。
- 針對每列可分別設置字段對齊樣式、內容對齊樣式,包括左對齊、居中對齊、右對齊。
- 靈活性超高,可自由更改源碼設置對齊方式、文字顏色、背景顏色等。
- 支持任意excel表格軟件,包括但不限於excel2003-2021、wps、openoffice等。
- 純Qt編寫,支持任意Qt版本+任意編譯器+任意系統。
三、體驗地址
體驗地址:https://pan.baidu.com/s/1eeL5MTz0rifwtVLegRpkoQ 提取碼:erxm 文件名:bin_dataout.zip
國內站點:https://gitee.com/feiyangqingyun
國際站點:https://github.com/feiyangqingyun
四、效果圖
五、相關代碼
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 //調整圖片大小比如等比例縮放拉伸填充等 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; //圖片寬度小於繪制區域寬度沒有縮放處理過的圖片 才需要按照比例自動居中繪制 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"); } //資源文件則當前目錄下 if (imageFile.startsWith(":/")) { fileName = qApp->applicationDirPath() + "/" + QFileInfo(imageFile).baseName() + ".pdf"; } toPdf(QPixmap(imageFile), fileName, scale); return fileName; }
到此這篇關於Qt數據庫應用之實現圖片轉pdf的文章就介紹到這瞭,更多相關Qt 圖片轉pdf內容請搜索WalkonNet以前的文章或繼續瀏覽下面的相關文章希望大傢以後多多支持WalkonNet!