Qt數據庫應用之實現圖片轉pdf

一、前言

用戶的需求真的是千奇百怪,剛做完不同頁面橫向縱向排版的需求,又來個需要圖片轉pdf的需求,提供靜態函數直接使用。 經過這麼些年的社會的毒打,我的原則是:用戶是上帝和大爺,盡量站在用戶的角度換位思考,隻要是合理或者基本合理的需求,甚至說隻要不是太過分,給錢就幹。

接到這個需求的時候,第一時間想到的就是用QPainter繪制圖片到打印機對象,之前就用QPainter繪制瞭200多個自定義控件,對於QPainter如何繪制,心中早有代碼自動生成瞭,現在看到真實世界的很多東西,尤其是圖形,都自動在腦海中轉成瞭代碼,比如公交車上的路線圖,到某個站點自動點亮。既然QPrinter支持QPainter繪制,這兩者結合就是對程序員的繪制功底要求高,熟悉瞭以後繪制起來還是非常順手的,因為思路和方法完全一樣。

在封裝的本函數中,可以直接傳入圖片文件名稱,需要保存的文件名,如果保存的文件名為空,則取同名文件,就拓展名格式不一樣,還可以傳入資源文件中的圖片,可以設置如何縮放,是拉伸填充還是等比例縮放等。

二、功能特點

  1. 組件同時集成瞭導出數據到csv、xls、pdf和打印數據。
  2. 所有操作全部提供靜態方法無需new,數據和屬性等各種參數設置采用結構體數據,極為方便。
  3. 同時支持QTableView、QTableWidget、QStandardItemModel、QSqlTableModel等數據源。
  4. 提供靜態方法直接傳入QTableView、QTableWidget控件,自動識別列名、列寬和數據內容。
  5. 每組功能都提供單獨的完整的示例,註釋詳細,非常適合各階段Qter程序員。
  6. 原創導出數據機制,不依賴任何office組件或者操作系統等第三方庫,支持嵌入式linux。
  7. 速度超快,9個字段10萬行數據隻需要2秒鐘完成。
  8. 隻需要四個步驟即可開始急速導出海量數據比如100W條記錄到Excel。
  9. 同時提供直接寫入數據接口和多線程寫入數據接口,不卡主界面。
  10. 可設置標題、副標題、表名。
  11. 可設置導出數據的字段名、列名、列寬。
  12. 可設置末尾列自動拉伸填充,默認拉伸更美觀。
  13. 可設置是否啟用校驗過濾數據,啟用後符合規則的數據特殊顏色顯示。
  14. 可指定校驗的列、校驗規則、校驗值、校驗值數據類型。
  15. 校驗規則支持 精確等於==、大於>、大於等於>=、小於<、小於等於<=、不等於!=、包含contains。
  16. 校驗值數據類型支持 整型int、浮點型float、雙精度型double,默認文本字符串類型。
  17. 可設置隨機背景顏色及需要隨機背景色的列集合。
  18. 支持分組輸出數據,比如按照設備分組輸出數據,方便查看。
  19. 可設置csv分隔符、行內容分隔符、子內容分隔符。
  20. 可設置邊框寬度、自動填數據類型,默認自動數據類型開啟。
  21. 可設置是否開啟數據單元格樣式,默認不開啟,不開啟可以節約大概30%的文件體積。
  22. 可設置橫向排版、紙張邊距等,比如導出到pdf以及打印數據。
  23. 提供圖文混排導出數據到pdf以及打印示例,自動分頁,支持多圖。
  24. 提供一個打印樣板中同時包括橫向縱向排版示例。
  25. 提供靜態函數將控件截圖導出到pdf文件。
  26. 提供靜態函數將圖片轉成pdf文件。
  27. 提供靜態函數將csv文件轉成xls文件,支持列寬表名等參數設置。
  28. 針對每列可分別設置字段對齊樣式、內容對齊樣式,包括左對齊、居中對齊、右對齊。
  29. 靈活性超高,可自由更改源碼設置對齊方式、文字顏色、背景顏色等。
  30. 支持任意excel表格軟件,包括但不限於excel2003-2021、wps、openoffice等。
  31. 純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!

推薦閱讀: