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.mfbz.cn/a/318411.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

极简Oracle 11g Release 2 (11.2.0.1.0)

注意&#xff1a;此法无法安装oracle11g(11.2.0.4)&#xff0c;会报如下错&#xff1a; [FATAL] [INS-10105] The given response file /assets/db_install.rsp is not valid. 一、下载解压ORACLE安装包。 从 oracle 官网 下载所需要的安装包&#xff0c;这里我们以 oracle 11…

113.QT中的信号槽

目录 一、信号和槽概述 信号和槽的基本概念&#xff1a; 信号和槽的关系&#xff1a; 二、标准信号槽使用 三、自定义信号槽的使用 自定义信号&#xff1a; 自定义槽&#xff1a; 四、Lambda表达式 1.Lambda 表达式不带参数和返回值&#xff1a; 2.Lambda 表达式带参…

GitHub Copilot的使用方法和快捷按键

GitHub Copilot是GitHub与OpenAI合作开发的一款人工智能编码助手。它基于GPT&#xff08;Generative Pre-trained Transformer&#xff09;模型&#xff0c;可以为你提供代码补全、建议和生成的功能 使用方法&#xff1a; 安装插件&#xff1a; 首先&#xff0c;确保你的开发环…

如何解决NAND系统性能问题?-- NAND接口分类

三、NAND接口 NAND闪存接口是连接主机控制器与NAND存储芯片的通信桥梁&#xff0c;负责命令、地址和数据的传输。典型的NAND闪存接口包括一组I/O线&#xff08;通常为8条或更多&#xff09;用于数据传输&#xff0c;以及若干控制信号线。 基本接口信号&#xff1a; Chip Enable…

一文了解JavaScript的数据类型

在JavaScript中有六种不同的数据类型&#xff0c;六种数据类型又分为5种简单数据类型&#xff08;基本数据类型&#xff09;和1中复杂数据类型&#xff08;引用数据类型&#xff09;&#xff0c;基本数据类型分为&#xff1a;字符串类型&#xff08;string&#xff09;、数值类…

python对自动驾驶进行模拟

使用了 Pygame 库来创建一个简单的游戏环境,模拟了一辆自动驾驶汽车在道路上行驶。汽车的位置和速度通过键盘控制&#xff0c;可以左右移动和加速减速。道路的宽度和颜色可以根据需要进行调整。 import pygame import random # 游戏窗口大小 WINDOW_WIDTH 800 WINDOW_HEIG…

华为路由器OSPF动态链路路由协议配置

R1配置 interface GigabitEthernet0/0/0ip address 10.1.12.1 255.255.255.252 interface LoopBack0ip address 1.1.1.1 255.255.255.255 ospf 1 router-id 1.1.1.1 area 0.0.0.0 network 1.1.1.1 0.0.0.0 network 10.1.12.0 0.0.0.3 R2配置 interface GigabitEthernet0/0/0i…

互联网资讯精选:科技爱好者周刊 | 开源日报 No.145

ruanyf/weekly Stars: 37.4k License: NOASSERTION 记录每周值得分享的科技内容&#xff0c;提供大量就业信息。欢迎投稿、推荐或自荐文章/软件/资源&#xff0c;并可通过多种方式进行搜索。 提供丰富的科技内容每周更新可以提交工作/实习岗位支持投稿和推荐功能 GyulyVGC/…

132基于matlab的采集信号模极大值以及李氏指数计算

基于matlab的采集信号模极大值以及李氏指数计算&#xff0c; 1)计算信号的小波变换。 2)求出模极大曲线。 3)计算其中两个奇异点的Lipschitz指数&#xff0c;程序已调通&#xff0c;可直接运行。 132matlab模极大曲线Lipschitz (xiaohongshu.com)

RTSP协议实现发送ACC音频数据

一.AAC音频格式介绍 AAC音频格式&#xff1a;Advanced Audio Coding&#xff08;高级音频解码&#xff09;&#xff0c;是一种由MPEG—4标准定义的有损音频压缩格式。音频压缩编码的输出码流&#xff0c;以音频帧的形式存在。每个音频帧包含若干个音频采样的压缩数据&#xff0…

