Qt 导出pdf文件(表格、图片)

article/2025/4/23 15:11:28

1.需要用的类

pro文件添加 QT += printsupport

QPdfWriter:写pdf的类

QTextDocument:支持html表格、图片的类

2.需要打印的界面

这里示例打印两个表格,一个水平方向的,一个垂直方向的,加一张图片。

3.保存的pdf效果如下

 4.源码

添加两个表格和一张图片

Widget::Widget(QWidget *parent) :QWidget(parent),ui(new Ui::Widget)
{ui->setupUi(this);QPixmap pixmap("./qtLogo.png");ui->label->setPixmap(pixmap);ui->t1->setColumnCount(2);ui->t1->setRowCount(4);ui->t1->setHorizontalHeaderLabels(QStringList()<<"姓名"<<"班级");ui->t1->horizontalHeader()->setStretchLastSection(true);ui->t1->setItem(0,0,new QTableWidgetItem("Tom"));ui->t1->setItem(0,1,new QTableWidgetItem("二年级"));ui->t1->setItem(1,0,new QTableWidgetItem("mary"));ui->t1->setItem(1,1,new QTableWidgetItem("一年级"));ui->t1->setItem(2,0,new QTableWidgetItem("Bob"));ui->t1->setItem(2,1,new QTableWidgetItem("二年级"));ui->t1->setItem(3,0,new QTableWidgetItem("lili"));ui->t1->setItem(3,1,new QTableWidgetItem("三年级"));ui->t2->setColumnCount(4);ui->t2->setRowCount(2);ui->t2->setHorizontalHeaderLabels(QStringList()<<"姓名"<<"地址"<<"年龄"<<"性别");ui->t2->horizontalHeader()->setStretchLastSection(true);ui->t2->setItem(0,0,new QTableWidgetItem("Tom"));ui->t2->setItem(0,1,new QTableWidgetItem("四川成都"));ui->t2->setItem(0,2,new QTableWidgetItem("16"));ui->t2->setItem(0,3,new QTableWidgetItem("男"));ui->t2->setItem(1,0,new QTableWidgetItem("mary"));ui->t2->setItem(1,1,new QTableWidgetItem("四川成都"));ui->t2->setItem(1,2,new QTableWidgetItem("15"));ui->t2->setItem(1,3,new QTableWidgetItem("女"));
}

保存pdf槽函数

void Widget::on_pushButton_clicked()
{WPdfWriter writer;writer.exportPdf();
}
WPdfWriter类,在这个类中,为了节约时间,导出的数据都是固定的。
#include "WPdfWriter.h"
#include <QPixmap>
#include <QPainter>WPdfWriter::WPdfWriter(QObject *parent): QObject(parent){}WPdfWriter::~WPdfWriter()
{if(m_pdfWriter)delete m_pdfWriter;
}void WPdfWriter::exportPdf()
{QString path = QFileDialog::getSaveFileName(nullptr,QString("Open file"),QString("."),QString("PDF Files(*.pdf)"));if(path.isEmpty())return;if(QFileInfo(path).suffix().isEmpty())path.append(".pdf");QFile pdfFile(path);if(!pdfFile.open(QIODevice::WriteOnly | QIODevice::Append))return;m_pdfWriter = new QPdfWriter(&pdfFile);m_pdfWriter->setPageSize(QPagedPaintDevice::A4);m_pdfWriter->setResolution(QPrinter::ScreenResolution);//添加标题m_html.append("<h1 style='text-align:center;'>导出数据</h1><br />");writePdf();//添加图片m_html.append("<img src='qtLogo.png' width=\"100\" height=\"100\">");QTextDocument textDocument;textDocument.setHtml(m_html);textDocument.print(m_pdfWriter);textDocument.end();pdfFile.close();
}void WPdfWriter::addTable(const QString &title, const QString &subTitle, int rows, int cols, QList<int> colWidth, const QList<QList<QString> > &values)
{m_html.append("<table border='0.5' cellspacing='0' cellpadding='3' width:100%>");//主标题if(!title.isEmpty()){m_html.append(QString("<tr><td align='center' style='vertical-align:middle;font-weight:bold;' colspan='%1'>").arg(cols));m_html.append(title);m_html.append("</td></tr>");}//副标题if(!subTitle.isEmpty()){m_html.append(QString("<tr><td align='left' style='vertical-align:middle;font-weight:bold;' colspan='%1'>").arg(cols));m_html.append(subTitle);m_html.append("</td></tr>");}//添加字段/字段值for(int i = 0;i < rows;i++){m_html.append("<tr>");QList<QString> rowValues = values.at(i);for(int j = 0;j < cols;j++){m_html.append(QString("<td width=%1% valign='center' style='vertical-align:middle;font-size:100px;'>").arg(colWidth.at(j)));m_html.append(rowValues.at(j));m_html.append("</td>");}m_html.append("</tr>");}m_html.append("</table><br /><br />");
}void WPdfWriter::writePdf()
{///添加基本信息QList<QString> rowsValues;QList<QList<QString>> values;//导出t1rowsValues.append("姓名");rowsValues.append("班级");values.append(rowsValues);rowsValues.clear();rowsValues.append("Tom");rowsValues.append("二年级");values.append(rowsValues);rowsValues.clear();rowsValues.append("mary");rowsValues.append("一年级");values.append(rowsValues);rowsValues.clear();rowsValues.append("Bob");rowsValues.append("二年级");values.append(rowsValues);rowsValues.clear();rowsValues.append("lili");rowsValues.append("三年级");values.append(rowsValues);QList<int> width;width.append(30);width.append(70);addTable("T1主标题","T1子标题",5,2,width,values);//导出t2rowsValues.clear();values.clear();rowsValues.append("姓名");rowsValues.append("地址");rowsValues.append("年龄");rowsValues.append("性别");values.append(rowsValues);rowsValues.clear();rowsValues.append("Tom");rowsValues.append("四川成都");rowsValues.append("16");rowsValues.append("男");values.append(rowsValues);rowsValues.clear();rowsValues.append("mary");rowsValues.append("四川成都");rowsValues.append("15");rowsValues.append("女");values.append(rowsValues);width.clear();width.append(25);width.append(25);width.append(25);width.append(25);addTable("T2主标题","T2子标题",3,4,width,values);
}

