qt实现打开pdf(阅读器)功能用什么库比较合适

关于这个问题,网上搜一下,可以看到非常多的相关博客和例子,可以先看看这个总结性的博客(https://zhuanlan.zhihu.com/p/480973072)

该博客讲得比较清楚了,这里我再补充一下吧(qt官方也给出了一些答案 Handling PDF - Qt Wiki),根据调研对比,常见的几个库,个人认为如下:

  • mupdf:用的比较多,官网 MuPDF: The ultimate library for managing PDF documents 这玩意用c语言写的,可以说加载解析速度非常快了,而且网上也有人提供了qt版封装接口,叫做 mupdf-qt。好像需要自己编译成库一下,依赖一些外部库,编译时候有点儿难度。
  • proppler:官网也用得比较多,可以说是最多的了,也有第三方qt版接口,但是一些博客例子看来其清晰度以及加载速度以及编译难度都不太好,但是功能应该挺强的吧,api用起来也挺方便。实例 QT使用Poppler库来完成阅读PDF文件-CSDN博客, 十、Qt 操作PDF文件_qt pdf-CSDN博客。还有个xpdf库,proppler就是基于它的,xpdf而且好像可以直接编译后是一个成熟的demo阅读器了。好像是渲染为图片了,因此搜索等功能都无法实现,这样就不太好,例如Qt 使用Poppler实现pdf阅读器_qt使用poppler实现pdf-CSDN博客。这个Poppler Win32 download | SourceForge.net 是编译好的32位mingw的库,也是可以直接用的。
  • pdfium:来自于福昕,Google与其合作最终进行了开源,加载速度以及功能都挺强大的,有个第三方qt封装库qpdfium用得也很多,资料和例子也很多 qt 使用qtpdfium实现读取pdf文件_qt读取pdf-CSDN博客。
  • qtpdf:就是官方亲自对pdfium进行的封装,应该算是正统的qpdfium接口了,但是使用需要进行配置一下,【QT】 QT开发PDF阅读器_qt实现pdf阅读-CSDN博客,QT自带PDF库的使用_qpdfdocument-CSDN博客,QT自带PDF库使用方法_qtpdf-CSDN博客,Qt 中文文档 Qt5.15 PDF Class (从官网Qt 5.15 翻译)_qt中文文档-CSDN博客
  • qpdf:其实封装了 pdf.js库,使用 WebEngine来执行 JavaScript进而加载文件,相当于嵌入一个浏览器,太重了,性能这些占用可能较大。
  • podoFo:......等,以及还有很多其它的库 https://zhuanlan.zhihu.com/p/679640192

总的来说,在qt上,应该还是高版本后(5.14以后吧),qt库自带的 qtpdf库用起来最简单方便好用,也能兼顾各种性能以及qt编码风格使用习惯什么的了 ,毕竟qt官方亲自封装的这个库,他们也比较推荐这个,qt开发的话应该用起来是首选的吧。但是有个问题:只能用msvc2019及其以上qt版本以及编译器,这个就有点难受了,而自己想要mingw编译器的话,编译就很麻烦了。所以需要自己编译,这里有个人提供了详细信息,真的牛逼 https://blog.51cto.com/u_2194662/5256871,当然这里编译出来了各种形式的库了 QtPdfium_Build_Source: 基于Google pdfium 库,可编译和编译好的Qtpdfium 库,用于加载pdf文件进行预览

,那么我们想编译成mingw版本或者msvc版本都可以了(但是该工程是cmakelist的,如果用qmake,那么参考官方源码工程 https://github.com/qt-labs/qtpdf/tree/dev),真的太牛逼了,当然,也可以用qt官方方法 https://blog.51cto.com/u_2194662/5256871 进行编译,但是mingw应该会报错,所以需要前面这个老哥的修改方式,才能成功。结果如下:

此外,https://github.com/develtar/qt-pdf-viewer-library 这个好像是qt官方商业版搞的编译成的库?没仔细研究了。

值得推荐的开源例子:

  1. proppler实现的阅读器。但是该阅读器不能选中文本,这个比较难受了,印证了上面说的每一页都渲染为了图片了。Qt5使用Poppler实现PDF阅读器_poppler qt 5 是一个用于 qt 的 pdf 渲染库。它可以用来在 qt 应用程序中显示 -CSDN博客

 

看了网上这么多博客,以及自己下载的示例进行实践,发现都是将pdf页渲染为图片的形式显示,导致没法选中,以及查找等操作。要想实现的话,必须要能够支持编辑的一些更强大的库,但是这些库都非常复杂,所以要做这个功能,就要好好想想了  QT中PDF查找和高亮显示。

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

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

相关文章

数据库--基本概念--复习专用

文章目录 前言一、DBS系统构成1.数据库(DB):2.数据库管理系统(DBMS):3.数据库系统(DBS):4.数据库管理员(DBA)5.C/S vs B/S 二、DB的三级模式与关系数据模型的实例1.DB三级模式的优点、联系数据库的三级模式结构and数据独立性数据独立性 2.三大世界and 模…

信息系统项目管理师(项目立项管理)

项目建议书的主要内容包括项目的必要性、项目建设所必须的条件、项目的市场预测、产品方案或服务的市场预测项目评估的依据主要包括:项目建议书及其批准文件、项目可行性研究报告、报送组织的申请报告及主管部门的初审意见、项目关键建设条件和工程等的协议文件、必…

World of Warcraft T2.5

World of Warcraft T2.5 猎人和术士套装需要的材料,好多啊,废墟和神殿打材料 猎人: 术士:

python中类跟实例详解

主要分享一下自己在学习python中关于类和实例的基本概念以及用法,因为在写自动化测试用例的时候会使用类跟方法进行封装,使代码更加的简洁干净,以下是自己的一些学习心得 1.类跟实例的基础概念 类:是抽象的模板,比如动…

Clipboard.js

Clipboard.js 是一个现代的 JavaScript 库,用于在网页上实现复制文本到剪贴板的功能。它简化了复制操作的复杂性,特别是在需要用户一键复制文本或代码片段时非常有用。 如何使用 Clipboard.js? 使用 Clipboard.js 非常简单。你只需要在你的…

【C++题解】1721. 输出个位为5或者个位为8数

问题:1721. 输出个位为5或者个位为8数 类型:简单循环 题目描述: 请从小到大输出 1∼n 中所有个位为 5 或者个位为8 的所有的整数,每行 1 个。 比如,假设 n20,那么满足条件的数输出如下: 5 8 1…

理解MySQL核心技术:外键(Foreign Key)的设计与实现

在日常开发中,数据库是必不可少的部分,而MySQL作为最流行的关系型数据库之一,广泛应用于各类项目中。为了确保数据的完整性和一致性,外键(Foreign Key)无疑是一个重要的概念。在本篇文章中,我们…

Stream Lua Nginx Module 插件一键安装

文章目录 一、场景说明二、脚本职责三、参数说明四、操作示例五、注意事项 一、场景说明 本自动化脚本旨在为提高研发、测试、运维快速部署应用环境而编写。 脚本遵循拿来即用的原则快速完成 CentOS 系统各应用环境部署工作。 统一研发、测试、生产环境的部署模式、部署结构、…

昇思25天学习打卡营第10天|基于MindSpore的GPT2文本摘要

学AI还能赢奖品?每天30分钟,25天打通AI任督二脉 (qq.com) 基于MindSpore的GPT2文本摘要 %%capture captured_output # 实验环境已经预装了mindspore2.2.14,如需更换mindspore版本,可更改下面mindspore的版本号 !pip uninstall m…

.NET编程C#线程之旅:十种开启线程的方式以及各自使用场景和优缺点

概述 在C#的多线程世界里,开启线程就像是启动一场新的冒险。线程作为程序执行的并行使者,能够让我们的应用程序更加高效和响应迅速。本文将带领大家探索C#中开启线程的十种不同方式,每一种方式都有其独特的使用场景和优缺点,让我们…

如何在LabVIEW中使用FPGA模块

LabVIEW FPGA模块是NI公司推出的一款强大工具,它允许用户使用LabVIEW图形化编程环境来开发FPGA(现场可编程门阵列)应用程序。与传统的HDL(硬件描述语言)编程相比,LabVIEW FPGA模块大大简化了FPGA开发的过程…

【代码随想录算法训练Day51】LeetCode 647. 回文子串、LeetCode 516.最长回文子串

Day51 动态规划第十二天 LeetCode 647. 回文子串 dp数组的含义:i到j的子串是否是回文的,是的话dp[i][j]1 递推公式:if(s[i]s[j]) i j 一个元素 是回文的 |i-j|1 两个元素 是回文的 j-i>1 判断dp[i1][j-1] 初始化:全部初始化成…

Java面试题:分享一个你遇到的技术难题,以及你是如何解决的

技术难题描述 在一个大型电子商务项目中,我们遇到了一个严重的性能问题。项目涉及数百万条商品记录和复杂的搜索过滤需求。用户在搜索页面进行查询时,响应时间非常慢,导致用户体验极差。通过初步分析,我们发现数据库查询是主要的…

Spring Boot 源码分析五:Spring Boot AutoConfiguration 自动配置机制

1. 引言 在前几篇文章中,我们探讨了 SpringBoot 的启动流程及其扩展机制。在本篇文章中,我们将深入分析 SpringBoot 的自动配置(AutoConfiguration)机制,这是 SpringBoot 最具特色和强大的功能之一。 2. 自动配置概述…

Python 语法基础二

7.常用内置函数 执行这个命令可以查看所有内置函数和内置对象(两个下划线) >>>dir(__builtins__) [__class__, __contains__, __delattr__, __delitem__, __dir__, __doc__, __eq__, __format__, __ge__, __getattribute__, __getitem__, __gt…

使用Spring Boot创建自定义Starter

使用Spring Boot创建自定义Starter 大家好,我是免费搭建查券返利机器人省钱赚佣金就用微赚淘客系统3.0的小编,也是冬天不穿秋裤,天冷也要风度的程序猿!今天我们将探讨如何使用Spring Boot创建自定义Starter,来简化项目…

memcacheredis构建缓存服务器

Memcached&Redis构建缓存服务器 前言 许多Web应用都将数据保存到 RDBMS中,应用服务器从中读取数据并在浏览器中显示。但随着数据量的增大、访问的集中,就会出现RDBMS的负担加重、数据库响应恶化、 网站显示延迟等重大影响。Memcached/redis是高性能…

【LC刷题】DAY19:77 216 17

【LC刷题】DAY19:77 216 17 文章目录 【LC刷题】DAY19:77 216 1777. 组合 [link](https://leetcode.cn/problems/combinations/description/)216. 组合总和 III [link](https://leetcode.cn/problems/combination-sum-iii/submissions/542307400/)17. 电…

通过ChatGLM的简单例子体验大模型

【图书推荐】《从零开始大模型开发与微调:基于PyTorch与ChatGLM》_《从零开始大模型开发与微调:基于pytorch与chatglm》-CSDN博客 ChatGLM基于GLM架构,针对中文问答和对话进行了优化。经过约1TB标识符的中英双语训练,辅以监督微调、反馈自助…

python 模板匹配图片识别点击

import cv2 import pyautogui import numpy as np import timedef find_and_click(target_image_path, threshold0.8, retry_count3, retry_interval1):"""在屏幕上查找目标图片并点击,支持重试。Args:target_image_path (str): 目标图片路径。thres…