C语言--单链表的创建及使用详解

C语言--单链表的创建及使用详解 1. 单链表定义1.1 工作原理1.2 优点 2. 单链表的创建2.1 文件创建2.2 节点创建2.3 链表显示 3. 链表操作3.1 尾插3.2 头插3.3 尾删3.4 头删3.5 指定数据寻找3.6 指定位置前插入3.7 指定位置删除 4. 单链表总内容4.1 test.c文件4.2 SList.h文件4.…

canvas设置圆锥形渐变

查看专栏目录 canvas示例教程100专栏&#xff0c;提供canvas的基础知识&#xff0c;高级动画&#xff0c;相关应用扩展等信息。canvas作为html的一部分&#xff0c;是图像图标地图可视化的一个重要的基础&#xff0c;学好了canvas&#xff0c;在其他的一些应用上将会起到非常重…

2024年Flag

管理自己 2024年是一个科技迅速发展的时期&#xff0c;作为一个技术人员&#xff0c;我将有很多事情要做。在这一年里&#xff0c;我计划立下以下几个flag&#xff0c;来提升自己的技术能力。 学习人工智能和机器学习 首先&#xff0c;我计划深入学习人工智能和机器学习。随着…

在线的货币兑换平台源码下载

在线的货币兑换平台&#xff0c;可帮助全球各地的个人和企业将货币从一种货币兑换为另一种货币。该货币兑换平台是 Codecanyon 中最先进的脚本。 源码下载&#xff1a;https://download.csdn.net/download/m0_66047725/88728084

js中try...catch捕捉错误

文章目录 一、前言二、场景2.1、setTimeout2.2、Promise 三、最后 一、前言 说到try...catch都觉得非常熟悉了&#xff0c;不就是用来捕捉代码块中的错误嘛&#xff0c;平时也用得比较多的 二、场景 try...catch只能捕捉到同步执行代码块中的错误 2.1、setTimeout try {setT…

【LabVIEW FPGA入门】没有CompactRIO时进行编程测试

1.新建一个空白项目。 2.新建cRIO终端。 要添加仿真的远程实时目标&#xff0c;请选择项目名称&#xff0c;右击并选择新建>>目标和设备(Targets and Devices)。 3.新建终端和设备&#xff0c;选一个cRIO型号 接下来&#xff0c;当添加目标和设备窗口出现时&#xff0c;请…

第 2 课 ROS 系统安装和环境搭建

第 2 课 ROS 系统安装和环境搭建 1.版本选择 不同的 Ubuntu 安装的 ROS 版本不同&#xff0c;其中 Ubuntu18.04 的 ROS 对应版本为Melodic。 Ubuntu版本ROS版本Ubuntu16.04KineticUbuntu18.04MelodicUbuntu20.04Noetic 2.检查 Ubuntu 的软件和更新源 找到系统中的“软件和…

Python+Django+MySQL的图书馆管理系统【附源码,运行简单】

PythonDjangoMySQL的图书馆管理系统【附源码&#xff0c;运行简单】 总览 1、《图书馆管理系统》1.1 方案设计说明书设计目标需求分析工具列表 2、详细设计2.1 登录2.2 注册2.3 程序主页面2.4 图书新增界面2.5 图书信息修改界面2.6 其他功能贴图 3、下载 总览 自己做的项目&am…

mysql从入门到放弃之数据库体系结构与管理

文章目录 前言一、体系结构1、mysql c/s结构介绍2、mysql实例组成3、mysqld程序运行原理3.1、mysqld守护进程结构3.2、 引入sql语句结构化的查询语言3.3、探索一条SQL语句的执行过程 二、mysql逻辑存储结构三、mysql物理存储结构3.1、innodb存储引擎的段、区、页之间的关系 四、…

YZ虚拟资源下载源码-支持对接公众号-对接支付

这款系统内置的模板是电脑系统下载站的类型&#xff0c;当然你也可以用作其他类型&#xff0c;例如软件下载&#xff0c;其他类型的资源下载&#xff0c;知识付费下载等&#xff0c;改下文字内容即可。 支持商城系统&#xff0c;后台可配置支付。青狐修改增加了很多可用性。 …