如下图代码中,我直接使用的html的语法加入的图片,有如下方法也可以加入图片。

    m_pdfWriter = new QPdfWriter(&pdfFile);m_pdfWriter->setPageSize(QPagedPaintDevice::A4);m_pdfWriter->setResolution(QPrinter::ScreenResolution);//加入图片QPainter painter;painter.begin(m_pdfWriter);QPixmap pixmap("./qtLogo.png");painter.scale(10,10);   //放大10倍painter.drawPixmap(0,0,pixmap);painter.end();


http://chatgpt.dhexx.cn/article/RnlwOWNv.shtml

相关文章

将图片型pdf转成可选中文字型pdf(免费)

在使用pdf过程中我们会遇到有些pdf不能进行标注的问题&#xff0c;这是由于有些pdf是扫描版的&#xff0c; 整个pdf是由一张张图片构成的&#xff0c;这样的pdf是不能选中文字&#xff0c;所以也无法进行标注。 本教程教你如何免费将图片型pdf转成可选中文字型pdf。土豪免入~~利…

怎么把图片变成PDF

在日常办公中&#xff0c;如果我们需要传输图片的话一般是比较简单的&#xff0c;但是如果需要传输很多张图片&#xff0c;不管是发送还是接收的话一张张的处理就比较麻烦了。这种情况下很多朋友或许都会将图片制作成PDF文件。这样技能方便传输也能方便查阅。那么怎么把图片变成…

PHP 实现PDF转图片

目录 1.环境配置&#xff1a; 2.实现原理&#xff1a; 3.安装php扩展imagick 4.安装ghostscript 5.pdf转图片 1.环境配置&#xff1a; 2.实现原理&#xff1a; Php使用扩展插件imagick进行图片处理&#xff0c;处理pdf时使用imagick去调用ghostscript 3.安装php扩展imag…

图片PDF转word

最近需要把PDF转word&#xff0c;试了几个网站发现PDF是图片做成的而不是文本直接做的。 找了些国内的软件都要收费。 直接放网站&#xff1a;https://www.onlineocr.net/ 限制&#xff1a;只有50页的免费权限 使用&#xff1a; 1 点右上角SIGN UP 去注册一个账号&#x…

【PS】免费 使用PS批量将pdf转换成图片 pdf转图片 pdf转jpg pdf转png

将各种各样的pdf转成图片&#xff0c;是比较普遍的需求&#xff0c;不过目前的各种转换器&#xff0c;不是收费&#xff0c;就是限制转换数量&#xff0c;要不就是强制加水印&#xff0c;很烦。 这里我们使用PS打开PDF&#xff0c;然后使用PS的宏&#xff0c;一键将图片保存到…

Python提取PDF中的图片

⚡插播一条老家自产的糖心苹果&#xff0c;多个品种&#xff0c;欢迎选购&#xff01;有问题随时私信我⚡&#xff1a; &#x1f34e;&#x1f34e;来自雪域高原的馈赠——海拔2000米的大凉山高原生态糖心苹果&#x1f34e;&#x1f34e;https://blog.csdn.net/qq_15969343/art…

图片怎么转换成PDF,这三个方法轻松搞定!

图片转PDF是指将图片文件转换为PDF文件的过程。PDF&#xff08;Portable Document Format&#xff09;是一种文件格式&#xff0c;能够保存文本、图像、表格等多种元素。PDF文件具有跨平台性、可打印性和可搜索性等优点&#xff0c;因此被广泛应用在文档分享、文档存储和文档打…

图片转为pdf怎么弄?发送图片安全高效的格式

