{
public:
~pdfReport();
void MakePDFReport(QString filePath);
private:
#define DPI_RESOLUTION 300 //DPI中的PDF分辨率
#define TOTAL_WIDTH 2481 //A4纸
#define TOTAL_HEIGHT 3507 //A4纸
#define PAGE_MARGIN 20 //页边距值
#define PAGE_MARGIN_PIXELS (int)((float)PAGE_MARGIN/72*DPI_RESOLUTION)
#define PAGE_WIDTH (TOTAL_WIDTH-PAGE_MARGIN_PIXELS*2)
#define PAGE_HEIGHT (TOTAL_HEIGHT-PAGE_MARGIN_PIXELS*2)
QPdfWriter *pdfWriter;
QTextOption option;
QPainter *pdfPainter;
QFont font;
QFile pdfFile;
TestResult_t testResult;
QString picturePath = “…/picture/”;
private:
#define realWidthPixels(Value) (int)((float)Value/72*DPI_RESOLUTION)
#define realHeightPixels(Value) (int)((float)Value/72*TOTAL_HEIGHT)
void PDFReportInit(QString filePath,int currentPage, int totalPage);
void InitNewPage(int currentPage, int totalPage);
};
2.report.cpp文件
void pdfReport::PDFReportInit(QString filePath,int currentPage, int totalPage)
{
//创建要写入的pdf文件
QDateTime currentTime = QDateTime::currentDateTime();
QString timeString = currentTime.toString(“yyyy_MM_dd-hh_mm_ss”);
QString fileName = filePath + “\” + timeString + “Report.pdf”;
pdfFile.setFileName(fileName);
pdfFile.open(QIODevice::ReadWrite);
pdfWriter = new QPdfWriter(&pdfFile);
//设置pdf文件属性
pdfWriter->setPageSize(QPagedPaintDevice::A4);
pdfWriter->setResolution(DPI_RESOLUTION);
pdfWriter->setPageMargins(QMarginsF(PAGE_MARGIN, PAGE_MARGIN, PAGE_MARGIN, PAGE_MARGIN));
option.setAlignment(Qt::AlignHCenter | Qt::AlignVCenter); //居中对齐
option.setWrapMode(QTextOption::WordWrap); //自动换行
//设置操作属性与字体
pdfPainter = new QPainter(pdfWriter);
font.family();
font.setFamily(“Times New Roman”);
//标题
int fontSize =22;
font.setPointSize(fontSize);
pdfPainter->setFont(font);
option.setAlignment(Qt::AlignCenter);
pdfPainter->drawText(QRect(PAGE_WIDTH/2-400, 60, 800, 100),
QString(“实验报告”), option);
InitNewPage(currentPage, totalPage);
}
void pdfReport::InitNewPage(int currentPage, int totalPage)
{
//logo显示
QString titleImageFileName = picturePath + “logo.png”;
QPixmap titleImage;
titleImage.load(titleImageFileName);
pdfPainter->drawPixmap(0, 0, titleImage.width(), titleImage.height(), titleImage); //256*256
//上横线
QPen pen;
int penHeigth = 4;
pen.setWidth(penHeigth);
pen.setColor(Qt::black);
pdfPainter->setPen(pen);
pdfPainter->drawLine(0, 0, PAGE_WIDTH, 0);
//下横线
pen.setColor(Qt::black);
pdfPainter->setPen(pen);
pdfPainter->drawLine(0, PAGE_HEIGHT, PAGE_WIDTH, PAGE_HEIGHT);
//页码
int fontSize =9;
font.setPointSize(fontSize);
pdfPainter->setFont(font);
pen.setColor(Qt::black);
pdfPainter->setPen(pen);
option.setAlignment(Qt::AlignRight | Qt::AlignTop);
int pageIndex = currentPage++; //当前页
int totalPageIndex = totalPage; //总页数
QString pageIndexString = QString::number(pageIndex) + “/” + QString::number(totalPageIndex);
pdfPainter->drawText(QRect(PAGE_WIDTH-200, PAGE_HEIGHT, 200,80),
pageIndexString, option);
//日期
option.setAlignment(Qt::AlignLeft | Qt::AlignTop);
fontSize = 9;
font.setPointSize(fontSize);
pdfPainter->setFont(font);
QDateTime currentTime = QDateTime::currentDateTime();
QString timeString = currentTime.toString(“yyyy-MM-dd hh:mm:ss”);
pdfPainter->drawText(QRect(0, PAGE_HEIGHT, 600, 80), timeString, option);
}
void pdfReport::MakePDFReport(QString filePath)
{
#define ROW_HEIGHT 200
int xCurrentP = 0;
int yCurrentP = 300;
int currentPage = 1;
int totalPage = 2;
//first page
testResult.displacement = 1.1234;
testResult.speed = 2.3213;
testResult.acceleration = 1.1023;
PDFReportInit(filePath,currentPage,totalPage);
//数据显示
int fontSize =18;
font.setPointSize(fontSize);
pdfPainter->setFont(font);
option.setAlignment(Qt::AlignLeft | Qt::AlignVCenter);
option.setWrapMode(QTextOption::WordWrap);
xCurrentP = realWidthPixels(16)*4.5;
pdfPainter->drawText(QRect(xCurrentP, yCurrentP, 1200, ROW_HEIGHT),
QString(“数据:”));
yCurrentP = yCurrentP + ROW_HEIGHT;
pdfPainter->drawText(QRect(xCurrentP, yCurrentP, 1200, ROW_HEIGHT),
(“数据1:” + QString::number(testResult.displacement, ‘f’, 4) + “mm”));
yCurrentP = yCurrentP + ROW_HEIGHT;
pdfPainter->drawText(QRect(xCurrentP, yCurrentP, 1200, ROW_HEIGHT),
(“数据2:” + QString::number(testResult.speed, ‘f’, 4) + “m/s”));
yCurrentP = yCurrentP + ROW_HEIGHT;
pdfPainter->drawText(QRect(xCurrentP, yCurrentP, 1200, ROW_HEIGHT),
(“数据3:” + QString::number(testResult.acceleration, ‘f’, 4) + “m”));
//second page
pdfWriter->newPage();
InitNewPage(currentPage,totalPage);
delete pdfPainter;
delete pdfWriter;
pdfFile.close();
}
3.生成pdf文件样式
三.其他C++实现的pdf库
1.PDF类库 PoDoFo
http://podofo.sourceforge.net/
PoDoFo 是一个用来操作 PDF 文件格式的 C++ 类库。它还包含一些小工具用来解析、修改和创建 PDF 文
2.Xpdf
http://www.foolabs.com/xpdf/download.html
Xpdf是一个开放源代码的PDF档案浏览器,Xpdf 可解码LZW压缩格式并阅读加密的PDF文件
3.PDF生成工具 Poppler
http://poppler.freedesktop.org/
Poppler 是一个用来生成 PDF 的C++类库,从xpdf 继承而来。它使用了很多先进的类库例如 freetype 和 cairois 来达到更好的输出效果,同时也提供了一组命令行工具包
4.JagPDF
http://www.jagpdf.com/
JagPDF 提供给 C/C++ 和 Python 编程语言用来生成 PDF 文档的库
5.libHaru
http://libharu.org/wiki/Downloads
最后
自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。
深知大多数Java工程师,想要提升技能,往往是自己摸索成长,自己不成体系的自学效果低效漫长且无助。
因此收集整理了一份《2024年嵌入式&物联网开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上嵌入式&物联网开发知识点,真正体系化!
如果你觉得这些内容对你有帮助,需要这份全套学习资料的朋友可以戳我获取!!
由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新!!
82987)]
[外链图片转存中…(img-YugFqx4j-1715594282988)]
[外链图片转存中…(img-2WOiqAeP-1715594282988)]
[外链图片转存中…(img-0B6HpiNv-1715594282989)]
[外链图片转存中…(img-iklAXiFZ-1715594282990)]
[外链图片转存中…(img-VsfAvuxK-1715594282990)]
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上嵌入式&物联网开发知识点,真正体系化!
如果你觉得这些内容对你有帮助,需要这份全套学习资料的朋友可以戳我获取!!
由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新!!