python 利用 PySide2&PyQt5实现 PDF 阅读器

2021-04-13 15:02:31 浏览数 (1)

很早之前想用 python 结合 PyQt5 实现一个 PDF 阅读工具,但是一直想不到如何预览PDF 文件的内容。

在网上搜索了很多答案,发现最多的就是 PyQt5 从零开始制作 PDF 阅读器 这边文章看内容也就是实现了一个界面外观,核心的预览效果并没有实现,后面就是引导关注公众号的。


今天突然想做一个文件管理器,主要用来预览PDF 文件的,带有目录,可以选择对应的文件打开查看。

比如有个课件,里面有好几个文件夹,每次打开 pdf 文件都需要打开查找,非常麻烦。


其实如果会网页编程,非常简单快速的实现这个效果。

点击一个文件就可以打开预览,利用的其实是把浏览器当成 pdf 阅读工具,利用网页维护了左侧的文件目录。

代码语言:javascript复制
<!DOCTYPE html>
<html>
 <head> 
  <meta charset="utf-8" /> 
  <title>课件管理</title> 
  <link rel="stylesheet" href="style.css" /> 
  <style type="text/css">
</style> 
 </head> 
 <body> 
  <div id="container"> 
   <ul id="sidebar" class="sidebar"> 
    <li id="list" class="close"><span>1.书籍</span>
     <ul>
      <li><a href="1.书籍/《线性代数及其应用》.pdf" target="main">《线性代数及其应用》.pdf</a></li>
      <li><a href="1.书籍/大话数据结构.pdf" target="main">大话数据结构.pdf</a></li>
      <li><a href="1.书籍/编码的奥秘.pdf" target="main">编码的奥秘.pdf</a></li>
     </ul></li>
    <li id="list" class="close"><span>2.数据结构</span>
     <ul>
      <li><a href="2.数据结构/列表元组字符串-切片.pdf" target="main">列表元组字符串-切片.pdf</a></li>
      <li><a href="2.数据结构/列表增删改查.pdf" target="main">列表增删改查.pdf</a></li>
      <li><a href="2.数据结构/字典创建与操作.pdf" target="main">字典创建与操作.pdf</a></li>
     </ul></li>
    <li id="list" class="close"><span>3.数据分析</span>
     <ul>
      <li><a href="3.数据分析/1.Numpy入门.pdf" target="main">1.Numpy入门.pdf</a></li>
      <li><a href="3.数据分析/2.Numpy数据存取.pdf" target="main">2.Numpy数据存取.pdf</a></li>
      <li><a href="3.数据分析/3.Numpy常用函数.pdf" target="main">3.Numpy常用函数.pdf</a></li>
     </ul></li> 
   </ul> 
  </div> 
  <div>
   <iframe id="result-preview" frameborder="0" name="main"></iframe>
  </div> 
  <script type="text/javascript"> 

var sidebar=document.getElementById("sidebar");
var lists=sidebar.querySelectorAll("#sidebar>li");
var spans=sidebar.querySelectorAll("#sidebar>li>span");
var uls=sidebar.querySelectorAll("#sidebar>li>ul");
spans.forEach(function (item,index) {
             item.addEventListener('click', function(event){
        lists[index].className=(lists[index].className=="open")?"close":"open";
        uls[index].style.display= (lists[index].className=="open")?"block":"none";
       }, false);
         })
</script>   
 </body>
</html>

如果有服务器就很好维护了,每次上传文件就可以了,服务器可以自动读取新加入的文件,更新网页内容。


不过就想用一个网页而已,怎样维护呢,也很简单,利用python 自动读取文件目录生成对应的 html 文件。

代码语言:javascript复制
import os

# 网页开头
head = """<!DOCTYPE html>
<!DOCTYPE html>
<html>
<head>
  <meta charset="utf-8" />
  <title>课件管理</title>
  <link rel="stylesheet" href="style.css"/>
  <style type="text/css">
</style>
</head>
<body>
<div id="container">
<ul id="sidebar" class="sidebar">
"""
# 网页结尾
foot = """
</ul>
</div> 
<div><iframe id="result-preview" frameborder="0" name="main"></iframe></div>
<script type="text/javascript"> 

var sidebar=document.getElementById("sidebar");
var lists=sidebar.querySelectorAll("#sidebar>li");
var spans=sidebar.querySelectorAll("#sidebar>li>span");
var uls=sidebar.querySelectorAll("#sidebar>li>ul");
spans.forEach(function (item,index) {
             item.addEventListener('click', function(event){
        lists[index].className=(lists[index].className=="open")?"close":"open";
        uls[index].style.display= (lists[index].className=="open")?"block":"none";
       }, false);
         })
</script>
</body>
</html>
"""
# 中间新增内容
content = []
files = os.listdir()
for file in files:
    if os.path.isdir(file):
        sections_name = f"<li id='list' class='close'><span>{file}</span>"
        content.append(sections_name)
        content.append("<ul>")
        sections = os.listdir(file)
        for section in sections:
            pdf_name = f"<li><a href='{file}/{section}' target='main'>{section}</a></li>"
            content.append(pdf_name)
        content.append("</ul>")
        content.append("</li>")

# 写入内容到网页中
with open("课件管理首页.html","w",encoding="utf-8") as f:
    f.write(head)
    for line in content:
        f.write(line)
    f.write(foot)

运行上面的文件,就可以自动读取目录生成网页文件,打开文件就可以访问了。


但是觉得这样还是挺 low 的,能不能利用 PySide2 做一个 UI界面呢,类似一个管理软件。

想了一下,实现目录什么都挺简单的,就是如何在UI界面预览PDF 难到我了,需要一个可以解析 pdf 的工具。整了好久没成功,突然想要 PySide2 内置了一个浏览器引擎, 可以打开网页,哪能不能利用UI界面打开之前的网页,实现一个类似的管理软件的。

PySide2 打开网页

代码语言:javascript复制
from PySide2.QtWidgets import *
from PySide2.QtCore import QUrl
from PySide2.QtWebEngineWidgets import QWebEngineView
import os

app = QApplication([])
browser = QWebEngineView()
# 打开百度页面
# browser.load(QUrl('http://www.baidu.com'))
# 打开本地文件
browser.load(QUrl.fromLocalFile(os.path.realpath("课件管理首页.html")))
browser.show()
app.exec_()

确实可以打开网页,不过发现打不开 pdf 文件。也没有报错,找了好久答案,最终找到一个觉得可行的方案,说是需要配置PySide2的浏览器插件,并且对PySide2也有要求,需要5.15以上的版本。

代码语言:javascript复制
settings = browser.settings()
settings.setAttribute(settings.PluginsEnabled, True)
settings.setAttribute(settings.PdfViewerEnabled, True)

总算可以打开了,可是滚动不了PDF 文件。

并且出现了报错。

找了好久,终于在一个老外的网站上看到了解释,

因为我是在网页里面使用了 iFrame ,其实就是网页里面嵌入网页,导致出现了跨域的问题,就是两个网页是不同的域名。

既然这样,那我就不用两个网页,单独用浏览器显示显示 pdf 文件,用UI 界面实现目录。

这样总算搞定了,找到了一些图标,看上去还不错。

如果再加上一个登录注册界面,加上一些上传,删除,或者连到服务器上,就可以变成一个课件管理系统了。

(全文完)


欢迎转载,转载请注明出处! 欢迎关注公众微信号:叶子陪你玩编程

0 人点赞