关于Qt的Pdf模块-依赖Chromium的pdfium

共 2619字,需浏览 6分钟

 ·

2020-10-05 11:59


目前Qt的pdf模块还在预览阶段,很久之前就听说了Qt封装了chrome里的pdfium模块,一直想尝试下。恰好自己的电脑重新装了个Ubuntu20.04.这次准备自己编译下。

编译环境的配置

首先本地编译好Qt5.15。

具体Ubuntu如何编译Qt5.15源码可以参考这个

https://www.cryfeifei.top/2020/06/28/qt-compile-linux/

由于我们要自己编译QtWebEngine QtPdf模块,都是一套源码,所以建议自己编译下

其实官方文档都有 https://wiki.qt.io/QtWebEngine/How_to_Try

我这里上下我的编译环境脚本吧。

sudo apt-get install bison build-essential gperf flex ruby python libasound2-dev libbz2-dev libcap-dev \
libcups2-dev libdrm-dev libegl1-mesa-dev libgcrypt11-dev libnss3-dev libpci-dev libpulse-dev libudev-dev \
libxtst-dev gyp ninja-build


sudo apt-get install libssl-dev libxcursor-dev libxcomposite-dev libxdamage-dev libxrandr-dev \
libfontconfig1-dev libxss-dev libsrtp0-dev libwebp-dev libjsoncpp-dev libopus-dev libminizip-dev \
libavutil-dev libavformat-dev libavcodec-dev libevent-dev libvpx-dev libsnappy-dev libre2-dev libprotobuf-dev protobuf-compiler

由于我们自己下载的源码,所以官方文档中建议的git相关的操作全都不需要了

直接新建一个目录,使用我们自己编译好的qmake

mkdir build_webengine
cd build_webengine
/media/zhangpf/work1/Qt5.15/build/bin/qmake /media/zhangpf/work1/Qt5.15/qt-everywhere-src-5.15.1/qtwebengine/qtwebengine.pro

注意点:

  • qmake一定要使用绝对路径。
  • qmake成功后一定要仔细看configure的提示信息,看pdf模块跟webengine模块是否弄好
  • 要多给电脑点swap空间

扩大swap空间

我这增加了64个G的swap空间。我本地16G物理内存+2G虚拟内存反正编译不过。回报错 一怒之下就....64G

mkdir /media/zhangpf/work1/swapfile
cd /media/zhangpf/work1/swapfile/
sudo dd if=/dev/zero of=swap bs=1G count=64
sudo mkswap -f swap
sudo swapon swap

在当前编译的终端加上64G。没必要开机就挂载。反正就编译这一次

编译

make -j7 //我本地8核
make install

install之后我们自己编译的qt就可以用webeinine了。

编译安装完成之后,可以新建一个项目,在pro文件中添加

QT       += core gui pdf

OK,kit识别pdf模块了

1.使用Qt官方的demo,发现打开,编译不过

然后我又自己重新组织了下工程,这下可以编译通过并使用了。已经上传到github

https://github.com/CryFeiFei/QtPdfTest

上个图

经过测试,发现多页渲染之类的太流畅了,比我原来使用poppler的效果好太多了。

而且,看源码,发现里面直接引用的pdfium的代码

//
//  W A R N I N G
//  -------------
//
// This file is not part of the Qt API.  It exists purely as an
// implementation detail.  This header file may change from version to
// version without notice, or even be removed.
//
// We mean it.
//

#include "qpdflinkmodel_p.h"
#include 

#include "third_party/pdfium/public/fpdfview.h"

#include 

QT_BEGIN_NAMESPACE

class QPdfLinkModelPrivate: public QAbstractItemModelPrivate
{
    Q_DECLARE_PUBLIC(QPdfLinkModel)

这些api之类的还没有成为官方正式API,大家可以学习下。

吹一下

  • 不用再挂代理下工具链了,源码里都有了

  • 渲染真的快啊,真的快

  • 书签居然还提供了一个model类,这样都不用自己写了。QPdfBookmarkModel

  • 看类结构,目前widget跟qml是一起的,以后可以解耦。

  • 可以从这个源码学习一下Qt是如何封装第三方库的(这是Qt最擅长的

猜测

  1. qml跟qwidget应该会分开

  2. 以后这个模块估计会大规模重构(废话)

  3. pdfium应该会用cmake or qmake重新组织,但是pdfium依赖skia,估计以后会一起打包

  4. 不知道skia这个第三方库以后会不会嵌入到Qt里,作为Qt的一个新的paintengine来搞。(我倒是有想法,又立一个flag了


------------------------

长按下方二维码关注





浏览 5
点赞
评论
收藏
分享

手机扫一扫分享

分享
举报
评论
图片
表情
推荐
点赞
评论
收藏
分享

手机扫一扫分享

分享
举报