当前位置: 首页 > article >正文

基于Qt6 + MuPDF在 Arm IMX6ULL运行的PDF浏览器——MuPDF Adapter文档

  •  项目地址:总项目Charliechen114514/CCIMXDesktop: This is a Qt Written Desktop with base GUI Utilities

  • 本子项目地址:CCIMXDesktop/extern_app/pdfReader at main · Charliechen114514/CCIMXDesktop

前言

这个部分说的是Mupdf_adaper下的文档的工作函数的接口含义,如果你想要进行进一步的修改和优化,请自己修改源码和优化实现,或者如果你在使用中有任何问题,可以提交到Github Issue上询问我,或者是在CSDN博客下私信我等都可以,或者直接在CSDN平台上有条有理的提问,好让我帮助你。

类名:CCPdfDocument

CCPdfDocument 是一个用于管理和访问 PDF 文档的 C++ 类,它基于 MuPDF 库进行封装,并通过 QObject 实现与 Qt 信号系统的结合。该类封装了文档的打开、关闭、页码跳转、元信息查询等常用操作,目的是为上层应用提供一个清晰、可靠的 PDF 操作接口。

一、设计目标

该类面向的是需要“持有文档资源”的场景,也就是说,它内部维护了 PDF 的底层句柄(MuPDF 的 fz_documentfz_context),并且会负责整个文档生命周期的管理。由于它是一个“重量级”的类,所以不适合频繁创建和销毁,应尽可能复用一个对象处理多个操作。

为了增强稳定性,该类设计时不直接暴露底层资源,而是提供相对安全的接口,并封装了部分异常处理逻辑(如通过返回错误码来替代异常抛出,笔者认为嵌入式场景如果出现频繁的异常抛出是不合适的)。此外,通过 Qt 的信号机制,它还能将文档加载状态等事件及时通知 UI 或上层逻辑。

二、构造与析构

类提供了两个构造函数。一个是默认构造函数,另一个接收一个文档路径参数并自动加载文档。析构函数会自动关闭文档并释放资源,用户不必手动处理底层句柄的释放。

三、文档操作方法说明

load_document 是用于加载 PDF 文件的主要接口,它返回一个错误码,表示成功或失败的类型,如文件不存在或其他错误。 close_document 则用于关闭已打开的文档并释放资源。 document_loaded 用于判断当前是否有有效文档处于加载状态。 document_page 提供当前文档的总页数,它使用了 std::optional 类型,表示如果文档未加载,返回空值。 此外,类还提供了底层句柄的访问函数:raw_handleraw_context,但建议仅限于高级用户使用。

四、页码跳转支持

该类支持通过 jump 函数跳转到指定页码。它会检查页码合法性,如果越界或文档未加载,会返回合适的错误码(如溢出、下溢、页面不存在等),便于上层逻辑进行提示或纠正。当前页码和总页数可通过 current_pagetotal_pages 获取。

五、元信息支持

类内部还封装了一个 CCPdfMetaInfo 类型的元信息对象,通过 meta_info 函数获取。

六、信号机制

类定义了两个 Qt 信号:

  • document_load:在文档成功加载后发出,携带文档路径信息;

  • pageIndexChanged:当页码发生变化(例如跳转)时发出,便于 UI 层响应更新。

七、错误处理机制

类中定义了两个枚举类型用于错误处理:

  • ErrorCode 表示文档加载时的错误状态;

  • PageNavigationError 表示跳转页码时可能出现的错误。

这种设计方式有助于在不使用异常的情况下,仍然提供清晰的错误反馈路径。

八、私有成员说明

privated 是一个内部的私有实现指针(PIMPL 模式),用于封装实际的数据结构或 MuPDF 接口细节。这样做可以隐藏实现细节,避免头文件过度暴露依赖。 holding_path 保存当前打开的 PDF 路径,current_page_index 表示当前页码,total_page 表示总页数,这些变量用于记录状态。

类名:CCPdfChapterCreator

CCPdfChapterCreator 是一个用于提取和展示 PDF 文档目录结构(通常也叫做“章节”或“书签”)的辅助类。它的作用是从一个已打开的 PDF 文档中读取章节信息,并将其以树状形式呈现到指定的 Qt 控件中,便于用户浏览。

一、设计目的

