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

qt 实现pdf阅读器

文章目录

    • 概要
    • 方案一
    • 方案二
      • 一、介绍
      • 二、编译
      • 三、用法
      • 本项目代码

概要

在qt程序中,要实现PDF文件浏览,从网上目前找到了两种解决方案,本文主要介绍下着两种方案和适用性。

方案一

这种方法是从https://github.com/develtar/qt-pdf-viewer-library 提供的一个框架,集成方法和效果都不错,唯一的缺点是占用的内存太大,在嵌入式设备上不适用,故放弃了,
该方案采用的是webview, 故需要支持webview 也是占用内存较大的原因

效果如图:
在这里插入图片描述
在这里插入图片描述

方案二

集成pdfium,当然高版本的QT已经自带pdf功能。

一、介绍

pdfium.dll 是 Adobe 开源的一款 PDF 渲染引擎。它是一个跨平台的库(支持 Windows、Linux、MacOS 等多个平台),功能强大且易于使用。pdfium.dll 不仅支持 PDF 文件的解析、渲染、打印,还能够嵌入到自己的应用程序中使用。

pdfium.dll 的开源地址在 GitHub 上,对于开发者来说非常友好,文档详细且示例丰富。几乎可以做到零开发成本,就能够使用 pdfium.dll 库为自己的应用程序添加 PDF 渲染功能。

二、编译

QtPdfium 是一个Qt模块,主要用于操作和显示PDF文件。该模块核心功能使用了pdfium工程,它是Google的一个开源项目(BSD);

一、编译安装步骤

1、Mac/Linux代码编译和安装使用

git clone –recursive https://github.com/paulovap/qtpdfium
cd qtpdfium
qmake
make
make install (might need sudo)

三、用法

QtPdfium 导出两个重要类:QPdfium 和 QPdfiumPage.
1、包含头文件#include <QtPdfium/QtPdfiumDepends>
2、通过PDF文件名称生产QPdfium对象 QPdfium pdfium(strPDFFileName);
3、通过QPdfium生成QPdfiumPage 对象

//获取PDF文件包含的页数
int nPageCn = pPdfium->pageCount();

//获取指定的页
QPdfiumPage pfPage = pPdfium->page(i);
//由QpdfiumPage生成Qimage
QImage pdfImage = pfPage.image();
//….显示等

本项目代码

class PdfImageProvider : public QObject, public QQuickImageProvider
{Q_OBJECTQ_PROPERTY(bool ready READ ready NOTIFY readyChanged)
public:QPdfium *m_pdf = nullptr;explicit PdfImageProvider(): QQuickImageProvider(QQuickImageProvider::Image)//, m_pdf(new QPdfium()){}virtual ~PdfImageProvider() {}QImage requestImage(const QString &id, QSize *size, const QSize &requestedSize) override{Q_UNUSED(requestedSize);if (!m_pdf || !m_pdf->isValid()) {qDebug() << "Unable to load pdf";return QImage();}qDebug() << __func__ << requestedSize;int i = id.toInt();auto page = m_pdf->page(i);
//        qreal scale = requestedSize.isValid() ?
//                    requestedSize.width()/(qreal)page.width() :
//                    2;qreal scale = 1200/(qreal)page.width();qDebug() << __func__ << page.width() << page.height() << scale;auto image = page.image(scale);qDebug() << __func__ << image.width() << image.height() << scale;size->setWidth(image.width());size->setHeight(image.height());return image;}Q_INVOKABLE bool ready() {return m_pdf != nullptr && m_pdf->isValid();}Q_INVOKABLE int pageCount() {return m_pdf->pageCount();}Q_INVOKABLE void setFilename(QString filename) {m_pdf->loadFile(filename);Q_EMIT readyChanged(m_pdf->isValid());}Q_INVOKABLE QString pageText(int index) {return m_pdf && m_pdf->isValid() ? m_pdf->page(index).text() : "";}Q_INVOKABLE void creatPdfium(){qDebug() << __func__ << m_pdf;if(m_pdf == nullptr)m_pdf = new QPdfium();}Q_INVOKABLE void releasePdfium(){if(m_pdf != nullptr){delete m_pdf;m_pdf = nullptr;}}
Q_SIGNALS:void readyChanged(int);
};

