十、Qt 操作PDF文件

 《一、QT的前世今生》

《二、QT下载、安装及问题解决(windows系统)》
《三、Qt Creator使用》 ​​​

《四、Qt 的第一个demo-CSDN博客》

《五、带登录窗体的demo》

《六、新建窗体时,几种窗体的区别》 

《七、Qt 信号和槽》 
《八、Qt C++ 毕业设计》

《九、Qt C++ 数据库开发》

《十、Qt 操作PDF文件-CSDN博客》

一、下载Poppler开源库

使用Poppler第三方开源库,下载地址:Poppler,我下载的是最新版的poppler-24.01.0

poppler-24.01.0压缩包文件下载后需要自行编译,生成可用的类库。如果Poppler解析出来的PDF文件无法正常显示中文,需要将poppler-data-0.4.12包里的相关文件拷贝到指定目录下,才能正常显示中文。我的中文显示正常,所以我没有下载poppler-data-0.4.12包。

也可以下载从Poppler Win32 download | SourceForge.net 下载windows下直接可用的dll库,但是上边的poppler-24.01.0压缩包还是需要下载的,因为头文件在此包中。

二、搭建环境

在程序目录下新建poppler文件夹,我把公用的类库都放到了CommDEV文件夹下

将poppler-24.01.0压缩包中的 \qt5\src 文件夹下的所有文件拷贝到上边新建的poppler文件夹中。因为像poppler-qt5.h对应的是poppler-qt5.dll,在写程序时都要用到。

将poppler-0.39.0-win32包解压缩后的libpoppler.dll,libpoppler-qt5.dll和lib文件夹下的libpoppler.dll.a,libpoppler-qt5.dll.a

这4个dll拷贝到程序所在的目录下的poppler文件夹内。

以上步骤操作大家仔细看,别把文件放错了地方。

三、配置pro文件

以下标红的地方需要注意,我们是在windows系统下开发,没有用的咱们不选。

再按以上的步骤添加另一个dll

添加完的pro文件里多出了以下这些代码

表示添加成功。

四、开始写代码

引用头文件

#include "poppler-qt5.h"

编写代码

QString filename=QFileDialog::getOpenFileName(this,QString::fromUtf8("打开"),"","pdf file (*.pdf)");//获取pdf文件路径

if(filename.isEmpty()){

return;//如果文件路径为空则返回

}

Poppler::Document* document = Poppler::Document::load(filename);//加载pdf文件

if (!document || document->isLocked()) {

QMessageBox::information(this,"提示",QString::fromUtf8("无法打开文件:%1").arg(filename));//如果加载不成功,输出错误信息,并返回

delete document;

return;

}

//再次检查document是否可用

if (document == 0) {

// ui->label_message->setText(QString::fromUtf8("文件内无内容:%1").arg(filename));//不可用则输出错误信息,并返回

return;

}

//将PDF文档的每一页输出为QImage

// for(int pageNumber=0;pageNumbernumPages();pageNumber++){

//获取指定页码的页面,页码从0开始

Poppler::Page* pdfPage = document->page(0);

if (pdfPage == 0) {

qDebug()

return;

}

//将页面内容转换为QImage

QImage image = pdfPage->renderToImage();

// double xres=72.0, yres=72.0; int x=-1, y=-1, width=-1, height=-1;

// QImage image = pdfPage->renderToImage(xres, yres, x, y, width, height);

// if (image.isNull()) {

// qDebug()

// return;

// }

// 在QLabel中显示QImage

QLabel *label = new QLabel(this);

label->setPixmap(QPixmap::fromImage(image));

ui->horizontalLayout->addWidget(label);

//使用完后记得释放掉Poppler::Page* pdfPage

delete pdfPage;

// }

delete document;

如果在编译程序时出现错误,缺少poppler-export.h,可从以下连接下载

https://download.csdn.net/download/zhouhui1982/88747128

运行效果

目前只能显示第一页的pdf内容,在下一章节中,我们再来细化pdf的相关操作,比如滚动条,下一页,上一页按钮等。以前打包依赖库,支持可以单独运行的程序。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/629781.shtml

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

