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.hqwc.cn/news/412687.html

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

相关文章

PHP反序列化总结4--原生类总结

原生类的简要介绍以及原生类和反序列化的关系 PHP 原生类指的是 PHP 内置的类&#xff0c;它们可以直接在 PHP 代码中使用且无需安装或导入任何库&#xff0c;相当于代码中的内置方法例如echo &#xff0c;print等等可以直接调用&#xff0c;但是原生类就是可以就直接php中直接…

翻译: Streamlit从入门到精通 显示图表Graphs 地图Map 主题Themes 二

Streamlit从入门到精通 系列&#xff1a; 翻译: Streamlit从入门到精通 基础控件 一 1. 使用Streamlit显示图表Graphs 1.1 为什么我们需要可视化&#xff1f; 数据可视化通过将数据整理成更容易理解的格式来讲述故事&#xff0c;凸显趋势和异常点。好的可视化能够讲述一个故…

如何定位和优化程序CPU、内存等性能之巅

目录 摘要 引言 关注 指标 正文 定位CPU瓶颈 定位内存瓶颈 定位IO瓶颈 总结 摘要 性能优化指在不影响系统运行正确性的前提下&#xff0c;使之运行得更快&#xff0c;完成特定功能所需的时间更短&#xff0c;或拥有更强大的服务能力。本文将介绍性能优化的基本概念以…

Logback的配置文件,你看懂了吗

参考文章一 参考文章二 configuration是XML文件根元素。root和logger可视为同一类&#xff0c;都是日志设置&#xff1b;root是日志的全局设置&#xff0c;而logger可以单独设置某一些包和类的日志输出。appender配置日志格式、如何过滤、文件处理等。property和contextName元…

(N-140)基于springboot,vue协同过滤推荐算法个性化购物商城

开发工具&#xff1a;IDEA 服务器&#xff1a;Tomcat9.0&#xff0c; jdk1.8 项目构建&#xff1a;maven 数据库&#xff1a;mysql5.7 系统分前后台&#xff0c;项目采用前后端分离 前端技术&#xff1a;vueelementUI 服务端技术&#xff1a;springbootmybatisredis 本…

yarn包管理器在添加、更新、删除模块时,在项目中是如何体现的

技术很久不用&#xff0c;就变得生疏起来。对npm深受其害&#xff0c;决定对yarn再整理一遍。 yarn包管理器 介绍安装yarn帮助信息最常用命令 介绍 yarn官网&#xff1a;https://yarn.bootcss.com&#xff0c;学任何技术的最新知识&#xff0c;都可以通过其对应的网站了解。无…

下一代 Vue3 Devtools 正式开源

什么是 Vue DevTools Vue DevTools 是一个旨在增强 Vue 开发人员体验的工具,它提供了一些功能来帮助开发者更好地了解 Vue 应用程序。 Vue DevTools:Unleash Vue Developer Experience. Enhance your Vue development journey with an amazing experience! 典型的功能特征包…

【数据结构】二叉树(遍历,递归)

&#x1f308;个人主页&#xff1a;秦jh__https://blog.csdn.net/qinjh_?spm1010.2135.3001.5343&#x1f525; 系列专栏&#xff1a;《数据结构》https://blog.csdn.net/qinjh_/category_12536791.html?spm1001.2014.3001.5482 ​​​ 目录 二叉树遍历规则 前序遍历 ​…

day-13 拿出最少数目的魔法豆

思路 将beans的每个数值当做袋子最后豆子剩余数&#xff0c;选择取豆子最少的一种方案 解题方法 //从小到大&#xff0c;将每个beans[i]作为剩余豆子数 //对于beans[i]&#xff0c;i之前的全为零&#xff0c;i之后的全变为beans[i] ansMath.min(ans,sum-(beans.length-i)*bean…

尚无忧【无人共享空间 saas 系统源码】无人共享棋牌室系统源码共享自习室系统源码,共享茶室系统源码

可saas多开&#xff0c;非常方便&#xff0c;大大降低了上线成本 UNIAPPthinkphpmysql 独立开源&#xff01; 1、定位功能&#xff1a;可定位附近是否有店 2、能通过关键字搜索现有的店铺 3、个性轮播图展示&#xff0c;系统公告消息提醒 4、个性化功能展示&#xff0c;智能…

CNN:Convolutional Neural Network(下)

目录 1 CNN 学到的是什么 1.1 Convolution 中的参数 1.2 FFN 中的参数 1.3 Output 2 Deep Dream 3 Deep Style 4 More Application 4.1 AlphaGo 4.2 Speech 4.3 Text 原视频&#xff1a;李宏毅 2020&#xff1a;Convolutional Neural Network 本博客属于学…

【SpringBoot】Bean 是什么?

感兴趣的话&#xff0c;可以看我另外一篇关于 Bean 的文章&#xff1a;【Java基础】Spring 中 Bean 的理解与使用 一、Bean 定义 Bean 作为 Spring 框架面试中不可或缺的概念&#xff0c;其本质上是指代任何被 Spring 加载生成出来的对象。&#xff08;本质上区别于 Java Bea…