相关文章:

qt 实现pdf阅读器

文章目录 概要方案一方案二一、介绍二、编译三、用法本项目代码 概要 在qt程序中&#xff0c;要实现PDF文件浏览&#xff0c;从网上目前找到了两种解决方案&#xff0c;本文主要介绍下着两种方案和适用性。 方案一 这种方法是从https://github.com/develtar/qt-pdf-viewer-l…...

从培训班出来之后找工作的经历,教会了我五件事.....

我是非计算机专业&#xff0c;由于专业不好实习急着就业有过一些失败的工作经历后&#xff0c;跑去参加培训进入IT这行的。 之前在报名学习软件测试之前我也很纠结&#xff0c;不知道怎么选择机构。后面看到有同学在知乎上分享自己的学习经历&#xff0c;当时对我的帮助很大。…...

idea中还原dont ask again

背景 在使用idea打开另外一个项目的时候&#xff0c;一不小心勾选为当前项目而且是不在下次询问&#xff0c;导致后面每次打开新的项目都会把当前项目关闭&#xff0c;如下图所示 下面我们就一起看一下如何把这个询问按钮还原回来 preferences/settings->Appearance&…...

Unity之ShaderGraph如何实现光边溶解

前言 今天我们来实现一个最常见的随机溶剂效果。如下图所示&#xff1a; 光边溶解效果&#xff1a; 无光边效果 主要节点 Simple Noise&#xff1a;根据输入UV生成简单噪声或Value噪声。生成的噪声的大小由输入Scale控制。 Step&#xff1a;对于每个组件&#xff0c;如果输…...

Go语言和Python语言哪个比较好?

目录 1、性能 2、开发效率和易用性 3、社区支持 4、语法 5、其他因素 总结 Go语言和Python语言都是非常优秀的编程语言&#xff0c;它们各自具有不同的优势和适用场景。在选择哪种语言更适合您的项目时&#xff0c;需要考虑多个方面&#xff0c;包括性能、开发效率、可读…...

MAYA教程之模型的UV拆分与材质介绍

什么是UV 模型制作完成后&#xff0c;需要给模型进行贴图&#xff0c;就需要用到UV功能 UV编译器介绍 打开UI编译器 主菜单有一个 UV->UV编译器&#xff0c;可以点击打开 创建一个模型&#xff0c;可以看到模型默认的UV UV编译器功能使用 UV模式的选择 在UV编译器中…...

vscode调试container(进行rocksdb调试)

vscode调试container&#xff08;进行rocksdb调试&#xff09; 参考链接&#xff1a; https://blog.csdn.net/qq_29809823/article/details/128445308#t5 https://blog.csdn.net/qq_29809823/article/details/121978762#t7 使用vscode中的插件dev containners->点击左侧的…...

从恐怖到商机:2023万圣节跨境电商如何打造鬼魅消费体验?

又到了一年一度的糖果、恐怖装扮和万圣节派对的时候&#xff01;随着10月底的日子临近&#xff0c;人们开始为庆祝万圣节做各种各样的准备。而对于跨境电商来说&#xff0c;这个节日也是一个独特的商机&#xff0c;能够在全球市场上推广各种各样的节日相关商品。Adobe Digital …...

修炼k8s+flink+hdfs+dlink(五:安装dockers,cri-docker,harbor仓库,k8s)

一&#xff1a;安装docker。&#xff08;所有服务器都要安装&#xff09; 安装必要的一些系统工具 sudo yum install -y yum-utils device-mapper-persistent-data lvm2添加软件源信息 sudo yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/cent…...

从实时数据库转战时序数据库,他陪伴 TDengine 从 1.0 走到 3.0

关于采访嘉宾 在关胜亮的学生时代&#xff0c;“神童”这个称号如影随形&#xff0c;很多人初听时会觉得这个称谓略显夸张&#xff0c;有些人还会认为这是不是就是一种调侃&#xff0c;但是如果你听说过他的经历&#xff0c;就会理解这一称号的意义所在了。 受到教师母亲的影…...

