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

news2025/5/16 16:00:35

一.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.coloradmin.cn/o/1383070.html

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

相关文章

MySQL修炼手册4:分组与聚合:GROUP BY与HAVING的应用

写在开头 MySQL数据库的强大功能为我们提供了丰富的数据处理工具&#xff0c;其中GROUP BY与HAVING的应用使得数据的分组与聚合变得更加灵活和高效。在本篇博客中&#xff0c;我们将深入研究GROUP BY与HAVING的基础知识&#xff0c;并通过实际案例&#xff0c;展示它们在数据分…

select...for update锁详解

select…for update锁详解 select…for update的作用就是&#xff1a;如果A事务中执行了select…for update&#xff0c;那么在其提交或回滚事务之前&#xff0c;B&#xff0c;C&#xff0c;D…事务是无法操作&#xff08;写&#xff09;A事务select…for update所命中的数据的…

游戏找不到emp.dll,无法运行的5种解决方法

游戏在运行过程中提示找不到emp.dll文件&#xff0c;这一现象的原因可能涉及到多个层面。首先&#xff0c;emp.dll是一个动态链接库文件&#xff0c;对于特定的游戏运行至关重要&#xff0c;它可能包含了游戏运行所必需的函数、资源或其他关键信息。当系统在加载游戏时无法找到…

【AI】Pytorch 系列:预训练模型使用

1. 模型下载 import re import os import glob import torch from torch.hub import download_url_to_file from torch.hub import urlparse import torchvision.models as modelsdef download_

k8s云原生环境搭建笔记——第二篇

目录 1、使用普通方式安装prometheus和grafana1.1、安装kube-state-metrics容器1.1.1、下载并修改yaml文件1.1.2、导入kube-state-metrics镜像1.1.3、执行yaml文件目录 1.2、安装node-exploer1.2.1、创建名称空间prometheus1.2.2、执行yaml 1.3、安装prometheus1.3.1、创建集群…

【洛谷千题详解】P1980 [NOIP2013 普及组] 计数问题

#include<bits/stdc.h> using namespace std; int main() {int n,x,ans0;cin>>n>>x;for(int i1;i<n;i){int numberi;while(number){int anumber%10;number/10;if(ax) ans;}}cout<<ans<<endl;return 0; }

ssm基于java的自助医疗服务系统的设计与实现+jsp论文

摘 要 现代经济快节奏发展以及不断完善升级的信息化技术&#xff0c;让传统数据信息的管理升级为软件存储&#xff0c;归纳&#xff0c;集中处理数据信息的管理方式。本自助医疗服务系统就是在这样的大环境下诞生&#xff0c;其可以帮助管理者在短时间内处理完毕庞大的数据信息…

代码随想录 Leetcode142. 环形链表 II

题目&#xff1a; 代码(首刷看解析 2024年1月13日&#xff09;&#xff1a; class Solution { public:ListNode *detectCycle(ListNode *head) {if (head nullptr) return nullptr;ListNode* fast head;ListNode* slow head;while (true) {if(fast->next nullptr || fa…

DICE模型的原理与推导、碳循环与气候变化、政策评估、不确定性分析与代码分析

目录 专题一&#xff1a;DICE模型的原理与推导 专题二&#xff1a;碳循环与气候变化 专题三&#xff1a;政策评估 专题四&#xff1a;不确定性分析与代码分析 更多应用 随着温室气体排放量的增大和温室效应的增强&#xff0c;全球气候变化问题受到日益的关注。我国政府庄严…

函数栈桢的创建和销毁

函数栈桢的创建和销毁 一、解决的问题二、认识常用的寄存器及其指令操作三、函数栈桢解析三、回答问题 一、解决的问题 1.局部变量是怎么创建的&#xff1f;  2.为什么局部变量的值是随机值&#xff1f;  3.函数是怎么传参的&#xff1f;传参的顺序是怎样的&#xff1f;  4.…

漏洞修复整理

