QT通过QPdfWriter类实现pdf文件生成与输出

发布时间:2024年01月13日

一.QPdfWriter类介绍

QPdfWrite是一个用于创建PDF文件的类,它是Qt库的一部分。它提供了一些方法和功能,使您能够创建和写入PDF文件。

QPdfWriter的一些主要功能:

1. 创建PDF文件:通过使用QPdfWriter的构造函数,您可以创建一个新的PDF文件或指定一个现有的文件进行写入。

2. 写入内容:您可以使用QPainter类在PDF文件中绘制文本、线条、形状等。QPdfWriter提供了一些方法,如setPageMargins()、setPageOrientation()、setPageSize()等,用于设置页面属性和布局。

3. 设置页面属性:您可以使用QPdfWriter的方法来设置页面边框距离、页面方向、页面大小和分辨率等。

4. 添加图像:您可以使用QPdfWriter将图像添加到PDF文件中。您需要计算图像的位置并将其绘制到页面上。

5. 管理多个页面:您可以添加新页面或将内容绘制到新页面上,从而创建多页PDF文件。

6. 设置字体和文本属性:使用QPainter类,您可以设置文本字体、大小、颜色等属性,并绘制文本到PDF页面上。

7. 保存和关闭文件:在完成写入内容后,您可以使用QPdfWriter的方法保存PDF文件并关闭文件流。

二.代码示例

1.report.h文件

#include?<QFile>

#include?<QPdfWriter>

#include?<QTextOption>

#include?<QPainter>

#include?<QDateTime>

#include?<QDebug>

typedef?struct?{

????float?displacement;

????float?speed;

????float?acceleration;

}TestResult_t;

class?pdfReport

{

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

?????开源的PDF库

6.CLibPDF

????http://hpux.connect.org.uk/hppd/hpux/Shells/ClibPDF-2.02/

????ClibPDF是C函数库,可以直接生成PDF文件, 不需要Adobe Acrobat等工具支持.

7.PDF 分页工具llpp

???llpp 是基于 MuPDF 的 PDF 分页工具

8.PDF格式分析器 MuPDF

???MuPDF是一个PDF格式分析器,用来阅读PDF文件,并创建Fitz trees

???MuPDF也有一个API修改PDF文件的内部对象,并写入文件。举例来说,有可能使用加密MuPDF库来对现有的PDF文件重新安排页面

9.PDF文档处理工具包pdftk

???Pdftk 是一个简单的命令行工具,用来进行日常的 PDF 文档处理,包括合并、拆分和加密、增加水印、解析PDF元数据、压缩和解压、修复受损的PDF文档等功能。

???PDFtk Server 无需 Adobe Acrobat 或 Reader 的支持,可在 Windows, Mac OS X 和 Linux 下允许

10.PDF文档转化工具 pdf2djvu

???pdf2djvu 从PDF 文件中解析出图片、文字、超链、书签、元数据等,并生成 DjVu 文件

11.PDF管理工具 PDF chain

????PDF Chain 是一个具有图形化用户界面的PDF工具包,提供一种简单的方法来处理 PDF文件,可完成PDF文档的合并、切分、增加背景和附件等操作

12.ePDFView

????轻量级基于poppler的PDF阅读器

13.activePDF

????PDF开发包(商业)

14.DiffPDF

????PDF比较工具

15.PDFSlide

????PDF幻灯片展示工具

16.PDFCube

????PDFCube 是一个基于 OpenGL 开发的 PDF 阅读器

17.PDFResurrect

????PDFResurrect是一个工具,旨在分析PDF文件。 PDF格式可以改变以往的文件中保留较新版本的文件,从而建立一个运行的历史变化的文件。该工具试图提取所有旧的版本,同时也生产简要版本之间的变化

18.QPDF

????QPDF 是 PDF 文件转换的命令行工具,也被称为 pdf-to-pdf。QPDF 提供许多对开发者有用的特性

19.GSPdf

????GSPdf is a PostScript and PDF Viewer for GNUstep that is based on GhostScript

20.pdftohtml

????pdftohtml 可以将 PDF 转化为 HTML ,便于嵌入网页中,并且可以提取 PDF 中的图片

21.pdfpc

????pdfpc 是一个支持多显示器的 PDF 文档呈现控制台。基于 GTK 开发

22.PDFEdit

????PDFEdit 是一个 PDF 文档编辑器,支持 Windows 和 Linux 系统

23.PDFCrack

????PDFCrack用于破解加密PDF文档密码的小工具

24.PDFium

????开源的PDF渲染引擎

25.qpdfview

????qpdfview是一个基于Qt的PDF阅读器

文章来源:https://blog.csdn.net/xieliru/article/details/135565616
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。