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.需求是公司的项目,所以该部分代码有所删改。