图片转为pdf怎么弄&#xff1f;pdf文档作为当下最火的一种文档格式之一&#xff0c;我们在日常生活中会经常使用到它。这种格式的文件保密性高&#xff0c;不易被修改。而将图片转换为pdf格式&#xff0c;不仅方便传输图片&#xff0c;而且还能最大程度保证图片的颜色不被改变。…

如何把图片转换成PDF?4种简单快捷的方法,一键将图片转PDF

分享4种图片转PDF的方法&#xff0c;转换速度快&#xff0c;而且能够保持图片画质清晰&#xff0c;不管是单个图片转换还是多个图片转换&#xff0c;都能满足你&#xff01; 一、单张图片转PDF 1、照片查看器 直接使用Win10中自带的图片查看器&#xff0c;就能将图片转换为P…

Pycharm远程开发教程

Pycharm远程开发教程 最近项目中使用到了Pycharm的远程开发&#xff0c;记录一下具体的使用方式&#xff0c;本文涉及到的操作均为Pycharm专业版&#xff08;环境为Win10和Ubuntu16&#xff09;&#xff0c;社区版功能没有这么丰富&#xff0c;使用学生邮箱(.edu后缀)注册Jetbr…

CSS+HTML+JS----开发简单个人网站

今天闲着没事花了几个小时写了个个人网站&#xff1b;在盒子布局上花了点时间。 个人网站共六个静态界面&#xff0c;每个界面都有隐藏的音乐&#xff0c;自动播放。 个人网站分为三个部分&#xff0c;登录界面&#xff0c;主界面&#xff0c;以及分界面。 登陆界面主要核心…

微信机器人开发,个人微信开发

由于自身在机器人方面滚爬多年&#xff0c;现在收藏几个宝藏机器人 推荐一下自己常用的机器人&#xff1a; 不得不吹爆这家伙&#xff0c;适合有技术开发的公司&#xff0c;可以自主开发所需要的功能&#xff01;十分齐全

个人博客开发流程

成品&#xff1a;见公告》个人博客站点 1&#xff1a;列出博客大纲&#xff1a;用来干什么&#xff1b;为什么要做&#xff1b;怎么做&#xff1b; 2&#xff1a;列出博客的需求点 3&#xff1a;根据需求点整理出对应的技术文档 4&#xff1a;用workbench画出数据字典 5&#x…

微信小程序个人中心页面开发

目录 微信小程序创建项目配置底部导航栏 微信小程序滚动播放内容 微信小程序功能中心模块开发 微信小程序个人中心页面开发 微信小程序获取电话号码 微信小程序显示列表数据 微信小程序显示分页列表 微信小程序添加插屏广告 微信小程序添加激励式广告 最终效果可扫码查看 遇…

PHP简单实现个人网站

一、PHP简单实现个人网站 使用的技术&#xff1a; htmlcssjsjQueryphptable响应式布局 项目目录结构&#xff1a; 二、项目运行结果 1、首页 2、个人文章 3、喜欢的动画 4、喜欢的音乐 5、实现视频播放 三、项目总结与下载链接 本个人网站纯属个人开发&#xff0c;没有用到…

如何开发一个系统

文章目录 前言一、流程二、需求分析1、调研2、画图 三、系统设计1、架构2、模块设计3、画图 四、系统开发1、开发2、协作3、测试 总结体会 前言 作为一名大二学生&#xff0c;参加校内比赛做了一个绩效管理系统&#xff0c;所以写一下如何开发一个系统。 一、流程 制作一个系…

个人微信机器人开发

目前大多数公司中的消息通知使用邮件、短信、钉钉、企业微信等等&#xff0c;而微信或者QQ这种使用量较大的工具&#xff0c;通知和管理机制并不完善。特别是很多利用微信来进行客户管理沟通的人&#xff0c;例如我&#xff0c;只好借助微信机器人来实现通知和管理功能。 本篇…

手把手教你从零基础开始搭建个人网站

曾有不少人问过我怎么搭建自己的博客。其实搭建个人博客的方式有很多&#xff0c;有使用Git Page的&#xff0c;有使用一些博客平台的&#xff0c;也有自己购买网站空间或服务器搭建的&#xff0c;更有大神索性自己开发一套博客程序来用的。本文所介绍的方法全部基于Linux系统服…

手把手从零到有的个人网站开发

前言 很多人都想有一个自己的网站。那么&#xff0c;刚好Romki最近打算开始创建一个自己的个人网站。 就开始和我一起从零开始吧&#xff01; 一、整个云服务器吧 Romki 这里买的是腾讯的云服务器&#xff0c;具体购买什么鸭子的服务器&#xff0c;如果大家强烈需要&#xff0…

【个人网站开发 · 记录三】制定开发方案阶段 —— 技术角度分析如何去做一个个人网站

前言 当下的自媒体时代&#xff0c;体现在一个爱折腾的程序猿身上&#xff0c;那么最好的方式莫过于 —— 搭建自己的个人网站。网站上可以有自己的个人介绍&#xff0c;技术博客&#xff0c;项目总结&#xff0c;生活分享等等。简直是COOL &#xff01;&#xff08;面试神器有…