颠覆传统有线通讯,虹科IO-Link wireless解决方案让智能机床的旋转部件实现可靠低延迟无线通信

作为新工业革命的一部分&#xff0c;传统机床正迅速发展成为智能机床。在工业4.0技术的推动下&#xff0c;新的创新应用使机床的效率和功能达到了更高的水平。要实现这些功能&#xff0c;需要在机床上集成传感器和执行器&#xff0c;以提供实时数据和自动化控制。然而&#xff…...

链表 oj2 (7.31)

206. 反转链表 - 力扣&#xff08;LeetCode&#xff09; 我们通过头插来实现 将链表上的节点取下来&#xff08;取的时候需要记录下一个节点&#xff09;&#xff0c;形成新的链表&#xff0c;对新的链表进行头插。 /*** Definition for singly-linked list.* struct ListNode…...

python案例:六大主流小说平台小说下载

嗨喽~大家好呀&#xff0c;这里是魔王呐 ❤ ~! python更多源码/资料/解答/教程等 点击此处跳转文末名片免费获取 很多小伙伴学习Python的初衷就是为了爬取小说&#xff0c;方便又快捷~ 辣么今天咱们来分享6个主流小说平台的爬取教程~ 一、流程步骤 流程基本都差不多&#x…...

前端已死!转行网络安全,挖漏洞真香!

最近&#xff0c;一个做运维的朋友在学渗透测试。他说&#xff0c;他公司请别人做渗透测试的费用是 2w/人天&#xff0c;一共2周。2周 10w 的收入&#xff0c;好香~ 于是&#xff0c;我也对渗透测试产生了兴趣。开始了探索之路~ 什么是渗透测试 渗透测试这名字听起来有一种敬畏…...

【AI】了解人工智能、机器学习、神经网络、深度学习

深度学习、神经网络的原理是什么&#xff1f; 深度学习和神经网络都是基于对人脑神经系统的模拟。下面将分别解释深度学习和神经网络的原理。深度学习的原理&#xff1a;深度学习是一种特殊的机器学习&#xff0c;其模型结构更为复杂&#xff0c;通常包括很多隐藏层。它依赖于神…...

【Axure高保真原型】3D柱状图_中继器版

今天和大家分享3D柱状图_中继器版的原型模板&#xff0c;图表在中继器表格里填写具体的数据&#xff0c;调整坐标系后&#xff0c;就可以根据表格数据自动生成对应高度的柱状图&#xff0c;鼠标移入时&#xff0c;可以查看对应圆柱体的数据……具体效果可以打开下方原型地址体验…...

【word技巧】word页眉,如何禁止他人修改?

我们设置了页眉内容之后&#xff0c;不想其他人修改自己的页眉内容&#xff0c;我们可以设置加密的&#xff0c;设置方法如下&#xff1a; 先将页眉设置好&#xff0c;退出页眉设置之后&#xff0c;我们选择布局功能&#xff0c;点击分隔符 – 连续 设置完之后页面分为上下两节…...

Python 机器学习入门之逻辑回归

系列文章目录 第一章 Python 机器学习入门之线性回归 第一章 Python 机器学习入门之梯度下降法 第一章 Python 机器学习入门之牛顿法 第二章 Python 机器学习入门之逻辑回归 逻辑回归 系列文章目录前言一、逻辑回归简介二、逻辑回归推导1、问题2、Sigmoid函数3、目标函数3.1 让…...

现货白银赚钱有风险吗?

跟现货黄金一样&#xff0c;现货白银市场是一个公平公正的市场&#xff0c;即使是中小投资者&#xff0c;也能拥有平等的获利机会&#xff0c;同样可以借助平台所给予的资金杠杆&#xff0c;实现个人财富的快速增值。 很多人都是冲着现货白银的财富效应而进入这个市场&#xff…...

Debian衍生桌面项目SpiralLinux12.231001发布

SpiralLinux 是一个从 Debian 衍生出来的桌面项目&#xff0c;其重点是在所有主要桌面环境中实现简洁性和开箱即用的可用性。 spiral Linux 是为刚接触 Linux 世界的人们量身定制的发行版。这是 GeckoLinux 开发人员的创意&#xff0c;他更喜欢保持匿名。尽管他不愿透露姓名&a…...