一、Geoserver Apache HTTP/2拒绝服务漏洞&#xff08;CVE-2023-44487&#xff09;、Eclipse Jetty 资源管理错误漏洞(CVE-2023-26048)、Eclipse Jetty 信息泄露漏洞(CVE-2023-26049) 受影响版本&#xff1a;9.4.53以下版本 处理方式&#xff1a;原地升级 &#xff08; jdk版本…

Vue3 如何使用移动端调试工具vConsole

1、安装 pnpm i vconsole2、在src/utils下新建vconsole.ts&#xff0c;写入以下代码 // 这是移动端控制台调试工具&#xff0c;需要调试就打开,不用就注释 import vConsole from vconsole const vconsole new vConsole()3、src/main.ts 引入&#xff0c;需要调试就打开,&…

熊猫电竞赏金电竞系统源码 APP+H5双端 附搭建教程 支持运营级搭建

简介: 熊猫电竞赏金电竞系统源码 APP+H5双端 附搭建教程 支持运营级搭建 可搭建!运营级!首次公开! 赏金赛源码,用户通过平台打比赛,赢了获得奖金奖励, 金币赛、赏金赛、vip赛等种赛事 可开王者荣耀、和平精英比赛 支持1v1、单排、双排组、战队排等多种比赛模式 …

手写springBoot启动器

提示&#xff1a;springboot原理&#xff0c;手写springboot启动器&#xff0c;手写模拟SpringBoot启动过程、手写模拟SpringBoot自动配置功能 文章目录 前言一、本文内容1、手写模拟SpringBoot启动过程2、手写模拟SpringBoot自动配置功能 二、项目总体介绍三、代码实现(手写模…

Adobe Illustrator 2023--AI2023中文

Adobe Illustrator 2023是一款专业的矢量图形设计软件&#xff0c;广泛应用于印刷、Web、视频和移动设备的设计制作。它提供了丰富的绘图工具、矢量图形编辑功能和灵活的排版设计工具&#xff0c;帮助用户快速高效地制作出精美的设计作品。相较于其他设计软件&#xff0c;Adobe…

分享7款前端CSS动画特效源码(附在线演示)

精选7款前端CSS动画特效源码 下面我会给出特效样式图或演示效果图 但你也可以点击在线预览查看源码的最终展示效果及下载源码资源 CSS飞行的荷包蛋 CSS荷包蛋动画 荷包蛋会向右前方加速飞行 期间还能看到周围的气流匆匆飞过 以下图片只是简单的模型没有具体的动画效果最终动画…

Python读取log文件报错“UnicodeDecodeError”

转载说明&#xff1a;如果您喜欢这篇文章并打算转载它&#xff0c;请私信作者取得授权。感谢您喜爱本文&#xff0c;请文明转载&#xff0c;谢谢。 问题描述&#xff1a; 写了一个读取log文件的Python脚本&#xff1a; # -*- coding:utf-8 -*- import os import numpy as np …

手撕乘积(**Multiplication** **Product**): 穷举和图示(1)

手撕乘积(Multiplication & Product): 穷举和图示(1) 乘积 r ⋅ s ∑ i 1 s r r r ⋯ r ⏟ s times ∑ j 1 r s s s ⋯ s ⏟ r times r\cdot s\sum _{i1}^{s}r\underbrace {rr\cdots r} _{s{\text{ times}}}\sum _{j1}^{r}s\underbrace {ss\cdots s} _{r{\tex…

怎么把workspace的数据导入到simulink查看波形?

仿真截图&#xff1b; 示例代码&#xff1a; sampleTime 0.001; %设置采样时间 numSteps 1/sampleTimes; %设置时间矩阵长度 time sampleTime*(0:numSteps-1); %定义时间矩阵 time time; %时间矩阵转置 data sin…

【Maven】008-Maven 私服搭建与使用

【Maven】008-Maven 私服搭建与使用 文章目录 【Maven】008-Maven 私服搭建与使用一、概述1、简介2、建立私服后依赖查找和下载逻辑第一步&#xff1a;请求本地仓库第二步&#xff1a;请求 Maven 私服第三步&#xff1a;请求外部远程仓库&#xff08;远程中央仓库等&#xff09…