相关文章

考研英语打卡

[爱心]长难句分享第三十一天解析 [玫瑰]【词汇】:• astonishing [əˈstɑːnɪʃɪŋ] adj. 令人惊讶的• purchase [ˈpɜːrtʃəs] n. 购买• upmarket [ˌʌpˈmɑːrkɪt] adj. 高级的• grocery [ˈɡroʊsəri] n. 食品杂货店• chain [tʃeɪn] n. 连锁店…

【Linux驱动】Linux的中断系统 | 中断的重要数据结构

🐱作者:一只大喵咪1201 🐱专栏:《Linux驱动》 🔥格言:你只管努力,剩下的交给时间! 目录 🏀Linux系统的中断⚽中断分类软中断和硬中断中断的上半部和下半部 ⚽tasklet⚽工…

普冉32位单片机 PY32C642,M0+内核,1.7 V ~ 5.5 V宽工作电压

PY32C642 单片机采用高性能的 32 位 ARM Cortex-M0内核,宽电压工作范围。嵌入 24Kbytes Flash 和 3 Kbytes SRAM 存储器,最高工作频率 24 MHz。包含多种不同封装类型产品。工作温度范围为-40C ~ 85C,工作电压范围 1.7 V ~ 5.5 V。1 路 12 位A…

深度强化学习的变道策略:Harmonious Lane Changing via Deep Reinforcement Learning

偏理论,假设情况不易发生 摘要 多智能体强化学习的换道策略,不同的智能体在每一轮学习后交换策略,达到零和博弈。 和谐驾驶仅依赖于单个车辆有限的感知结果来平衡整体和个体效率,奖励机制结合个人效率和整体效率的和谐。 Ⅰ. 简…

在Excel中如何打开VBA,这里提供两种方法

想在Excel中创建或添加自己的自定义Visual Basic脚本吗?第一步是了解如何在Excel中打开VBA编辑器。 在易用性和整体功能方面,没有其他电子表格应用程序能与Excel相提并论。无论你想做什么,只要你能深入挖掘Excel的深层菜单,就有很…

正点原子imx6ull网络环境配置:开发板和电脑通过网线直连、电脑WiFi上网

1.硬件连接 开发板通过网线连接电脑。电脑连接wifi 2.VMware设置 2.1添加桥接模式和NAT模式 1)打开vm设置 2)设置网络适配器为桥接模式,不要勾选 “赋值物理网络连接状态” 3) 添加一个网络适配器并设置成NAT模式,…

阿里云服务器怎么样?阿里云服务器优势、价格及常见问题

阿里云服务器ECS英文全程Elastic Compute Service,云服务器ECS是一种安全可靠、弹性可伸缩的云计算服务,阿里云提供多种云服务器ECS实例规格,如ECS经济型e实例、通用算力型u1、ECS计算型c7、通用型g7、GPU实例等,阿里云服务器网al…

vue3.2二次封装antd vue 中的Table组件,原有参数属性不变

vue3.2中的<script setup>语法 在项目中多处使用到表格组件,所以进行了一个基础的封装,主要是通过antd vue 中表格的slots配置项,通过配合插槽来进行封装自定义表格; 这次主要的一个功能是编辑之后变成input框 修改了之后变成完成发送请求重新渲染表格&#xff1a; 子…

redis数据安全(二)数据持久化 RDB

目录 一、RDB快照持久化 原理 二、RDB快照持久化配置&#xff08;redis.conf&#xff09;&#xff1a; 三、触发RDB备份&#xff1a; 1、自动备份&#xff0c;需配置备份规则&#xff1a; 2、手动执行命令备份&#xff08;save | bgsave&#xff09;&#xff1a; 3、flus…

Unity Shader 的模板测试效果

