VS+Qt使用QPdfWriter输出PDF

Qt5中提供了QPdfWriter来输出PDF文件,相较于Qt4来说,操作上会稍微简洁些,本文仅是QPdfWriter的简单实用,作为新手初体验的一个借鉴参考
实现步骤:
1.使用QFile创建PDF文件
2.用QPDFWriter 实例化QFile
3.再对PDF初始化
4.创建QPainter对象,实例化时绑定QPdfWriter对象
5.初始化QPainter对象
6.开始画PDF

代码如下所示:

PDFTest.h

#pragma once

#include <QtWidgets/QWidget>
//#include <QtPrintSupport/QPrinter>
#include <QPainter>
#include <QPdfWriter>
#include <QFileDialog>
#include <QMessageBox>
#include "ui_PDFTest.h"
class PDFTest : public QWidget
{
    Q_OBJECT

public:
    PDFTest(QWidget *parent = Q_NULLPTR);

    static void producePdf(const QString pdfFileName);

private slots:
    void pdfSave();

private:
    Ui::PDFTestClass ui;
    QString pdfFileName;
};

PDFTest.cpp

#include "PDFTest.h"

PDFTest::PDFTest(QWidget *parent)
    : QWidget(parent)
{
    ui.setupUi(this);

    connect(ui.btnSavePDF, &QPushButton::clicked, this, &PDFTest::pdfSave);
}
void PDFTest::pdfSave()
{
    //打开文件保存对话框
    pdfFileName = QFileDialog::getSaveFileName(this,
        QString::fromLocal8Bit("保存为PDF"),
        ".",
        QString::fromLocal8Bit("PDF文件(.pdf)"));

    if ("" == pdfFileName)
    {
        return;
    }

    pdfFileName += ".pdf";
    {
        const QFileInfo file(pdfFileName);
        if (file.exists())
        {
            const auto cover = QMessageBox::question(this, QString::fromLocal8Bit("文件冲突"), QString::fromLocal8Bit("文件已存在,是否覆盖?"));
            if (cover != QMessageBox::Yes)
            {
                QMessageBox::warning(this, QString::fromLocal8Bit("文件保存"), QString::fromLocal8Bit("文件保存失败!"));
                return;
            }
        }
    }
    producePdf(pdfFileName);
}

void PDFTest::producePdf(const QString pdfFileName)
{
    //构建PDF
    QFile pdfFile(pdfFileName);
    pdfFile.open(QIODevice::WriteOnly);//创建打开pdf
    QPdfWriter* pdfWriter = new QPdfWriter(&pdfFile);//实例化pdf写入器
    pdfWriter->setPageSize(QPagedPaintDevice::A4);//设置纸张大小为A4
    pdfWriter->setResolution(300);
    pdfWriter->setPageMargins(QMarginsF(0, 0, 0, 0));//页边距设置为0

    //QPainter画背景
    //画图一定要有begin和end 不然pdf会损坏
    QPainter *painter = new QPainter(pdfWriter);
    painter->setRenderHint(QPainter::Antialiasing);//抗锯齿
    painter->setPen(Qt::transparent);
    painter->drawRect(painter->viewport());
    const QPixmap pixmapDay(":/pdftest/pdftest/Statistics_Day.png");
    painter->begin(pdfWriter);
    painter->drawPixmap(0, 0, pixmapDay);
    

    //插入文字
    QFont font;
    painter->setPen(Qt::black);
    font.setPointSize(12);
    font.setFamily("微软雅黑");
    painter->setFont(font);

    //Day Count
    //Running time
    const float softTimeX = 165 + 500;
    const float softTimeY = 487;
    const float softTimelength = 83;
    painter->drawText(softTimeX, softTimeY - 4, "2021-9-27 11:55:00:00");
    painter->drawText(softTimeX, softTimeY + softTimelength, "2021-9-28 11:55:00:00");
    painter->drawText(softTimeX, softTimeY + softTimelength * 2 + 3, "24:00:00:00");
    
    painter->end();
    pdfFile.close();
}

实现截图

主页面
选择保存
实现截图

注意事项:

1.实现时,painter对象只能有一个begin()和end()操作,不然会覆盖PDF文件。
2.文件使用后切记要关闭。
3.我的需求是要写入图片并在图片上写入文本内容,所以将图片作为背景,再此基础上通过坐标去写入文件
3.PDF文件保存是通过点击QPushButton时打开一个文件对话框后新建一个文件再写入的。

其他

1.关于写入PDF这方面的东西,网上描述的实在不清晰,代码找起来也麻烦,这部分写起来实在难受,于是自己做了个总结。网上的都是单文本输入和单图片输入的,本项目是两项结合。
2.本人也是新接触Qt代码,有些使用不对的地方欢迎指正
3.需求是公司的项目,所以该部分代码有所删改。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值