该类的主要用途是服务于用户界面的章节展示功能。很多 PDF 文档带有内嵌目录结构,比如图书或论文中常见的“目录”部分,这些信息在 PDF 内部以 Outline 或 Bookmarks 的形式存在。通过 MuPDF 库的功能,可以读取这类信息,并在程序中以图形化方式展示。CCPdfChapterCreator 就是承担这个职责的类。

二、构造函数说明

构造函数非常简洁,它自动将 parse_start 信号连接到内部的 process_parse 槽函数。这种设计允许外部仅通过发出信号即可启动目录的解析逻辑,保持了代码结构的松耦合。

三、绑定界面组件

该类通过 bindSolvedTreeWidget 函数将某个 QTreeWidget 控件绑定进来。这个控件就是章节目录要展示的位置。在解析完成后,章节信息将被插入到该控件中,呈现出层级结构,类似于电子书中的目录。

四、文档解析与设置

parse_and_set 是外部调用的主要接口,传入一个已经加载的 CCPdfDocument 文档指针,表示希望对这个文档的章节结构进行分析。调用该函数后,内部会发出 parse_start 信号,进而触发解析流程。

五、解析流程与信号机制

内部使用 process_parse 进行实际解析逻辑,该函数作为私有成员,避免外部误调用。解析完成后会发出 parse_finish 信号,返回一个章节节点列表(QList<CCPdfChapterNode>)。这些章节节点应该包含了章节名称、起始页码、层级关系等信息,供 UI 控件使用。

通过 parse_startparse_finish 这两个信号,可以将解析过程拆分为“请求-完成”两个步骤,也方便后续扩展,例如添加加载动画或异步处理。

六、内部状态管理

该类内部仅维护了一个指向 QTreeWidget 的指针,名为 widget_handling,用于记录当前展示目录的控件对象。其生命周期应由外部维护,CCPdfChapterCreator 不拥有该控件的所有权。

以下是对 CCPdfViewer 类头文件所对应的工程文档说明,延续之前的风格,力求以平实语言解释类的功能与用途,方便理解和维护。


类名:CCPdfViewer

CCPdfViewer 是一个基于 Qt 的 PDF 页面显示控件,它继承自 QWidget,可以嵌入到任何 Qt 应用中,实现对 PDF 单页图像的显示。它负责将 PDF 页面渲染成图像,并将其展示在界面上,同时支持基本的缩放交互。

一、设计目的

该类的目的是提供一个面向页面级别的 PDF 浏览控件。它不关注整个文档的章节或多页内容,只处理当前页面的图像展示。由于 MuPDF 库本身不直接提供图像显示功能,本类结合内部工具(如 page_renderer)将页面渲染为 QImage 图像,再通过 QLabel 控件显示在界面上。

二、文档绑定机制

类通过 bindDocument 函数接收一个已经打开的 CCPdfDocument 对象。如果绑定失败(如文档未加载或无效),函数会返回 false。 调用 unbindDocument 可以解除绑定,清除显示内容,常用于关闭文档或更换文档。

三、缩放功能

控件支持页面缩放,通过 view_zoom 变量记录当前缩放比例,初始为 1.0(即 100% 大小)。 可以通过 set_zoom_step 设置每次缩放的步长,默认是 0.1。 类中定义了一个 ZoomDirection 枚举,表示缩放的方向,分为放大(ZOOM_IN)与缩小(ZOOM_OUT)。 调用 zoom 函数可以改变缩放值,而 fresh_zoom 则会在改变缩放后自动触发重绘操作。通过这种方式,用户可以自由控制文档视图的大小。

四、页面渲染与更新

fresh_render 是核心的渲染函数。它会从当前绑定的 PDF 文档中读取当前页内容,并渲染为图像(QImage),再通过内部 QLabel 展示在滚动区域中。如果缩放比例发生变化,重新调用此函数也能更新显示内容。

五、内部成员与 UI 结构

控件内部使用了 QLabel* imageLabel 作为主要图像展示区域,该标签通常嵌入在 QScrollArea 中,从而支持图像超出视窗时的滚动浏览。 变量 cached_image 用于缓存渲染出的图像,避免重复生成。 init_internal 是一个私有函数,负责初始化控件内部结构,比如创建标签、设置布局等。 此外,类使用了 Qt Designer 自动生成的 UI 类指针 Ui::CCPdfViewer *ui,说明本控件的界面结构可能通过 .ui 文件部分定义,便于可视化编辑。

