前言:初学Qt,在网上查找了诸多资料,有什么poppler、mupdf啊巴拉巴拉的,结果一个比一个费劲,最后还是采用pdfjs较为方便高效,为方便相关问题搜索,写了一下内容。

需求描述:Qt应用中不支持pdf的展示(据说最新版本支持了),而我使用的Qt为5.9版本,无法支持pdf文件的展示(涉及本地文件)。

解决思路:网上的大部分方法是poppler、mupdf第三方库(转换图片展示),也有启动第三方应用的方式,但是操作较为复杂且不符合我的需求,后来偶然之下看到了pdf的相关内容,其办法为:将pdf嵌入到网页中(Qt5.9是不支持展示pdf的,但是却支持浏览器内容的展示),使用浏览器模式(QtWebEngineView)打开pdfjs页面,pdfjs会调用pdf文件将其内容展示出来,也是采用了第三方,但是相对来说较好。

解决(本操作是在Linux(centOS7)下操作):

1.下载pdfjs:网上有诸多教程,这里就不累述了。

  pdfjs官网下载:http://mozilla.github.io/pdf.js/getting_started/#download

  (这里有ES5版本,看情况需要哪个用哪个)

  下载好后解压即可使用(有三个文件内容,为了方便可以放在一个文件夹下,随后放在你工程的相应地方,这个地方你看着放,只是为了引用,没有啥影响,之后使用需要引用/打开三个文件中web文件下的viewer.html)

2.使用QtWebEngineView:这里需要使用浏览器展示功能,可以使用Qt自带的QtWebEngineView(QtWebEngineView不是核心库,需要引一下)