模板测试是渲染管线中逐片元操作的一环&#xff0c;它的作用是筛选出指定模板的片元&#xff0c;而不符合模板的片元会被舍弃&#xff0c;从而做到一个遮罩的效果。 以下是Unity中实践的一个效果&#xff1a; 场景中可以看出&#xff0c;熊模型和茶壶模型都在差不多的位置&am…

用原型实现Class的各项语法

本人之前对Class一直不够重视。平时对原型的使用&#xff0c;也仅限于在构造函数的prototype上挂属性。原型尚且用不着&#xff0c;更何况你Class只是原型的一颗语法糖&#xff1f; 直到公司开始了一个webgis项目&#xff0c;使用openlayers。看了下openlayers的代码&#xff0…

头像空白问题

当用户没有设置头像时&#xff0c;我们可以使用用户名第一个字来当头像 主要涉及一个截取&#xff0c;截取字符串第一个字 变量名.charAt(0) 如果变量名为null或者undefine 那么就会报错 使用可选链操作符 &#xff1f; 当前面的值为nul或undefine时&#xff0c;就不会执行…

HTML--CSS--盒子模型

在CSS模型中&#xff0c;所有元素都可以看做是一个盒子&#xff0c;这个盒子的组成部分&#xff1a; content 内容&#xff0c;文本或者图片 padding 内边距&#xff0c;定义内容到边框的距离 margin 外边距&#xff0c;定义当前元素与其他元素之间的距离 border 边框&#xff…

第10章 通信业务

文章目录 10.1.1 通信行业1、通信行业的界定2、通信行业的特点 10.1.2 通信企业10.1.3 通信终端1、通信终端的分类2、终端发展趋势 10.2.1 通信业务的定义及分类10.2.2 基础电信业务1、第一类基础电信业务A11 固定通信业务A12 蜂窝移动通信业务A13 第一类卫星通信业务A14 第一类…

探索设计模式的魅力:简单工厂模式

简单工厂模式&#xff08;Simple Factory Pattern&#xff09;是一种创建型设计模式&#xff0c;其主要目的是用于创建对象的实例。这种模式通过封装创建对象的代码来降低客户代码与具体类之间的耦合度。简单工厂不是GoF&#xff08;四人帮&#xff09;设计模式之一&#xff0c…

Vue Mixin 代码重用与逻辑共享

✨ 专栏介绍 在当今Web开发领域中&#xff0c;构建交互性强、可复用且易于维护的用户界面是至关重要的。而Vue.js作为一款现代化且流行的JavaScript框架&#xff0c;正是为了满足这些需求而诞生。它采用了MVVM架构模式&#xff0c;并通过数据驱动和组件化的方式&#xff0c;使…

二次封装el-upload组件包含文件上传进度条、复制粘贴上传等的功能

功能 1. 支持图片上传进度条 2. 支持粘贴上传图片行为 3. 支持最大图片上传数量 4. 支持图片大小限制 5. 支持图片类型限制 6. 支持图片预览 具体实现 图片上传进度条 由于 :on-progress 钩子没触发&#xff0c;因此使用了 :on-change 钩子代替实现。进度条的值先用定时器递增…

免费电子书全集分享

分享一个在github免费电子书集合&#xff0c;如果想学编程的&#xff0c;可以收藏&#xff0c;项目地址&#xff1a;free-programming-books

行为型设计模式——中介者模式

中介者模式 中介者模式主要是将关联关系由一个中介者类统一管理维护&#xff0c;一般来说&#xff0c;同事类之间的关系是比较复杂的&#xff0c;多个同事类之间互相关联时&#xff0c;他们之间的关系会呈现为复杂的网状结构&#xff0c;这是一种过度耦合的架构&#xff0c;即…

ruoyi-vue国产化适配之东方通TongHttpServer

1.将安装包解压 tar -zxvf TongHttpServer_6.0.0.2_x86_64.tar.gz 2.THS 主程序需要 license 才能启动&#xff0c;将 license.dat 文件放在 THS 目录内 3.启动主程序 4. http://IP:8000/ 账号&#xff1a;admin 密码&#xff1a;ths#123.com 5.可以在配置文件--文件编辑…