QT操作PDF文件
Qt 早期本身不提供原生的 PDF 操作功能。从 Qt 5.15 开始,Qt 提供了 PDF 模块,可以显示和提取 PDF 内容。Qt中有如下几种方式实现 PDF 文件的生成、读取和操作。
1、使用 QPrinter 生成 PDF
2、使用 Qt PDF 模块 (Qt 5.15+)
3、使用第三方库(比如:Poppler)
一、使用 QPrinter 生成 PDF
1、基本 PDF 生成
#include <QPrinter>
#include <QPainter>
#include <QApplication>void generateSimplePdf() {QPrinter printer(QPrinter::PrinterResolution);printer.setOutputFormat(QPrinter::PdfFormat);printer.setOutputFileName("output.pdf");QPainter painter;if (!painter.begin(&printer)) {qDebug() << "Failed to open printer";return;}// 绘制文本painter.setFont(QFont("Arial", 12));painter.drawText(100, 100, "Hello PDF from Qt!");// 绘制图形painter.drawRect(50, 50, 100, 150);painter.drawEllipse(200, 200, 50, 50);painter.end();qDebug() << "PDF generated successfully";
}
2、生成多页 PDF
void generateMultiPagePdf() {QPrinter printer(QPrinter::PrinterResolution);printer.setOutputFormat(QPrinter::PdfFormat);printer.setOutputFileName("multipage.pdf");QPainter painter;painter.begin(&printer);// 第一页painter.drawText(100, 100, "Page 1");printer.newPage();// 第二页painter.drawText(100, 100, "Page 2");printer.newPage();// 第三页painter.drawText(100, 100, "Page 3");painter.end();
}
3、高级PDF生成(含页眉页脚)
void generatePdfWithHeaderFooter(const QString &filePath) {QPrinter printer(QPrinter::PrinterResolution);printer.setOutputFormat(QPrinter::PdfFormat);printer.setOutputFileName(filePath);QPainter painter(&printer);// 设置页面边距const int margin = 50;QRect contentRect(margin, margin, printer.width() - 2*margin, printer.height() - 2*margin);// 页眉区域QRect headerRect(contentRect.left(), contentRect.top()-40, contentRect.width(), 30);// 页脚区域QRect footerRect(contentRect.left(), contentRect.bottom()+10, contentRect.width(), 30);// 内容QString content = "这里是文档的主要内容...\n";for (int i = 0; i < 50; i++) {content += QString("这是第 %1 行内容\n").arg(i+1);}// 分页绘制int yPos = contentRect.top();bool firstPage = true;foreach (const QString &line, content.split('\n')) {// 检查是否需要新页if (yPos + 20 > contentRect.bottom()) {// 绘制页脚painter.drawText(footerRect, Qt::AlignCenter, QString("第 %1 页").arg(printer.pageNum()));printer.newPage();yPos = contentRect.top();firstPage = false;// 绘制新页的页眉painter.drawText(headerRect, Qt::AlignCenter, "文档标题");}painter.drawText(contentRect.left(), yPos, line);yPos += 20;}// 最后一页的页脚painter.drawText(footerRect, Qt::AlignCenter, QString("第 %1 页").arg(printer.pageNum()));painter.end();
}
二、使用 Qt PDF 模块
从 Qt 5.15 开始,Qt 提供了 PDF 模块,可以显示和提取 PDF 内容。
在 .pro 文件中添加
QT += pdf
1、显示 PDF
#include <QPdfDocument>
#include <QPdfView>void displayPdf(QWidget *parent, const QString &pdfPath) {// 创建文档对象QPdfDocument *pdfDocument = new QPdfDocument(parent);// 创建视图QPdfView *pdfView = new QPdfView(parent);pdfView->setDocument(pdfDocument);// 加载PDF文件if (pdfDocument->load(pdfPath) != QPdfDocument::NoError) {qDebug() << "无法加载PDF文件";return;}pdfView->show();
}
2、提取 PDF 文本
#include <QPdfDocument>void extractPdfText() {QPdfDocument doc;if (doc.load("document.pdf") != QPdfDocument::NoError) {qDebug() << "Failed to load PDF";return;}for (int i = 0; i < doc.pageCount(); ++i) {QString text = doc.getAllText(i).text();qDebug() << "Page" << i+1 << "text:" << text;}
}
相关文章:
QT操作PDF文件
Qt 早期本身不提供原生的 PDF 操作功能。从 Qt 5.15 开始,Qt 提供了 PDF 模块,可以显示和提取 PDF 内容。Qt中有如下几种方式实现 PDF 文件的生成、读取和操作。 1、使用 QPrinter 生成 PDF 2、使用 Qt PDF 模块 (Qt 5.15+) 3、使用第三方库(比如:Poppler) 一、使用 Q…...
【算法手记8】NC95 数组中的最长连续子序列 字母收集
🦄个人主页:修修修也 🎏所属专栏:刷题 ⚙️操作环境:牛客网 目录 一.NC95 数组中的最长连续子序列 题目详情: 题目思路: 解题代码: 二.字母收集 题目详情: 题目思路: 解题代码: 结语 一.NC95 数组中的最长连续子序列 牛客网题目链接(点击即可跳转):NC95 …...
AI渗透测试:网络安全的“黑魔法”还是“白魔法”?
引言:AI渗透测试,安全圈的“新魔法师” 想象一下,你是个网络安全新手,手里攥着一堆工具,正准备硬着头皮上阵。这时,AI蹦出来,拍着胸脯说:“别慌,我3秒扫完漏洞࿰…...
使用perf工具分析Linux系统的性能瓶颈
想获取更多高质量的Java技术文章?欢迎访问Java技术小馆官网,持续更新优质内容,助力技术成长 Java技术小馆官网https://www.yuque.com/jtostring 使用perf工具分析Linux系统的性能瓶颈 在现代计算系统中,性能瓶颈是一个经常遇到…...
知识就是力量——HELLO GAME WORD!
你好!游戏世界! 简介环境配置前期准备好文章介绍创建头像小功能组件安装本地中文字库HSV颜色空间音频生成空白的音频 游戏UI开发加载动画注册登录界面UI界面第一版第二版 第一个游戏(贪吃蛇)第二个游戏(俄罗斯方块&…...
LeetCode算法题(Go语言实现)_20
题目 给你两个下标从 0 开始的整数数组 nums1 和 nums2 ,请你返回一个长度为 2 的列表 answer ,其中: answer[0] 是 nums1 中所有 不 存在于 nums2 中的 不同 整数组成的列表。 answer[1] 是 nums2 中所有 不 存在于 nums1 中的 不同 整数组成…...
ES拼音分词自动补全实现
#测试拼音分词 POST /_analyze { "text":"如家酒店真不错", "analyzer": "pinyin" } #这里把拼音的首字母放到这里,也说明了这句话没有被分词,而是作为一个整体出现的 #还把每一个字都形成了一个拼音&#…...
Spring Boot 日志 配置 SLF4J 和 Logback
文章目录 一、前言二、案例一:初识日志三、案例二:使用Lombok输出日志四、案例三:配置Logback 一、前言 在开发 Java 应用时,日志记录是不可或缺的一部分。日志可以记录应用的运行状态、错误信息和调试信息,帮助开发者…...
构建大语言模型应用:数据准备(第二部分)
本专栏通过检索增强生成(RAG)应用的视角来学习大语言模型(LLM)。 本系列文章 简介数据准备(本文)句子转换器向量数据库搜索与检索大语言模型开源检索增强生成评估大语言模型服务高级检索增强生成 RAG 如上…...
mac m 芯片 动态切换 jdk 版本jdk8.jdk11.jdk17
下载 jdk 版本. 默认安装路径在. /Library/Java/JavaVirtualMachines配置环境变量 # 动态获取所有 JDK 路径 export JAVA_8_HOME$(/usr/libexec/java_home -v 1.8) export JAVA_11_HOME$(/usr/libexec/java_home -v 11) export JAVA_17_HOME$(/usr/libexec/java_home -v 17)#…...
如何通过python将视频转换为字符视频
请欣赏另类的老鼠舞 字符老鼠舞 与原版对比 对比 实现过程 1. 安装库 pip install numpy pip install Pillow pip install opencv-python pip install moviepy 2. 读取视频帧并转换为灰度图 import cv2def make_video(input_video_path, output_video_path):video_cap cv2…...
如何高效备考蓝桥杯(c/c++)组
以下是针对蓝桥杯C/C组的高效备考策略,结合你的当前基础(C语法简单算法题),分阶段提升竞赛能力,重点突破高频考点: 一、蓝桥杯C/C组核心考点梳理 根据历年真题,重点考察以下内容(按…...
两数之和-力扣
给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出 和为目标值 target 的那 两个 整数,并返回它们的数组下标。 你可以假设每种输入只会对应一个答案,并且你不能使用两次相同的元素。 你可以按任意顺序返回答案。 示例 1…...
react撤销和恢复
创建一个历史记录栈past,和一个撤销过的栈future,,在每次操作store的时候,将当前的store的数据,存入历史记录栈past中,, 如果是撤销操作,,就从这个历史栈中取最后面那个数…...
华为机试—密码验证合格程序
题目 你需要书写一个程序验证给定的密码是否合格。 合格的密码要求: 长度超过 8 位必须包含大写字母、小写字母、数字、特殊字符中的至少三种不能分割出两个独立的、长度大于 2 的连续子串,使得这两个子串完全相同;更具体地,如果…...
分布式ID生成器:雪花算法原理与应用解析
在互联网分布式系统中,生成全局唯一的ID是一个核心问题。传统的数据库自增ID、UUID虽然各有优缺点,但在高并发、分库分表场景下往往无法满足需求。美团Leaf分布式ID生成器便是为了解决这些问题而诞生的,其核心实现便是基于Snowflakeÿ…...
搭建Flutter开发环境 - MacOs
一、配置Flutter SDK 1.1 到官网下载Flutter SDK 打开Flutter中文社区网址,往下滚动,找到下载并安装Flutter,选择适合自己电脑的安装包进行下载。下载完毕后,解压放到你想要放置的目录下,我放到了 User/账户/develop…...
【Flutter学习(1)】Dart访问控制
疑问代码片段: class _MyHomePageState extends State<MyHomePage> {int _counter 0;void _incrementCounter() {setState(() {_counter;});} }对Flutter初始文件里下划线的疑问 为什么这里的类和申明的计数器都要在前面加一个下划线? 在 Dart 中…...
Day50 单词规律
给定一种规律 pattern 和一个字符串 s ,判断 s 是否遵循相同的规律。 这里的 遵循 指完全匹配,例如, pattern 里的每个字母和字符串 s 中的每个非空单词之间存在着双向连接的对应规律。 class Solution {public boolean wordPattern(String p…...
HTTP和HTTPS区别
一:工作原理 HTTP 超文本传输协议。 一种应用层协议,用于在客户端(如浏览器)和服务器之间传输超文本数据(如HTML、图片)。 明文传输,无加密。 HTTPS 安全的超文本传输协议。 是HTTP的加密…...
拥抱AI变革机遇,联易融自研供应链金融垂直领域大模型“蜂联 AI”
2025年3月25日,中国领先的供应链金融科技解决方案服务商联易融科技集团(09959.HK,以下简称“联易融”)发布2024年业绩公告。2024年公司总收入及收益达10.3亿元,同比增长19%;受益于产品结构优化与运营效率改…...
常用数据库
模式的定义于删除 1.定义模式 CREATE SCHEMA [ <模式名> ] AUTHORIZATION < 用户名 >;要创建模式,调用该命令的用户必须拥有数据库管理员权限,或者获得了DBA授权 eg:为用户WANG定义一个模式S-C-SC CREATE SCHEMA "S-C-SC" AUT…...
Hive UDF开发实战:构建高性能JSON生成器
目录 一、背景与需求场景 二、开发环境准备 2.1 基础工具栈 2.2 Maven依赖配置 三、核心代码实现...
数字电子技术基础(三十六)——利用Multisim软件实现3线-8线译码器
目录 1 手动方式实现3线-8线译码器 2 使用字选择器实现3线-8线译码器 现在尝试利用Multisim软件来实现3线-8线译码器。本实验目的是验证74LS138的基本功能,简单来说就是“N中选1”。 实验设计: (1)使能信号:时&am…...
解析 HTML 网站架构规范
2025/3/28 向全栈工程师迈进! 一、网页基本的组成部分 网页的外观多种多样,但是除了全屏视频或游戏,或艺术作品页面,或只是结构不当的页面以外,都倾向于使用类似的标准组件。 1.1页眉 通常横跨于整个页面顶部有一…...
小智机器人关键函数解析,Application::OutputAudio()处理音频数据的输出的函数
以下是对 Application::OutputAudio() 函数的详细解释: 源码: void Application::OutputAudio() { // 扬声器的输出auto now std::chrono::steady_clock::now();auto codec Board::GetInstance().GetAudioCodec();const int max_silence_seconds 10;…...
基于javaweb的SpringBoot驾校预约学习系统设计与实现(源码+文档+部署讲解)
技术范围:SpringBoot、Vue、SSM、HLMT、Jsp、PHP、Nodejs、Python、爬虫、数据可视化、小程序、安卓app、大数据、物联网、机器学习等设计与开发。 主要内容:免费功能设计、开题报告、任务书、中期检查PPT、系统功能实现、代码编写、论文编写和辅导、论文…...
《边缘计算风云录:FPGA与MCU的算力之争》
点击下面图片带您领略全新的嵌入式学习路线 🔥爆款热榜 88万阅读 1.6万收藏 文章目录 **第一章:边城烽烟——数据洪流压境****第二章:寒铁剑匣——FPGA的千机变****第三章:枯木禅杖——MCU的至简道****第四章:双生契…...
3.3 元组
元组(tuple): 1.元组的定义: -通过 tuple() !!!元组中的元素不能发生改变!!! #测试元组的定义 # - 定义空元组 tuple1 ()print(tu…...
PyTorch版本过低导致属性错误-Linux服务器
问题 在 Jupyter Lab 中配置 Python 环境(如 PyTorch 或其他库)通常涉及以下几个步骤: 1. 检查当前 Jupyter Lab 的内核环境 运行以下命令查看当前可用的内核: !jupyter kernelspec list或者 jupyter kernelspec list这会显示 …...
一文解读DeepSeek大模型在政府工作中具体的场景应用
引言 本文以政务内部管理的视角,介绍DeepSeek大模型在政务数字化在转型中的提质增效应用!政务本是一个复杂的系统,对外要提供公共服务,对内有严格的安全管理要求。DeepSeek大模型在政务系统中的应用,对外提升服务水平&…...
场馆预约小程序的设计与实现
摘 要 时代在进步,人们对日常生活质量的要求不再受限于衣食住行。现代人不仅想要一个健康的身体,还想拥有一身宛如黄金比例的身材。但是人们平常除了上下班和上下学的时间,其余空余时间寥寥无几,所以我们需要用体育场馆预约来节省…...
【C++】string
个人主页:NiKo C专栏:C程序设计 目录 一、标准库中的string类 二、string的遍历 三、string容量 四、string修改 一、标准库中的string类 1、string类 C语言中,字符串是以\0结尾的一些字符的集合,为了操作方便,…...
在 RK3588 多线程推理 YOLO 时,同时开启硬件解码和 RGA 加速的性能分析
一、前言 本文是基于RK3588的YOLO多线程推理多级硬件加速引擎框架设计项目的延申与拓展,单独分析所提出的方案4的性能和加速原理,即同时开启 RKmpp 硬件视频解码和 RGA 硬件图像缩放、旋转。 二、实验结果回顾 在项目的总览篇中,给出了该方案…...
sqli-labs靶场 less 8
文章目录 sqli-labs靶场less 8 布尔盲注 sqli-labs靶场 每道题都从以下模板讲解,并且每个步骤都有图片,清晰明了,便于复盘。 sql注入的基本步骤 注入点注入类型 字符型:判断闭合方式 (‘、"、’、“”…...
3.2 列表的常见函数
1.列表的常用函数 -如何查看一个不认识的内容 -help() -查看官方帮助文档 -dir() -查看内部函数 -随机数语句 import randomranom.randint(0,101) 随机生成0-100内的数字 list1 [1,2,3,4,5]list2 list([1,2,3,4,5,])list2 list("wang…...
Apache Doris 高频问题排查指南:从报错到性能优化
一、部署与配置问题 1. FE启动失败:Address already in use ERROR: fe.journal.Catalog constructor exception. port9010 is already used. 原因:端口被占用或残留进程未释放 解决: # 查找占用进程 lsof -i :9010 # 终止残留进程 kill…...
Hadoop/Spark 生态
Hadoop/Spark 生态是大数据处理的核心技术体系,专为解决海量数据的存储、计算和分析问题而设计。以下从底层原理到核心组件详细讲解,帮助你快速建立知识框架! 一、为什么需要 Hadoop/Spark? 传统单机瓶颈: 数据量超…...
51单片机的五类指令(二)——算术运算类指令
目录 一、加法指令 (一)不带进位加法指令(ADD) (二)带进位加法指令(ADDC) (三)加 1 指令(INC) (四)十进制…...
uniapp选择文件使用formData格式提交数据
1. Vue实现 在vue项目中,我们有个文件,和一些其他字段数据需要提交的时候,我们都是使用axios 设置请求头中的Content-Type: multipart/form-data,然后new FormData的方式来进行提交。方式如下: const sendRequest = () => {const formData = new FormData()formData…...
mac Python多版本第三方库的安装路径
终端查看python版本是 3.12,但是pycharm使用的python版本是 3.9 终端正常安装包以后,pycharm都可以正常使用,但是将 pycharm的python换成 3.12 版本,之前安装的库都没有了 通过终端查看安装库的位置,确实是安装到py…...
第 26 场 蓝桥月赛 部分题解
第 26 场 蓝桥月赛 2.灯笼猜谜3.元宵分配4.摆放汤圆5.元宵交友(运行超时 通过90%) 2.灯笼猜谜 分析:以当前位置为视角,要想移动的距离尽可能的少,按顺序猜谜语,给你一个区间,有三种情况…...
【Vue3知识】Vue3集成富文本编辑器TinyMCE
Vue3集成富文本编辑器TinyMce 集成一、安装依赖二、基础集成示例1. 组件封装:RichEditor.vue 三、关键配置说明1. **API Key 配置**2. **图片上传处理**3. **多语言支持** 四、完整本地化部署步骤(无 API Key)五、在父组件中使用六、常见问题…...
pod生命周期
1.init容器:做主容器运行前需要做的准备条件 2.探针 通俗易懂就是检测容器是否正常运行工作 启动探针startupProbe:检测应用是否完成启动 ,如果启动则禁用其他探测 直到成功为止,探测失败则杀死容器,容器服从重启策略…...
Oracle数据库数据编程SQL<3.3 PL/SQL 游标>
游标(Cursor)是Oracle数据库中用于处理查询结果集的重要机制,它允许开发者逐行处理SQL语句返回的数据。 目录 一、游标基本概念 1. 游标定义 2. 游标分类 二、静态游标 (一)显式游标 【一】不带参数,普通的显示游标 1. 显式…...
OLLAMA 未授权访问-漏洞挖掘
1.漏洞描述 Ollama存在未授权访问漏洞。由于Ollama默认未设置身份验证和访问控制功能,未经授权的攻击者可在远程条件下调用Ollama服务接口,执行包括但不限于敏感模型资产窃取、虚假信息投喂、模型计算资源滥用和拒绝服务、系统配置篡改和扩大利用等恶意…...
多线程—线程安全集合类与死锁
上篇文章: 多线程—JUChttps://blog.csdn.net/sniper_fandc/article/details/146713322?fromshareblogdetail&sharetypeblogdetail&sharerId146713322&sharereferPC&sharesourcesniper_fandc&sharefromfrom_link 目录 1 线程安全的集合类 …...
【鸿蒙5.0】鸿蒙登录界面 web嵌入(隐私页面加载)
在鸿蒙应用中嵌入 Web 页面并加载隐私页面,可借助 WebView 组件来实现。以下是一个完整示例,展示如何在鸿蒙 ArkTS 里嵌入 Web 页面并加载隐私政策页面。 在 HarmonyOS 应用开发中,如果你希望嵌入一个网页,并且特别关注隐私页面加…...
C++轻量HeaderOnly的JSON库
文章目录 1 nlohmann/json库说明2 nlohmann/json特点3 nlohmann/json库的使用方法3.1 引入头文件3.2 解析JSON字符串3.3 访问JSON数据3.4 生成JSON对象3.5 修改JSON数据3.6 将JSON写入文件3.7 遍历JSON对象 4 代码示例4.1 定义JSON数值类型4.2 从STL容器转换到json4.3 string序…...
打包python文件生成exe
下载PyInstaller 官网 pip install pyinstaller验证是否安装成功 pyinstaller --version打包 pyinstaller "C:\Documents and Settings\project\myscript.py"会生成.spec,build,dist三项,其中build,dist为文件夹,dist是最后的可执行文件&a…...