未来机器人的大脑:如何用神经网络模拟器实现更智能的决策?

编辑&#xff1a;陈萍萍的公主一点人工一点智能 未来机器人的大脑&#xff1a;如何用神经网络模拟器实现更智能的决策&#xff1f;RWM通过双自回归机制有效解决了复合误差、部分可观测性和随机动力学等关键挑战&#xff0c;在不依赖领域特定归纳偏见的条件下实现了卓越的预测准…...

Java 语言特性(面试系列2)

一、SQL 基础 1. 复杂查询 &#xff08;1&#xff09;连接查询&#xff08;JOIN&#xff09; 内连接&#xff08;INNER JOIN&#xff09;&#xff1a;返回两表匹配的记录。 SELECT e.name, d.dept_name FROM employees e INNER JOIN departments d ON e.dept_id d.dept_id; 左…...

STM32标准库-DMA直接存储器存取

文章目录 一、DMA1.1简介1.2存储器映像1.3DMA框图1.4DMA基本结构1.5DMA请求1.6数据宽度与对齐1.7数据转运DMA1.8ADC扫描模式DMA 二、数据转运DMA2.1接线图2.2代码2.3相关API 一、DMA 1.1简介 DMA&#xff08;Direct Memory Access&#xff09;直接存储器存取 DMA可以提供外设…...

最新SpringBoot+SpringCloud+Nacos微服务框架分享

文章目录 前言一、服务规划二、架构核心1.cloud的pom2.gateway的异常handler3.gateway的filter4、admin的pom5、admin的登录核心 三、code-helper分享总结 前言 最近有个活蛮赶的&#xff0c;根据Excel列的需求预估的工时直接打骨折&#xff0c;不要问我为什么&#xff0c;主要…...

linux 下常用变更-8

1、删除普通用户 查询用户初始UID和GIDls -l /home/ ###家目录中查看UID cat /etc/group ###此文件查看GID删除用户1.编辑文件 /etc/passwd 找到对应的行&#xff0c;YW343:x:0:0::/home/YW343:/bin/bash 2.将标红的位置修改为用户对应初始UID和GID&#xff1a; YW3…...

vue3 定时器-定义全局方法 vue+ts

1.创建ts文件 路径&#xff1a;src/utils/timer.ts 完整代码&#xff1a; import { onUnmounted } from vuetype TimerCallback (...args: any[]) > voidexport function useGlobalTimer() {const timers: Map<number, NodeJS.Timeout> new Map()// 创建定时器con…...

全面解析各类VPN技术:GRE、IPsec、L2TP、SSL与MPLS VPN对比

目录 引言 VPN技术概述 GRE VPN 3.1 GRE封装结构 3.2 GRE的应用场景 GRE over IPsec 4.1 GRE over IPsec封装结构 4.2 为什么使用GRE over IPsec&#xff1f; IPsec VPN 5.1 IPsec传输模式&#xff08;Transport Mode&#xff09; 5.2 IPsec隧道模式&#xff08;Tunne…...

力扣-35.搜索插入位置

题目描述 给定一个排序数组和一个目标值&#xff0c;在数组中找到目标值&#xff0c;并返回其索引。如果目标值不存在于数组中&#xff0c;返回它将会被按顺序插入的位置。 请必须使用时间复杂度为 O(log n) 的算法。 class Solution {public int searchInsert(int[] nums, …...

【C++】纯虚函数类外可以写实现吗?

1. 答案 先说答案&#xff0c;可以。 2.代码测试 .h头文件 #include <iostream> #include <string>// 抽象基类 class AbstractBase { public:AbstractBase() default;virtual ~AbstractBase() default; // 默认析构函数public:virtual int PureVirtualFunct…...

全面解析数据库:从基础概念到前沿应用​

在数字化时代&#xff0c;数据已成为企业和社会发展的核心资产&#xff0c;而数据库作为存储、管理和处理数据的关键工具&#xff0c;在各个领域发挥着举足轻重的作用。从电商平台的商品信息管理&#xff0c;到社交网络的用户数据存储&#xff0c;再到金融行业的交易记录处理&a…...