(十七)QT生成PDF文件

在实际情况中,我们有时候会遇到需要把txt、html或者图片变成PDF文件的情况,例如把检测结果生成PDF文档给客户等等。QT4使用QPrinter来实现这个功能,QT5修改为QPdfWriter这个类。

一、QT5的修改

如果你想在QT5中使用QPrinter来实现这个功能,需要增加对应的模块:
QT5把所有打印的相关类,包括QPrinter、QPrintDialog都放到了Qt Print Support模块,如果你只是在.cpp文件中包含QPrinter库,在编译阶段就会报错,你需要先修改.pro文件,加上这句:

QT += printsupport

告诉QT,这个项目需要Print Support模块,再在.cpp文件中包含QPrinter库才可以使用QPrinter:

#include <QtPrintSupport/QPrinter>
#include <QtPrintSupport/QtPrintSupport>

注意修改完.pro文件后,项目需要重新构建下才能生效

而QT5只需要包含QtPrintSupport即可,不需要QPrinter:

#include <QtPrintSupport/QtPrintSupport>

二、text信息生成PDF文件

把文本信息生成PDF文件:

#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QtPrintSupport/QPrinter>
#include <QtPrintSupport/QtPrintSupport>

MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
    , ui(new Ui::MainWindow)
{
    ui->setupUi(this);

    QFile pdfFile("d:\\test.pdf");//输出文件名
    if(!pdfFile.open(QIODevice::WriteOnly))
    {
        QMessageBox::warning(this,tr("write File"),tr("Cannot open file:\n%1").arg("d:\\test.pdf"));
        return;
    }
    QPdfWriter *pdfWriter = new QPdfWriter(&pdfFile);               //实例化QPdfWriter 可以设置PDF文件的一些参数
    pdfWriter->setPageSize(QPagedPaintDevice::A4);                  //设置纸张为A4纸
    pdfWriter->setResolution(QPrinter::ScreenResolution);           //设置分辨率 屏幕分辨率 打印机分辨率 高分辨率
    pdfWriter->setPageMargins(QMarginsF(40, 40, 40, 40));           //设置页边距 顺序是:左上右下

    QPainter *pdfPainter = new QPainter(pdfWriter);                //qt绘制工具

    //设置标题
    QTextOption option(Qt::AlignCenter);                           //标题居中显示
    option.setWrapMode(QTextOption::WordWrap);                     //标题自动换行

    // 设置标题字体 需要使用QT的QFont
    QFont font;
    font.setFamily("Microsoft YaHei");                            //设置字体 微软雅黑、宋体之类的
    font.setPointSize(22);                                        //设置字体大小
    //font.setItalic(true);//斜体
    //font.setUnderline(true);//设置下划线
    font.setBold(true);                                           //加粗
    pdfPainter->setFont(font);
    pdfPainter->drawText(QRect(3000, 0, 2100, 450), QString::fromLocal8Bit("标题"), option);//距离左边3000,上面0,标题字宽度2100,标题字高450(如果字显示不全,可以适当调整)

    pdfWriter->newPage();                                         //换一页

    //设置内容
    option.setAlignment(Qt::AlignLeft);
    font.setPointSize(14);                                       //字体大小14
    pdfPainter->setFont(font);

    pdfPainter->drawText(QRect(500, 20, 8000, 300),
        QString::fromLocal8Bit("我是第一行我是第一行我是第一行我是第一行我是第一行我是第一行我是第一"));

    pdfPainter->drawText(QRect(0, 320, 8500, 300),
        QString::fromLocal8Bit("我是后续我是后续我是后续我是后续我是后续我是后续我是后续我是后续我是后续"), option);
    pdfPainter->drawText(QRect(0, 620, 8500, 300),
        QString::fromLocal8Bit("我是后续我是后续我是后续我是后续我是后续我是后续我是后续我是后续我是后续"), option);

    delete pdfPainter;
    delete pdfWriter;
    pdfFile.close();

    QDesktopServices::openUrl(QUrl::fromLocalFile("d:\\test.pdf"));
}

可以看到drawText()接口,要求输入起始位置QRect,这样我们就可以控制段落格式。
在这里插入图片描述

三、HTML生成PDF文件

    QFile pdfFile("d:\\test.pdf");//输出文件名
    if(!pdfFile.open(QIODevice::WriteOnly))
    {
        QMessageBox::warning(this,tr("write File"),tr("Cannot open file:\n%1").arg("d:\\test.pdf"));
        return;
    }
    QPdfWriter *pdfWriter = new QPdfWriter(&pdfFile);               //实例化QPdfWriter 可以设置PDF文件的一些参数
    pdfWriter->setPageSize(QPagedPaintDevice::A4);                  //设置纸张为A4纸
    pdfWriter->setResolution(QPrinter::ScreenResolution);           //设置分辨率 屏幕分辨率 打印机分辨率 高分辨率
    pdfWriter->setPageMargins(QMarginsF(40, 40, 40, 40));//设置页边距 顺序是:左上右下

    QTextDocument text_document;
    QString html = QString("<html><body><table border=\"6\"><caption>").append(QStringLiteral("薪资")).append("</caption><tr><td>")
            .append(QStringLiteral("工号")).append("</td><td>").append(QStringLiteral("姓名")).append("</td><td>")
            .append(QStringLiteral("薪资")).append("</td></tr><tr><td>101</td><td>102</td><td>103</td></tr><tr><td>123</td><td>124</td><td>125</td></tr></table></body>");
    text_document.setHtml(html);
    text_document.print(pdfWriter);
    text_document.end();
    QDesktopServices::openUrl(QUrl::fromLocalFile("d:\\test.pdf"));

结果如下(可以用于打印表格之类的):
在这里插入图片描述

四、图片生成PDF文件

    QFile pdfFile("d:\\test.pdf");//输出文件名
    if(!pdfFile.open(QIODevice::WriteOnly))
    {
        QMessageBox::warning(this,tr("write File"),tr("Cannot open file:\n%1").arg("d:\\test.pdf"));
        return;
    }
    QPdfWriter *pdfWriter = new QPdfWriter(&pdfFile);               //实例化QPdfWriter 可以设置PDF文件的一些参数
    pdfWriter->setPageSize(QPagedPaintDevice::A4);                  //设置纸张为A4纸
    pdfWriter->setResolution(QPrinter::ScreenResolution);           //设置分辨率 屏幕分辨率 打印机分辨率 高分辨率
    pdfWriter->setPageMargins(QMarginsF(40, 40, 40, 40));//设置页边距 顺序是:左上右下
    
    QPixmap pixmap = QWidget::grab(ui->widget->rect());  //获取widget的界面 控制你要抓取的widget

    QPainter painter_pixmap;
    painter_pixmap.begin(pdfWriter);
    QRect rect = painter_pixmap.viewport();
    int scale = rect.width()/pixmap.width();
    painter_pixmap.scale(scale, scale); //图像缩放 不然图片太大或者太小都不好看
    painter_pixmap.drawPixmap(0, 0, pixmap);  //画图
    painter_pixmap.end();
    QDesktopServices::openUrl(QUrl::fromLocalFile("d:\\test.pdf"));

原本界面:
在这里插入图片描述
结果:
在这里插入图片描述

评论 10
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值