Qt 展示pdf内容(新窗口或嵌入,pdfjs,linux)
前言:初学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)的更多相关文章
- vue 中展示PDF内容
vue 中展示PDF内容 不久前有个需要改的需求,以前是直接根据链接让用户下载对应pdf文件来查看,最主要是给用户查看,然而这种并不是很安全的,其他用户可以进行下载或者使用pdf链接分享给其他人,所以 ...
- 网页中动态嵌入PDF文件/在线预览PDF内容https://www.cnblogs.com/xgyy/p/6119459.html
#网页中动态嵌入PDF文件/在线预览PDF内容# 摘要:在web开发时我们有时会需要在线预览PDF内容,在线嵌入pdf文件: 问题1:如何网页中嵌入PDF: 在网页中: 常用的几种PDF预览代码片段如 ...
- #网页中动态嵌入PDF文件/在线预览PDF内容#
摘要:在web开发时我们有时会需要在线预览PDF内容,在线嵌入pdf文件: 问题1:如何网页中嵌入PDF: 在网页中: 常用的几种PDF预览代码片段如下: 代码片段1: 1 <object ty ...
- FlexPaper:使用flash在线展示pdf
WFTools工具包中的PDF2SWF工具可用来将PDF格式文件转换成SWF格式.使用下面的命令可以将pdf文件转换为单页swf文件. pdf2swf pdfPath –o swfPath –T ...
- Google AdSense怎么在新窗口打开
Google AdSense早在十年前就支持在新窗口打开了,为什么我的AdSense广告还在当前页面打开? 德顺查了一下,发现最早在2007年就有网站记载,谷歌AdSense开始试验新窗口打开功能. ...
- Qt笔记——2.编写多窗口程序
所学教程网址:http://www.qter.org/portal.php?mod=view&aid=27&page=2 设置按钮文字 MainWindow::MainWindow(Q ...
- 如何用CSS实现在新窗口打开链接?
*如何用CSS实现在新窗口打开链接? <style type="text/css"> <!-- .target2 a:active {test:expressio ...
- SharePoint文档库,如何在新窗口打开中的文件
默认情况下,点击文档库中的文件是在当前浏览器中打开的(如果你设置的是在客户端软件打开,则不符合本文情况).那么如果让他在新窗口中打开呢? 这里需要借助jQuery,关于如何将jQuery集成到Shar ...
- QT添加程序图标及窗口图标
程序图标 材料准备 图标文件:*.ico文件,存放在源文件同一目录下,如"myapp.ico" 写入图标 向*.pro文件中,独立一行写入"RC_ICONS = *.ic ...
随机推荐
- PC,移动端H5实现实现小球加入购物车效果
HTML部分: <!DOCTYPE html> <html> <head> <meta http-equiv="content-type" ...
- HTTP基础 --响应
响应,由服务端返回给客户端,分为三部分:响应状态码(Response Status Code),响应头(Response Headers)和响应体(Response Body). 响应状态码 响应服务 ...
- Webfunny知识分享:webpack sourceMap解析源码
前端的业务越来越庞大,导致我们需要引入的js等静态资源文件的体积也越来越大,不得不使用压缩js文件的方式来提高加载的效率. 编译工具的诞生,极大地方便了我们处理js文件的这一过程,但压缩后的js文件极 ...
- 重拾Java Web应用的基础体系结构
目录 一.背景 二.Web应用 2.1 HTML 2.2 HTTP 2.3 URL 2.4 Servlet 2.4.1 编写第一个Servlet程序 2.5 JSP 2.6 容器 2.7 URL映射到 ...
- C#.WinForm 拖动文件到PictrueBox(支持跨UAC拖动)
如程序以普通方式打开,那么DragDrop DragEnter 事件是可以正常使用的.但以管理员身份运行时,这两个方法将失效. 原因是 Windows机制(用户界面特权隔离). UIPI:用户界面特权 ...
- Linux两台服务器mysql数据库同步
我们在做web系统部署的时候往往涉及到两台甚至多台数据库的备份,为了数据安全考虑(虽然说到底不过是一堆0 1,但是价值千金啊),所以我们还是乖乖做同步把! 1.准备两台Linux服务器(主.从) 2. ...
- 模型层中QuerySet的学习
创建对象 使用关键字参数实例化模型实例来创建一个对象,然后调用save()把它保存到数据库中 pub_obj = models.Publisher(title='奥利给出版社') pub_obj.sa ...
- URL与视图函数的映射
今天跟大家讲的是URL与视图函数的映射 URL与视图函数的映射 url与视图函数的映射是通过@app.route()装饰器实现的. 1.只有一个斜杠代表的是根目录——首页. # coding: utf ...
- 牛哄哄的celery
一.什么是Celery 1.1.celery是什么 Celery是一个简单.灵活且可靠的,处理大量消息的分布式系统,专注于实时处理的异步任务队列,同时也支持任务调度. Celery的架构由三部分组成, ...
- 虚拟机VmWare打开报错,错误提示:VMware Authorization Service is not running!
作者:程序员小冰,CSDN博客:http://blog.csdn.net/qq_21376985 QQ986945193 微博:http://weibo.com/mcxiaobing 说明:打开我的虚 ...