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

一.QPdfWriter类介绍

本文代码工程下载地址:

https://download.csdn.net/download/xieliru/88736664?spm=1001.2014.3001.5503

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文件并关闭文件流。

推荐一个不错的人工智能学习网站,通俗易懂,内容全面,作为入门科普和学习提升都不错,分享一下给大家:https://www.captainbed.cn/ai

二.代码示例

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 currentPageint totalPage);

   void InitNewPage(int currentPageint totalPage);

};

2.report.cpp文件

void pdfReport::PDFReportInit(QString filePath,int currentPageint 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_MARGINPAGE_MARGINPAGE_MARGINPAGE_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-40060800100),

                         QString("实验报告"), option);

    InitNewPage(currentPagetotalPage);

}

void pdfReport::InitNewPage(int currentPageint totalPage)

{

    //logo显示

    QString titleImageFileName = picturePath + "logo.png";

    QPixmap titleImage;

    titleImage.load(titleImageFileName);

    pdfPainter->drawPixmap(00titleImage.width(), titleImage.height(), titleImage); //256*256

    //上横线

    QPen pen;

    int penHeigth = 4;

    pen.setWidth(penHeigth);

    pen.setColor(Qt::black);

    pdfPainter->setPen(pen);

    pdfPainter->drawLine(00PAGE_WIDTH0);

    //下横线

    pen.setColor(Qt::black);

    pdfPainter->setPen(pen);

    pdfPainter->drawLine(0PAGE_HEIGHTPAGE_WIDTHPAGE_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-200PAGE_HEIGHT200,80),

                         pageIndexStringoption);

    //日期

    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(0PAGE_HEIGHT60080), timeStringoption);

}

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(xCurrentPyCurrentP1200ROW_HEIGHT),

                         QString("数据:"));

    yCurrentP = yCurrentP + ROW_HEIGHT;

    pdfPainter->drawText(QRect(xCurrentPyCurrentP1200ROW_HEIGHT),

                         ("数据1:" + QString::number(testResult.displacement'f'4+ "mm"));

    yCurrentP = yCurrentP + ROW_HEIGHT;

    pdfPainter->drawText(QRect(xCurrentPyCurrentP1200ROW_HEIGHT),

                         ("数据2:" + QString::number(testResult.speed'f'4) + "m/s"));

    yCurrentP = yCurrentP + ROW_HEIGHT;

    pdfPainter->drawText(QRect(xCurrentPyCurrentP1200ROW_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阅读器

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/620695.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

#Prompt##提示词工程##AIGC##LLM#使用大型预训练语言模型的关键考量

如果有不清楚的地方可以评论区留言&#xff0c;我会给大家补上的&#xff01; 本文包括&#xff1a; Prompt 的一些行业术语介绍 Prompt 写好提示词的方法经验介绍&#xff08;附示例教程&#xff09; LLM自身存在的问题&#xff08;可以用Prompt解决的以及无法用Prompt解决的&…

u盘监控系统—公司电脑如何监控U盘使用?【详解】

在当今的办公环境中&#xff0c;U盘等移动存储设备已成为数据传输和存储的重要工具。 然而&#xff0c;随着U盘的广泛使用&#xff0c;也带来了潜在的安全风险&#xff0c;如数据泄露、病毒传播等。 因此&#xff0c;对于随时会有数据泄露风险的企业而言&#xff0c;U盘的使用…

DrissionPage获取浏览器Network数据包

DrissionPage是什么&#xff1f; GitHub - g1879/DrissionPage: 基于python的网页自动化工具。既能控制浏览器&#xff0c;也能收发数据包。可兼顾浏览器自动化的便利性和requests的高效率。功能强大&#xff0c;内置无数人性化设计和便捷功能。语法简洁而优雅&#xff0c;代码…

深度学习基本介绍-李沐

目录 AI分类&#xff1a;模型分类&#xff1a;广告案例&#xff1a; bilibili视频链接&#xff1a;https://www.bilibili.com/video/BV1J54y187f9/?p2&spm_id_frompageDriver&vd_sourcee6a6e7fec41c59c846c142eb5ef1da0b AI分类&#xff1a; 模型分类&#xff1a; 图…

【每日一题】删除排序链表中的重复元素

文章目录 Tag题目来源解题思路方法一&#xff1a;比较相邻两节点 写在最后 Tag 【遍历】【链表】【2024-01-14】 题目来源 83. 删除排序链表中的重复元素 解题思路 方法一&#xff1a;比较相邻两节点 思路 比较两个相邻的节点&#xff0c;如果下一个节点值和当前节点值一样…

简单高效 LaTeX 科学排版 第004集 命令与环境

这是《简单高效LaTeX》的第四个视频&#xff0c;主要演示讨论基本命令与排版环境&#xff0c;还有保留字符。 视频地址&#xff1a;https://www.ixigua.com/7298100920137548288?id7298102807985390120&logTagf853f23a668f8a2ee405

IPv6组播技术--MLDv2

MPLDv1工作机制 IPv6组播网络中RouterA和RouterB连接主机网段,在主机网段上有HostA、HostB、HostC三个接收者。假设HostA和HostB想要接收发往组播组G1的数据,HostC想要接收发往组播组G2的数据。 查询器选举机制 当一个网段内有多台IPv6组播路由器时,由于它们都可以接收到…

初识XSS漏洞

目录 一、XSS的原理和分类 二、Xss漏洞分类 1. 反射性xss 简单的演示&#xff1a; 2.基于DOM的XSS 简单的演示&#xff1a; 3.存储型XSS ​编辑简单的演示 4、self xss 三、XSS漏洞的危害 四、XSS漏洞的验证 五、XSS漏洞的黑盒测试 六、XSS漏洞的白盒测试 七、XS…

html+JavaScript的媒体元素

<video src"conference.mpg" id"myVideo">Video player not available.</video> <!-- 嵌入音频 --> <audio src"song.mp3" id"myAudio">Audio player not available.</audio> - 属性 每个元素至少…

JavaScript深拷贝与浅拷贝的全面解析

&#x1f9d1;‍&#x1f393; 个人主页&#xff1a;《爱蹦跶的大A阿》 &#x1f525;当前正在更新专栏&#xff1a;《VUE》 、《JavaScript保姆级教程》、《krpano》 ​ ​ 目录 ✨ 前言 ✨ 正文 浅拷贝 对象的浅拷贝 数组的浅拷贝 浅拷贝的问题 深拷贝 什么是深拷贝…

如何激活数据要素价值

文章目录 前言一、数据作为生产要素的背景二、数据作为新型生产要素&#xff0c;是价值创造的重要源泉&#xff08;一&#xff09;生产要素是经济活动中的基本要素&#xff08;二&#xff09;激活数据要素价值&#xff0c;要从理论上认识数据要素的基本特征&#xff08;三&…

CMU15-445-Spring-2023-Project #2 - B+Tree

前置知识&#xff1a;参考上一篇博文 CMU15-445-Spring-2023-Project #2 - 前置知识&#xff08;lec07-010&#xff09; CHECKPOINT #1 Task #1 - BTree Pages 实现三个page class来存储B树的数据。 BTree Page internal page和leaf page继承的基类&#xff0c;只包含两个…

C语言辨析——深入理解字符常量与表达式

1. 问题 今天看到一个题目&#xff0c;截图如下。 从答题情况来看&#xff0c;本题的答案是B&#xff0c;那么就意味着A、C、D是错的。但我认为这4个选项都是对的。当然&#xff0c;如果要从4个选项中挑选一个的话&#xff0c;那还是选择B妥当一些。 2. 分析 字符常量的定义…

【漏洞复现】优卡特脸爱云一脸通智慧管理平台权限绕过漏洞CVE-2023-6099(1day)

漏洞描述 脸爱云一脸通智慧管理平台1.0.55.0.0.1及其以下版本SystemMng.ashx接口处存在权限绕过漏洞,通过输入00操纵参数operatorRole,导致特权管理不当,未经身份认证的攻击者可以通过此漏洞创建超级管理员账户。 免责声明 技术文章仅供参考,任何个人和组织使用网络应当…

CAN总线报文格式———扩展数据帧

扩展数据帧由帧起始、仲裁段、控制段、数据段、CRC段、ACK段、帧结束等组成。 一、总线空闲&#xff08;Bus Idle&#xff09; CAN总线空闲时&#xff0c;总线上会输出持续的高电平“1”。当总线空闲时任何连接的单元都可以开始发送新的报文。 二、帧起始&#xff08;Start o…

鱼哥赠书活动第⑤期:《ATTCK视角下的红蓝对抗实战指南》《智能汽车网络安全权威指南》上下册 《构建新型网络形态下的网络空间安全体系》《Kali Linux高级渗透测试》

鱼哥赠书活动第⑤期&#xff1a; 《ATT&CK视角下的红蓝对抗实战指南》1.1介绍&#xff1a; 《智能汽车网络安全权威指南》上册1.1介绍&#xff1a; 《智能汽车网络安全权威指南》下册1.1介绍&#xff1a; 《构建新型网络形态下的网络空间安全体系》1.1介绍&#xff1a; 《K…

遭受慢速连接攻击怎么办?怎么预防

慢速连接攻击是一种常见的网络攻击方式&#xff0c;其原理是利用HTTP协议的特性&#xff0c;在建立了与Http服务器的连接后&#xff0c;尽量长时间保持该连接&#xff0c;不释放&#xff0c;达到对Http服务器的攻击。 慢速连接攻击的危害包括以下几个方面&#xff1a; 1.资源…

推荐一款.NET开发的物联网开源项目

物联网&#xff08;IoT&#xff09;是一个正在快速发展的技术领域&#xff0c;它涉及到各种设备、物体和系统的互联。所以各种物联网平台和物联网网关项目层出不穷&#xff0c;在物联网&#xff08;IoT&#xff09;领域&#xff0c;.NET平台扮演着重要的角色。作为一款广泛使用…

管理软件供应链中网络安全工具蔓延的三种方法

软件开发组织不断发展&#xff0c;团队成长&#xff0c;项目数量增加。技术堆栈发生变化&#xff0c;技术和管理决策变得更加分散。 在这一演变过程中&#xff0c;该组织的 AppSec 工具组合也在不断增长。在动态组织中&#xff0c;这可能会导致“工具蔓延”。庞大的 AppSec 工…

Colab 谷歌免费的云端Python编程环境初体验

最新在学习AIGC的过程中&#xff0c;发现很多教程&#xff0c;demo使用到了Colab这个谷歌工具。 Colab 是什么&#xff1f; Google Colab是一个强大且免费的云端Python编程环境&#xff0c;为学生、研究人员和开发者提供了一个便捷的平台来开展数据科学、机器学习和深度学习项…