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 ...
随机推荐
- Python的序列数据和变量
本篇内容涉及字符串.列表.元组.Python中的报错,以及变量本质,包括引用计数技术 该篇只为抛砖引玉,其内容来自Python学习中总结,另外感谢李老师的教导和Python班同学们的帮助 附上李老师和 ...
- 超详细的阿里字节Spring面试技术点总结(建议收藏)
前言 Spring作为现在最流行Java开发技术,其内部源码设计非常优秀. Spring这个词对于Java开发者想必不会陌生,可能你每天都在使用Spring,享受着Spring生态提供的服务.现在很多 ...
- AWS 学习笔记之 VPC
原文:https://ericfu.me/aws-notes-vpc/ VPC 把 VPC 想象成一个逻辑上的数据中心 包含一个 IGW (Internet Gateway)或者 Virtual Pr ...
- openstack-neutron-OVS agent分析
参考链接: https://blog.csdn.net/sld880311/article/details/77978369 https://github.com/jffree/neutron-cod ...
- Linux系统修改服务器系统时间
修改Linux系统时间,需要执行两个命令,如下: 第一条指令:date –s '2017-07-12 10:22:30' 第二条指令:clock –w //将日期写入CMOS
- 算法-利用队列实现逐行打印杨辉三角形的前n行
分别打印二项式(a+b)^n展开项的系数,在程序中利用了一个队列,在输出上一行系数时,将下一行的系数预先放入队列中.在各行系数间插入0. void YANGVI(int n){ Queue q(n+) ...
- Reinforcement Learning, Fast and Slow
郑重声明:原文参见标题,如有侵权,请联系作者,将会撤销发布! 1 DeepMind, London, UK2 University College London, London, UK3 Prince ...
- arduino智能循迹小车代码(三个循迹模块)
#include <Servo.h>int leftMotor1 = 3;int leftMotor2 = 5;int rightMotor1 = 6;int rightMotor2 = ...
- flutter 设置状态栏的背景与颜色
flutter 设置状态栏的背景与颜色 导包 import 'dart:io'; import 'package:flutter/services.dart'; 在main()函数中添加以下函数, v ...
- Spring Validation-用注解代替代码参数校验
Spring Validation 概念 在原先的编码中,我们如果要验证前端传递的参数,一般是在接受到传递过来的参数后,手动在代码中做 if-else 判断,这种编码方式会带来大量冗余代码,十分的不优 ...