关于这个问题,网上搜一下,可以看到非常多的相关博客和例子,可以先看看这个总结性的博客(https://zhuanlan.zhihu.com/p/480973072)
该博客讲得比较清楚了,这里我再补充一下吧(qt官方也给出了一些答案 Handling PDF - Qt Wiki),根据调研对比,常见的几个库,个人认为如下:
- mupdf:用的比较多,官网 MuPDF: The ultimate library for managing PDF documents 这玩意用c语言写的,可以说加载解析速度非常快了,而且网上也有人提供了qt版封装接口,叫做 mupdf-qt。好像需要自己编译成库一下,依赖一些外部库,编译时候有点儿难度。网上下的例子用msvc也是可以直接编译过的(mingw直接编不过),但是加载pdf速度明显较pdfium太慢了(对比一个528页pdf)。
- proppler:官网也用得比较多,可以说是最多的了,也有第三方qt版接口,但是一些博客例子看来其清晰度以及加载速度以及编译难度都不太好(不会,这个库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的库,也是可以直接用的。看了一下这个例子(Qt5使用Poppler实现PDF阅读器_poppler qt 5 是一个用于 qt 的 pdf 渲染库。它可以用来在 qt 应用程序中显示 -CSDN博客),mingw可以直接编译运行,发现渲染速度极其的快,比qpdfium还要快,而且它的库qt形式封装得最全,搜索函数这些都给封装上了的。因为proppler的官方对qt进行了封装的,所以完全有最好的封装实现了呀,跟那个qsci编辑器库一样的,网上能搜到巨多的博客,所以放心用吧官方文档非常给力:Poppler Qt5: The Poppler Qt5 interface library
- pdfium:来自于福昕,Google与其合作最终进行了开源,加载速度以及功能都挺强大的,有个第三方qt封装库qpdfium用得也很多(这个和下面得qtpdf不是一套接口,这个仅仅封装了几个接口而已,有用的是text()函数(获取当前页的文本)仅此而已,但是如果希望实现更多功能例如选中、查找等将需要研究底层pdfium的实现了,还有书签等也没有实现,库太大了非常非常困难,而且作者自己也说了没实现这些功能,而且好几年前已经停止更新了,当然还有其它作者页进行了封装,总体还是就那样吧GitHub - CaSchmidt/csPDF: PDF rendering library based on Qt and PDFium.),资料和例子也很多。github搜索“qt pdf”前几名那个就是GitHub - paulovap/qtpdfium: Pdf Redening on Qt,下载下来msvc直接可以编译,但是mingw编译无法通过,需要进行修改,首先将工程提供的那几个库gid32.lib等都换成mingw下的库,其次好几个文件修改加上语句#ifdef GetObject #undef GetObject #endif(具体看博客QtPdfium编译_qtpdf编译-CSDN博客)。
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博客。这里有几个注意一下:虽然qt5.14版本后带了该模块,但是是跟QWebengine放一块的,而且只能是msvc版qt才能用(高版本6.x几已经增强了该pdf功能,加了一些接口了更好用了),想mingw用的话,只能自己编译,看这个博客 https://blog.51cto.com/u_2194662/5256871 即可。
- qpdf:其实封装了
pdf.js
库,使用WebEngine
来执行JavaScript
进而加载文件,相当于嵌入一个浏览器,太重了,性能这些占用可能较大。实测运行卡顿,只支持msvc编译器(因为qwebengine只支持msvc)github搜索“qt pdf”前几名那个就是。
- podoFo:......等,以及还有很多其它的库 https://zhuanlan.zhihu.com/p/679640192
顺便说一下,https://github.com/develtar/qt-pdf-viewer-library 这个也是一个pdf打开库,介绍说是对上面qpdf用qml进行的封装,我试了一下流畅很多了,但是技术跨度太大,而且只能msvc编译成功(因为又是嵌入了WebEngine那一套,注意一个编译错误“非类模板弄为类模板”,修改:friend class Singleton;之前加入一句template <class T>即可
)。
总的来说,在qt上,应该还是高版本后(5.14以后吧),qt库自带的 qtpdf库用起来最简单方便好用,也能兼顾各种性能以及qt编码风格使用习惯什么的了 ,毕竟qt官方亲自封装的这个库(后面它们应该还会持续封装这个库的,因为接口和功能太多了,目前还封装实现得比较基础),他们也比较推荐这个,qt开发的话应该用起来是首选的吧。上面的qtpdf运行结果如下:
此外,上面的proppler-qt5库也是非常不错的,可以说是最不错的了,因为它qt形式封装得最好(连search这些都封装了),超过目前的qt第三方封装的qtpdfium库以及qt自家封装的qtpdf库了,值得用用。
看了网上这么多博客,以及自己下载的示例进行实践,发现都是将pdf页渲染为图片的形式显示,导致没法选中,以及查找等操作。要想实现的话,必须要能够支持编辑的一些更强大的库,但是这些库都非常复杂,所以要做这个功能,就要好好想想了 QT中PDF查找和高亮显示。当前qt pdf这块做得比较好的开源的是雨田哥的博客,没开源,大家也可以看看。