六、信号与槽机制

目前该类未定义新的信号,主要通过槽函数处理交互行为,包括缩放与渲染。由于缩放操作非常常见,因此 zoomfresh_zoom 被设计为 inline 函数以提高效

相关文章:

基于Qt6 + MuPDF在 Arm IMX6ULL运行的PDF浏览器——MuPDF Adapter文档

项目地址&#xff1a;总项目Charliechen114514/CCIMXDesktop: This is a Qt Written Desktop with base GUI Utilities 本子项目地址&#xff1a;CCIMXDesktop/extern_app/pdfReader at main Charliechen114514/CCIMXDesktop 前言 这个部分说的是Mupdf_adaper下的文档的工…...

google-Chrome常用插件

google-Chrome常用插件 1. json格式化展示插件 github下载jsonview-for-chrome插件 通过离线安装方式 拓展程序-》管理拓展程序-》打开开发者模式-》加载已解压的拓展程序-》选择拓展程序解压的位置 2. 翻译插件 插件下载地址&#xff1a;Immersive Translate - Bilingual …...

2024年9月电子学会等级考试五级第三题——整数分解

题目 3、整数分解 正整数 N 的 K-P 分解是指将 N 写成 K 个正整数的 P 次方的和。本题就请你对任意给定的正整数 N、K、P&#xff0c;写出 N 的 K-P 分解。 时间限制&#xff1a;8000 内存限制&#xff1a;262144 输入 输入在一行给出 3 个正整数 N (≤ 400)、K (≤ N)、P (1 …...

毕设设计 | 管理系统图例

文章目录 环素1. 登录、注册2. 菜单管理 环素 1. 登录、注册 2. 菜单管理 公告通知 订单管理 会员管理 奖品管理 新增、编辑模块...

u3d 定义列表详细过程

层级结构 - Canvas - Scroll View - Viewport - Content (Vertical Layout Group) - Item1 (Prefab) - Item2 (Prefab) ... 详细设置步骤 1. 创建 Canvas 2. 添加 Scroll View 组件 3. 在 Scroll View 下创建 Content 子对象 4. 添加 …...

使用 `perf` 和火焰图(Flame Graph)进行性能分析

在现代软件开发中&#xff0c;性能优化是提升应用程序响应速度和资源利用率的关键步骤。当一个进程的 CPU 占用率异常高时&#xff0c;识别并优化性能瓶颈显得尤为重要。本文将详细介绍如何使用 Linux 下强大的性能分析工具 perf 以及火焰图&#xff08;Flame Graph&#xff09…...

什么情况会导致JVM退出?

大家好&#xff0c;我是锋哥。今天分享关于【什么情况会导致JVM退出&#xff1f;】面试题。希望对大家有帮助&#xff1b; 什么情况会导致JVM退出&#xff1f; 1000道 互联网大厂Java工程师 精选面试题-Java资源分享网 JVM&#xff08;Java虚拟机&#xff09;退出的情况通常是…...

实验6 电子邮件

实验6 电子邮件 1、实验目的 理解电子邮件系统基本结构 理解客户端和服务器端&#xff0c;以及服务器之间的通信 分析理解SMTP&#xff0c;POP3协议 2、实验环境 硬件要求&#xff1a;阿里云云主机ECS 一台。 软件要求&#xff1a;Linux/ Windows 操作系统 3、实验内容…...

AI大模型从0到1记录学习numpy pandas day24

第 1 章 环境搭建 1.1 Anaconda 1.1.1 什么是Anaconda Anaconda官网地址&#xff1a;https://www.anaconda.com/ 简单来说&#xff0c;Anaconda Python 包和环境管理器&#xff08;Conda&#xff09; 常用库 集成工具。它适合那些需要快速搭建数据科学或机器学习开发环境的用…...

深入理解浏览器渲染引擎:底层机制与性能优化实战

现代浏览器背后是一个庞大而复杂的系统工程&#xff0c;渲染引擎作为核心模块之一&#xff0c;承担着从解析 HTML/CSS 到最终绘制页面的关键职责。本文将从底层机制出发&#xff0c;系统梳理渲染引擎&#xff08;如 Blink&#xff09;工作原理、V8 与渲染流程的协作方式&#x…...

