前言:初学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. 【Go】单链表

    node.go // 链表节点 type Node struct { data interface{} next *Node } // 构造一个节点 func NewNode(data interfa ...

  2. Sqlalchemy 事件监听与初始化

    sqlalchemy不仅仅能自动创建数据库,更提供了其他更强大的功能,今天要介绍的就是sqlalchemy中的事件监听,并将其应用到数据库的初始化中. 需求:当插入设置password字段时,自动加密 ...

  3. 四则运算生成命令行程序 (Python)

    Github项目地址:Github Pages 结对项目成员:张鹏 3118004985 郑靓 3118004988 一.项目需求分析 二.功能实现 三.代码实现or功能说明 ★ GUI功能扩展说明 ...

  4. python编程中的并发------多进程multiprocessing

    任务例子:喝水.吃饭动作需要耗时1S 单任务:(耗时20s) for i in range(10): print('a正在喝水') time.sleep(1) print('a正在吃饭') time. ...

  5. 区块链入门到实战(30)之Solidity – 基础语法

    一个 Solidity 源文件可以包含任意数量的合约定义.import指令和pragma指令. 让我们从一个简单的 Solidity 源程序开始.下面是一个 Solidity 源文件的例子: prag ...

  6. Java面试题(反射篇+对象拷贝篇)

    反射 57.什么是反射? 反射主要是指程序可以访问.检测和修改它本身状态或行为的一种能力 Java反射: 在Java运行时环境中,对于任意一个类,能否知道这个类有哪些属性和方法?对于任意一个对象,能否 ...

  7. 焦大:SEO重思录(上)收录量和收录率的重新定位

    http://www.wocaoseo.com/thread-198-1-1.html 前一段焦大在seo前线就看到有人问为何我收录量很大但是流量很低呢?有时候几百万的收录量但是流量却只有1000不到 ...

  8. 模型层中QuerySet的学习

    创建对象 使用关键字参数实例化模型实例来创建一个对象,然后调用save()把它保存到数据库中 pub_obj = models.Publisher(title='奥利给出版社') pub_obj.sa ...

  9. WPF新手快速入门系列 3.MVVM

    [概要] 这一章主要讲述,讲述MVVM模式和用法. 如有学习过程中想交流学习.疑惑解答可以来此QQ群交流:580749909.(所有涉及到的源码都上传到了群文件里) 希望加群的人提问时尽量想清楚自己的 ...

  10. 【学习中】Unity插件之NGUI 完整视频教程

    课程 章节 内容 签到 Unity插件之NGUI 完整视频教程 第一章 NGUI基础控件和基础功能学习 1.NGUI介绍和插件的导入 6月29日 2.创建UIRoot 6月29日 3.学习Label控 ...