QtWebEngineView使用:https://www.jianshu.com/p/352da0c95f3c

  2.1引入QtWebEngineView:在需要展示pdf内容的.h头文件加入

    #include <QtWebEngineWidgets/QtWebEngineWidgets>

  2.2创建对象(java过来的可能说法不对):

    QWebEngineView *pdfInfo = new QWebEngineView();

  2.3打开pdf(在Linux系统下本地文件绝对路径需加file:///):pdfjs引用时后面带上"?file="加上需要打开的pdf即可(这里打开本地文件,打开网络文件也是一样应用):

    static const QString runPath = dirPath + "Run/";

    static const QString pdfjs = "file://"+runPath+"pdfjsES5/web/viewer.html";
    static const QString link = "?file=";
    QString file = "file://"+runPath+"doc/"+pdfName;
    pdfInfo->page()->load(QUrl::fromUserInput(pdfjs + link + file));

  这里runPath(dirPath为我的工程根路径,你就用你的(QCoreApplication::applicationDirPath()))为我的工程启动路径,我将pdfjs文件也放在启动路径下了(我这里打包pdfjs的文件夹名称为pdfjsES5),file为我本地的pdf绝对路径。之后使用先前创建的QWebEngineView对象加载这个本地pdfjs的html文件。

3.页面展示:页面嵌入式采用QGridLayout布局嵌入浏览器展示:

    ui->prPDF->addWidget(prInfo);

  这里prPDF为我界面设计采用的QGridLayout布局组件,这段代码是将之前创建的QWebEngineView对象嵌入到这个布局中。

注意:我采用的时嵌入式的方法,如果采用新窗口,直接将QWebEngineView对象exec()执行下就出来了。

运行截图:额  上传不了  一脸懵逼。

反正就是pdfjs那个viewer.html打开后嵌入pdf页面的样式。

备注:pdfjs上半部分是有各种操作的,可以选择性隐藏掉一定的操作,这里要注意这些操作删除后是会出错的,只能隐藏掉,有点前端基础就知道display:hide一下就可以解决了。

天地不仁,以万物为刍狗  ---萧鼎

Qt 展示pdf内容(新窗口或嵌入,pdfjs,linux)的更多相关文章

  1. vue 中展示PDF内容

    vue 中展示PDF内容 不久前有个需要改的需求,以前是直接根据链接让用户下载对应pdf文件来查看,最主要是给用户查看,然而这种并不是很安全的,其他用户可以进行下载或者使用pdf链接分享给其他人,所以 ...

  2. 网页中动态嵌入PDF文件/在线预览PDF内容https://www.cnblogs.com/xgyy/p/6119459.html

    #网页中动态嵌入PDF文件/在线预览PDF内容# 摘要:在web开发时我们有时会需要在线预览PDF内容,在线嵌入pdf文件: 问题1:如何网页中嵌入PDF: 在网页中: 常用的几种PDF预览代码片段如 ...

  3. #网页中动态嵌入PDF文件/在线预览PDF内容#

    摘要:在web开发时我们有时会需要在线预览PDF内容,在线嵌入pdf文件: 问题1:如何网页中嵌入PDF: 在网页中: 常用的几种PDF预览代码片段如下: 代码片段1: 1 <object ty ...

  4. FlexPaper:使用flash在线展示pdf

    WFTools工具包中的PDF2SWF工具可用来将PDF格式文件转换成SWF格式.使用下面的命令可以将pdf文件转换为单页swf文件. pdf2swf  pdfPath  –o swfPath  –T ...

  5. Google AdSense怎么在新窗口打开

    Google AdSense早在十年前就支持在新窗口打开了,为什么我的AdSense广告还在当前页面打开? 德顺查了一下,发现最早在2007年就有网站记载,谷歌AdSense开始试验新窗口打开功能. ...

  6. Qt笔记——2.编写多窗口程序

    所学教程网址:http://www.qter.org/portal.php?mod=view&aid=27&page=2 设置按钮文字 MainWindow::MainWindow(Q ...

  7. 如何用CSS实现在新窗口打开链接?

    *如何用CSS实现在新窗口打开链接? <style type="text/css"> <!-- .target2 a:active {test:expressio ...

  8. SharePoint文档库,如何在新窗口打开中的文件

    默认情况下,点击文档库中的文件是在当前浏览器中打开的(如果你设置的是在客户端软件打开,则不符合本文情况).那么如果让他在新窗口中打开呢? 这里需要借助jQuery,关于如何将jQuery集成到Shar ...

  9. QT添加程序图标及窗口图标

    程序图标 材料准备 图标文件:*.ico文件,存放在源文件同一目录下,如"myapp.ico" 写入图标 向*.pro文件中,独立一行写入"RC_ICONS = *.ic ...

随机推荐

  1. [PyTorch 学习笔记] 1.4 计算图与动态图机制

    本章代码:https://github.com/zhangxiann/PyTorch_Practice/blob/master/lesson1/computational_graph.py 计算图 深 ...

  2. Microsoft Remote Desktop 10.3.12 下载

    下载地址:https://mac.softpedia.com/

  3. 个人项目wc(C语言)

    github地址:https://github.com/nilonger/mycangku 一.项目要求 1.wc.exe 是一个常见的工具,它能统计文本文件的字符数.单词数和行数.这个项目要求写一个 ...

  4. ARM开发板挂载Ubuntu18.04主机的NFS共享文件夹

    环境 ubuntu主机环境:Window10 下装VMWare下装的 ubuntu18.04LTS x64 IP 192.168.10.119 Window10下配置192.168.10该网段 开发板 ...

  5. 6. 二十不惑,ObjectMapper使用也不再迷惑

    一滴水,用显微镜看,也是一个大世界.本文已被 https://www.yourbatman.cn 收录,里面一并有Spring技术栈.MyBatis.JVM.中间件等小而美的专栏供以免费学习.关注公众 ...

  6. YOLO v3算法介绍

    图片来自https://towardsdatascience.com/yolo-v3-object-detection-with-keras-461d2cfccef6 数据前处理 输入的图片维数:(4 ...

  7. spring cloud 路由

    Spring Cloud Feign:用于微服务之间,只映射内网ip Spring Cloud Gateway:用于服务端,对外开放的接口,对外统一访问gateway映射的ip 是这样吗? 但是这样权 ...

  8. 石子合并(区间dp典型例题)

    Description 有n堆石子排成一行,每次选择相邻的两堆石子,将其合并为一堆,记录该次合并的得分为两堆石子个数之和.已知每堆石子的石子个数,求当所有石子合并为一堆时,最小的总得分. Input ...

  9. webstorm编写vue、react 将大驼峰组件命名转换成短横杠命名

    大家好!我是木瓜太香,精通 webstorm 与常见前端技术的工程师,偶尔也在b站搞一些 webstorm 技巧教学,今天给大家带来的是大驼峰小驼峰快速转换短横杠命名或者下划线命名的方式. 开发中我们 ...

  10. Spring源码学习(六)-spring初始化回调方法源码学习

    1.spring官方指定了三种初始化回调方法 1.1.@PostConstruct.@PreDestory 1.2.实现 InitializingBean DisposableBean 接口 1.3. ...