大模型浪潮下,黑芝麻智能高性能芯片助力汽车辅助驾驶变革

在全球汽车产业向智能化、网联化加速转型的浪潮中&#xff0c;大模型技术的崛起为汽车领域带来了前所未有的变革机遇。黑芝麻智能在高性能芯片和基础软件架构领域的持续创新&#xff0c;正全力推动汽车智能化的发展&#xff0c;为行业注入新的活力。 大模型全面助力辅助驾驶迈…...

鸿蒙OSUniApp制作多选框与单选框组件#三方框架 #Uniapp

使用UniApp制作多选框与单选框组件 前言 在移动端应用开发中&#xff0c;表单元素是用户交互的重要组成部分。尤其是多选框&#xff08;Checkbox&#xff09;和单选框&#xff08;Radio&#xff09;&#xff0c;它们几乎存在于每一个需要用户做出选择的场景中。虽然UniApp提供…...

康谋分享 | 自动驾驶仿真进入“标准时代”:aiSim全面对接ASAM OpenX

目录 一、OpenDRIVE&#xff1a;兼容多版本地图标准 &#xff08;1&#xff09;Atlas 工作流 &#xff08;2&#xff09;UE Plugin 工作流 二、OpenSCENARIO&#xff1a;标准化动态行为建模 三、OpenCRG&#xff1a;还原毫米级路面细节 四、OpenMATERIAL&#xff1a;更真…...

VMware中快速安装与优化Ubuntu全攻略

准备工作 在开始安装之前&#xff0c;确保已经下载了VMware Workstation或VMware Player&#xff0c;并准备好Ubuntu的ISO镜像文件。VMware Workstation是一款功能强大的虚拟机软件&#xff0c;支持在Windows或Linux主机上运行多个操作系统。 创建虚拟机 打开VMware Worksta…...

GPUGeek云平台实战:DeepSeek-R1-70B大语言模型一站式部署

随着人工智能技术的迅猛发展&#xff0c;特别是在自然语言处理领域&#xff0c;大型语言模型如DeepSeek-R1-70B的出现&#xff0c;推动了各行各业的变革。为了应对这些庞大模型的计算需求&#xff0c;云计算平台的普及成为了关键&#xff0c;特别是基于GPU加速的云平台&#xf…...

无人机动力系统全解析:核心组件、工作原理与实用指南

无人机想要实现稳定飞行与灵活操控&#xff0c;离不开一套高效协同的动力系统。该系统以电机、电子调速器&#xff08;电调&#xff09;、电池和螺旋桨四大核心组件为基础&#xff0c;各部分精密配合&#xff0c;共同驱动无人机翱翔蓝天。接下来&#xff0c;本文将从基础原理入…...

【C语言】初阶数据结构相关习题(二)

&#x1f386;个人主页&#xff1a;夜晚中的人海 今日语录&#xff1a;知识是从刻苦劳动中得来的&#xff0c;任何成就都是刻苦劳动的结果。——宋庆龄 文章目录 &#x1f384;一、链表内指定区间翻转&#x1f389;二、从链表中删去总和值为零的节点&#x1f680;三、链表求和&…...

嵌入式学习--江科大51单片机day7

我们在听课的过程中&#xff0c;可能对老师讲的有疑问&#xff0c;或者有些自己的理解&#xff0c;我们可以去问豆包&#xff0c;包括在写博客的时候我也是&#xff0c;不断去问豆包保证思考的正确性。&#xff08;有人感觉豆包很low啊&#xff0c;其实这些基础性的东西豆包一般…...

基于大模型预测围术期麻醉苏醒时间的技术方案

目录 一、数据收集与处理(一)数据来源(二)数据预处理二、大模型构建与训练(一)模型选择(二)模型训练三、围术期麻醉苏醒时间预测(一)术前预测(二)术中动态预测四、并发症风险预测(一)风险因素分析(二)风险预测模型五、基于预测制定手术方案(一)个性化手术规划…...

Element Plus 取消el-form-item点击触发组件,改为原生表单控件

文章目录 问题&#xff1a;方法一&#xff1a;使用全局样式覆盖&#xff08;推荐&#xff09;方法二&#xff1a;自定义指令&#xff08;更灵活&#xff09;方法三&#xff1a;封装高阶组件方法四&#xff1a;运行时DOM修改&#xff08;不推荐&#xff09; 问题&#xff1a; 描…...

