前言:初学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. java引用传递还是值传递?

    首先,不要纠结于 Pass By Value 和 Pass By Reference 的字面上的意义,否则很容易陷入所谓的“一切传引用其实本质上是传值”这种并不能解决问题无意义论战中.更何况,要想知道 ...

  2. 关于H标签 DL DT DD标签的一个小故事

    看了一篇关于SEO论坛的论文,大概故事内容是:一个专业的销售公司,里面SEO  技术多多,可就是销售网站的SEO的情况极为恼火.这天,老板又招到了一个SEO,直接聘为SEO主管全权负责网站的SEO,并 ...

  3. 解决SpringBoot jar包中的文件读取问题

    前言 SpringBoot微服务已成为业界主流,从开发到部署都非常省时省力,但是最近小明开发时遇到一个问题:在代码中读取资源文件(比如word文档.导出模版等),本地开发时可以正常读取 ,但是,当我们 ...

  4. Fiddler或Charles文件转换为Jmeter可执行脚本

    解决脚本录制问题,可以将Fiddler或Charles转换成对应的Jmeter脚本,实现部分内容的参数化配置,通过修改部分参数或参数化可以对http协议的接口进行自动化测试或简单的压力测试 GitHu ...

  5. go语言之抛出异常

    一: panic和recover 作用:panic 用来主动抛出错误: recover 用来捕获 panic 抛出的错误. 概述: ,引发panic有两种情况 )程序主动调用panic函数 )程序产生 ...

  6. 解决Oracle12cr2自创建用户无法登录的问题

    说明: 下面创建是创建CDB本地用户,不是PDB应用程序用户,如果是PDB应用程序创建语法会不一样.下面介绍创建CDB本地用户. 创建表空空间 CREATE TABLESPACE YH datafil ...

  7. sha1sum校验方法

    sha1sum校验方法,我们可以保存到一个文件中.还可以根据已经得到的hash来确认文件.MD5类似. [root@ffcs211 test_dir]# sha1sum New.EXE 3fe44e8 ...

  8. React.Fragment

    React 中一个常见模式是为一个组件返回多个元素.Fragments 可以让你聚合一个子元素列表,并且不在DOM中增加额外节点. Fragments 看起来像空的 JSX 标签: render() ...

  9. Color a Tree & 排列

    Color a Tree 题目链接 好不可做?可以尝试一下DP贪心网络流.DP 似乎没法做,网络流也不太行,所以试一下贪心. 考虑全局中最大权值的那个点,如果它没父亲,那么一定会先选它:否则,选完它父 ...

  10. ios Standard Framework和Umbrella Framework

    Standard Framework:标准库,通过引用对应的header文件而不是引用master header 文件来引用类(也可以通过引用Master Header file来引用需要使用的类), ...