javascript —— ! 和 !! 的区别与作用

javascript —— ! 和 !! 的区别与作用 在 JavaScript 里&#xff0c;! 和 !! 是两种不同的逻辑运算符&#xff0c;它们的功能和使用场景有明显区别。 1、 !&#xff08;逻辑非运算符&#xff09; 它的主要作用是 对操作数进行布尔值取反。具体来说&#xff0c;就是 先把操作…...

鸿蒙 ArkUI - ArkTS 组件 官方 UI组件 合集

ArkUI 组件速查表 鸿蒙应用开发页面上需要实现的 UI 功能组件如果在这 100 多个组件里都找不到&#xff0c;那就需要组合造轮子了 使用技巧&#xff1a;先判断需要实现的组件大方向&#xff0c;比如“选择”、“文本”、“信息”等&#xff0c;或者是某种形状比如“块”、“图…...

LLM笔记(三)位置编码(1)

位置编码理论与应用 1. 位置编码如何解决置换不变性及其数学表现 在Transformer模型中&#xff0c;自注意力机制&#xff08;Self-Attention&#xff09;具有置换不变性&#xff08;permutation invariance&#xff09;&#xff0c;这意味着对输入序列的词元&#xff08;toke…...

麒麟v10 部署 MySQL 5.6.10 完整步骤

需要包的私信我 一、安装依赖&#xff08;Perl环境&#xff09; # 在线安装依赖 yum -y install perl perl-devel# 离线安装&#xff08;需提前下载好rpm包&#xff09; mkdir /data/ybn/soft/pre yum install --downloadonly --downloaddir/data/ybn/soft/pre perl perl-dev…...

Git-学习笔记(粗略版)

前言 很多人都听过git&#xff0c;github这些名词,但是它们是什么&#xff0c;怎么使用&#xff1f;git和github是一个东西吗&#xff1f;本文将详细解答这些问题&#xff0c;彻底弄懂git。 1.Git是啥❓ 有一天&#xff0c;我们的插画师小王接到一个绘画订单&#xff0c;但奈…...

专项智能练习(定义判断)

1. 单选题 热传导是介质内无宏观运动时的传热现象&#xff0c;其在固体、液体和气体中均可发生。但严格而言&#xff0c;只有在固体中才是纯粹的热传导&#xff0c;在流体&#xff08;泛指液体和气体&#xff09;中又是另外一种情况&#xff0c;流体即使处于静止状态&#xff…...

失控的产品

大部分程序员很难有机会做一个新的产品&#xff0c;绝大多时候去一家新公司也都是在旧产品上修修补补。 笔者还是很幸运得到了开发新品的机会&#xff0c;从2023年开始做&#xff0c;中间经历了许多磕磕碰碰。 有的小伙伴从中离开&#xff0c;偶尔又加入1~2个人&#xff0c;但…...

【iOS安全】Dopamine越狱 iPhone X iOS 16.6 (20G75) | 解决Jailbreak failed with error

Dopamine越狱 iPhone X iOS 16.6 (20G75) Dopamine兼容设备 参考&#xff1a;https://www.bilibili.com/opus/977469285985157129 A9 - A11&#xff08;iPhone6s&#xff0d;X&#xff09;&#xff1a;iOS15.0-16.6.1 A12-A14&#xff08;iPhoneXR&#xff0d;12PM&#xf…...

无线定位之 二 SX1302 网关源码 thread_down 线程详解

前言 笔者计划通过无线定位系列文章、系统的描述 TDOA 无线定位和混合定位相关技术知识点, 并以实践来验证此定位系统精度。 笔者从实践出发、本篇直接走读无线定位系统关键节点、网关 SX1302 源码框架,并在源码走读过程 中、着重分析与无线定位相关的PPS时间的来龙去脉、并在…...

对心理幸福感含义的探索 | 幸福就是一切吗?

注&#xff1a;机翻&#xff0c;未校。 Happiness Is Everything, or Is It? Explorations on the Meaning of Psychological Well-Being 幸福就是一切吗&#xff1f;对心理幸福感含义的探索 Journal of Personality and Social Psychology 1989, Vol. 57, No. 6,1069-1081 …...