python自制PDF转换.PNG格式图片(按每页生成图片完整源码)小工具!
使用PyQt5应用程序制作PDF转换成图片的小工具,可以导入PDF文档后一键生成对应的PNG图片。
PDF图片转换小工具使用的中间件:
python版本:3.6.8
UI应用版本:PyQt5
PDF文件操作非标准库:PyPDF2
PNG图片生成库:PyMuPDF
pip install PyQt5pip install PyPDF2pip install PyMuPDF==1.18.17
将需要使用到的python标准库或非标准库全部导入到我们的代码块中进入开发环节。
# Importing all the classes from the PyQt5.QtGui module.
from PyQt5.QtGui import *# Importing all the classes from the PyQt5.QtCore module.
from PyQt5.QtCore import *# Importing all the classes from the PyQt5.QtWidgets module.
from PyQt5.QtWidgets import *# Importing the `fitz` module.
import fitz# Importing the PyPDF2 module.
import PyPDF2# Importing the `sys` module.
import sys# Importing the os module.
import os# Importing the traceback module.
import traceback
接下来直接进入正题,首先创建名称为PdfToPngUI的python类,将UI组件及布局和相关的槽函数都写入到这个类中。
# This class is a widget that contains a button and a text box. When the button is clicked, the text box is populated with
# the path to the converted file
class PdfToPngUI(QWidget):def __init__(self):"""A constructor. It is called when an object is created from a class and it allows the class to initialize theattributes of a class."""super(PdfToPngUI, self).__init__()self.init_ui()def init_ui(self):"""This function initializes the UI."""self.setWindowTitle('PDF图片转换工具 公众号:Python 集中营')self.setWindowIcon(QIcon('analysis.ico'))self.resize(600, 400)self.source_pdf_path = QLineEdit()self.source_pdf_path.setPlaceholderText('PDF文件路径')self.source_pdf_path.setReadOnly(True)self.source_pdf_btn = QPushButton()self.source_pdf_btn.setText('导入')self.source_pdf_btn.clicked.connect(self.source_pdf_btn_click)self.target_png_path = QLineEdit()self.target_png_path.setPlaceholderText('目标图片存储路径')self.target_png_path.setReadOnly(True)self.target_png_btn = QPushButton()self.target_png_btn.setText('路径')self.target_png_btn.clicked.connect(self.target_png_btn_click)self.start_btn = QPushButton()self.start_btn.setText('PDF一键生成PNG图片')self.start_btn.clicked.connect(self.start_btn_click)self.brower = QTextBrowser()self.brower.setReadOnly(True)self.brower.setFont(QFont('宋体', 8))self.brower.setPlaceholderText('日志处理过程区域...')self.brower.ensureCursorVisible()grid = QGridLayout()grid.addWidget(self.source_pdf_path, 0, 0, 1, 2)grid.addWidget(self.source_pdf_btn, 0, 2, 1, 1)grid.addWidget(self.target_png_path, 1, 0, 1, 2)grid.addWidget(self.target_png_btn, 1, 2, 1, 1)grid.addWidget(self.start_btn, 2, 0, 1, 3)grid.addWidget(self.brower, 3, 0, 1, 3)self.pdf_thread = WorkThread(self)self.pdf_thread.message.connect(self.show_message)self.pdf_thread.finished.connect(self.finished)self.setLayout(grid)def show_message(self, text):"""It shows a message:param text: The text to be displayed"""cursor = self.brower.textCursor()cursor.movePosition(QTextCursor.End)self.brower.append(text)self.brower.setTextCursor(cursor)self.brower.ensureCursorVisible()def source_pdf_btn_click(self):"""It opens a file dialog box to select the source PDF file."""source_pdf_path = QFileDialog.getOpenFileName(self, "选取文件", os.getcwd(), "PDF File (*.pdf)")self.source_pdf_path.setText(source_pdf_path[0])def target_png_btn_click(self):"""A function that is called when the target_png_btn is clicked."""target_png_path = QFileDialog.getExistingDirectory(self, '选择文件夹', os.getcwd())self.target_png_path.setText(target_png_path)def start_btn_click(self):"""A function that is called when the start button is clicked."""self.pdf_thread.start()self.start_btn.setEnabled(False)def finished(self, finished):"""A function that is called when the target_png_btn is clicked"""if finished is True:self.start_btn.setEnabled(True)
通过上面的PdfToPngUI类处理,这个时候UI组件及布局和槽函数已经开发完成了,应用的页面效果如下。
然后,我们开始业务逻辑的开发。这里将业务逻辑使用单独的子线程开发避免和页面的主线程发生阻塞。
创建一个子线程的python类WorkThread并继承自QThread子线程,将PDF图片转换的过程写到里面。
# It's a QThread that runs a function in a separate thread
class WorkThread(QThread):message = pyqtSignal(str)finished = pyqtSignal(bool)def __init__(self, parent=None):"""A constructor that initializes the class.:param parent: The parent widget"""super(WorkThread, self).__init__(parent)self.working = Trueself.parent = parentdef __del__(self):"""A destructor. It is called when the object is destroyed."""self.working = Falsedef run(self):"""PDF转换图片的业务函数。"""try:source_pdf_path = self.parent.source_pdf_path.text().strip()target_png_path = self.parent.target_png_path.text().strip()if source_pdf_path == '' or target_png_path == '':self.message.emit('来源文件路径或目标存储路径不能为空!')self.finished.emit(True)returnself.message.emit('源文件路径:{}'.format(source_pdf_path))self.message.emit('目标文件路径:{}'.format(target_png_path))pdf_ = fitz.open(source_pdf_path)self.message.emit('成功打开PDF文件对象!')reader = PyPDF2.PdfFileReader(source_pdf_path)self.message.emit('PDF文件流处理完成!')page_num = reader.getNumPages()self.message.emit('PDF文件页数读取完成!')for n in range(0, page_num):page = pdf_.load_page(n)pix_ = page.get_pixmap()pix_.save(os.path.join(target_png_path, str(n) + '.png'))self.message.emit('图片保存成功:{}'.format(os.path.join(target_png_path, str(n) + '.png')))self.message.emit('PNG图片全部转换完成!')self.finished.emit(True)except:traceback.print_exc()self.message.emit('程序运行出现错误,请检查参数是否设置正确!')self.finished.emit(True)
经过上述的UI界面组件以及业务线程的开发,功能已经实现了,下面使用main函数调起整个应用就OK了。
if __name__ == '__main__':app = QApplication(sys.argv)main = PdfToPngUI()main.show()sys.exit(app.exec_())
往期精彩
假如有一个专属于python的终端工具,那绝对非他莫属!
如何解决python读取大数据量文件时造成的内存溢出?
python如何完成对 Excel文件的解密后读取?
相关文章:
python自制PDF转换.PNG格式图片(按每页生成图片完整源码)小工具!
使用PyQt5应用程序制作PDF转换成图片的小工具,可以导入PDF文档后一键生成对应的PNG图片。 PDF图片转换小工具使用的中间件: python版本:3.6.8 UI应用版本:PyQt5 PDF文件操作非标准库:PyPDF2 PNG图片生成库࿱…...
Go 数组和切片反思
切片的底层数据结构是数组,所以,切片是基于数组的上层封装,使用数组的场景,也完全可以使用切片。 类型比较 我看到 go 1.17 有对切片和数组转换的优化,禁不住纳闷,有什么场景是必须数组来完成的呢&#x…...
win10电脑性能优化设置
win10电脑性能优化设置 目录win10电脑性能优化设置1.桌面图标显示2.wini2.1 “系统”2.1.1专注助手 关2.1.2 电源和睡眠 设置为从不2.1.3 存储 开2.2 网络和Internet2.3 个性化2.4 应用2.5 账户2.6 游戏2.7 隐私墨迹书写和键入个性化:关活动历史记录:全部…...
作为初学者必须要了解的几种常用数据库!
现在已经存在了很多优秀的商业数据库,如甲骨文(Oracle)公司的 Oracle 数据库、IBM 公司的 DB2 数据库、微软公司的 SQL Server 数据库和 Access 数据库。同时,还有很多优秀的开源数据库,如 MySQL 数据库,Po…...
小红书日常实习一面面经
时间:2月13下午 平台:赛码网,视频面大概70分钟顺序大致是下面,讲到哪问到哪,基础知识最好要结合项目或者实际回答,没录音不完全,有错误请指正首先面试官人超级好,细心提问,耐心解答问…...
将Nginx 核心知识点扒了个底朝天(一)
什么是Nginx? Nginx是一个 轻量级/高性能的反向代理Web服务器,用于 HTTP、HTTPS、SMTP、POP3 和 IMAP 协议。他实现非常高效的反向代理、负载平衡,他可以处理2-3万并发连接数,官方监测能支持5万并发,现在中国使用ngin…...
SSM项目搭建保姆级教程
文章目录1、什么是SSM框架1.1、持久层1.2、业务层1.3、表现层1.4、View层1.5、SpringMVC执行流程1.6、MyBatis2、SSM实战搭建2.1、创建工程2.2、添加依赖2.3、配置spring.xml文件2.4、配置web.xml文件2.5、log4j.properties2.6、准备表2.7、实体类2.8、mapper2.9、service2.10、…...
LeetCode 350. 两个数组的交集 II
原题链接 难度:easy\color{Green}{easy}easy 题目描述 给你两个整数数组 nums1nums1nums1 和 nums2nums2nums2 ,请你以数组形式返回两数组的交集。返回结果中每个元素出现的次数,应与元素在两个数组中都出现的次数一致(如果出现…...
Python可以解码吗,解码打码是如何实现的
前言 咳咳,进来的铁汁都是抱着学习的心态进来看的吧,咱今天不讲解解码,咱来说说python如何来实现打码功能~ 这一个个进来的 都是标题党吧哈哈哈 有兴趣的可以继续看看哦 最近重温了一档综艺节目 至于叫什么 这里就不细说了 老是看着看着就…...
Jackson 序列化:Cannot deserialize value of type `java.time.LocalDateTime`
问题描述 使用 jackson 反序列化异常如下: Caused by: com.fasterxml.jackson.databind.exc.InvalidFormatException: Cannot deserialize value of type java.time.LocalDateTime from String “2023-02-13 19:43:01”: Failed to deserialize java.time.LocalDat…...
机试_3_数据结构(一)_习题
数据结构(一)——练习题 学习完第三章-数据结构(一)之后,当然要做相应地练习啦~ 注:上述习题都可以在牛客进行测试。 例如,第2题链接:计算表达式_牛客题霸_牛客网 (nowcoder.com)…...
《Hadoop篇》------HDFS与MapReduce
目录 一、HDFS角色职责总结 二、CheckPoint机制 三、Mapreduce序列化 四、Mapper 4.1、官方介绍 4.2、Split计算 4.3、Split和block对应关系 4.4、启发式算法 五、MapTask整体的流程 六、压缩算法 6.1、压缩算法适用场景 6.2、压缩算法选择 6.2.1、Gzip压缩 6.2…...
网络爬虫简介
前言 没什么可以讲的所以就介绍爬虫吧 介绍 网络爬虫(英语:web crawler),也叫网路蜘蛛(spider),是一种用来自动浏览万维网的网络机器人。其目的一般为编纂网络索引。 网路搜索引擎等站点通过…...
通过4个月的自动化学习,现在我也拿到了25K的offer
毕业后的5年,是拉开职场差距的关键时期。有人通过这5年的努力,实现了大厂高薪,有人在这5年里得到贵人的赏识,实现了职级的快速拔升,还有人在这5年里逐渐掉队,成了职场里隐身一族,归于静默。 而…...
分库分表了解
数据切分根据其切分类型,可以分为两种方式:垂直(纵向)切分和水平(横向)切分一:垂直(纵向)切分【基于表或字段划分,表结构不同】1:垂直分库根据业务…...
docker中 gitlab 安装、配置和初始化
小笔记:gitlab配置文件 /etc/gitlab/gitlab.rb 配置项jcLee95 的CSDN博客:https://blog.csdn.net/qq_28550263?spm1001.2101.3001.5343 邮箱 :291148484163.com 本文地址:https://blog.csdn.net/qq_28550263/article/details/1…...
有哪些好用的C++Json库?
文章目录RapidJSONJSON for Modern CBoost.PropertyTreeJanssonPicoJSONC REST SDKnlohmann json(ky用的这个)jsoncpp(cw用的这个)RapidJSON RapidJSON是一个快速、高效的C JSON解析器和生成器,支持SAX和DOM两种解析模…...
Docker 快速上手学习入门教程
目录 1、docker 的基础概念 2、怎样打包和运行一个应用程序? 3、如何对 docker 中的应用程序进行修改? 4、如何对创建的镜像进行共享? 5、如何使用 volumes 名称对容器中的数据进行存储?// 数据挂载 6、另一种挂载方式&…...
深度学习笔记:误差反向传播(1)
1 计算图 计算图使用图(由节点和边构成的图)来表达算式。 如图,我们用节点代表运算符号,用边代表传入的参数,即可算出购买苹果和橘子的总价格。 2 计算图的局部计算 局部计算意味着每个节点只处理和其相关的运算&…...
锁相环(1)
PLL代表相位锁定环。顾名思义,如下图所示,PLL是一种具有反馈循环的电路,可将反馈信号的相/频率保持与参考输入信号的相/频率相同(锁定)。 如下图所示,如果参考输入和反馈输入之间存在相位差,则…...
2023金三银四跳槽必会Java核心知识点笔记整理
现在互联网大环境不好,互联网公司纷纷裁员并缩减 HC,更多程序员去竞争更少的就业岗位,整的 IT 行业越来越卷。身为 Java 程序员的我们就更不用说了,上班 8 小时需要做好本职工作,下班后还要不断提升技能、技术栈&#…...
二十四节气—雨水,好雨知时节,当春乃发生。
雨水,是二十四节气之第2个节气。 雨水节气不仅表明降雨的开始及雨量增多,而且表示气温的升高,意味着进入气象意义的春天。 雨水节是一个非常富有想象力和人情味的节气,在这一天,不管下不下雨都充满着一种雨意蒙蒙的诗…...
为什么要使用数据库?
随着互联网技术的高速发展,预计2020 年底全世界网民的数量将达到 50 亿。网民数量的增加带动了网上购物、微博,网络视频等产业的发展。那么,随之而来的就是庞大的网络数据量。 大量的数据正在不断产生,那么如何安全有效地存储、检…...
【原创】java+swing+mysql图书管理系统设计与实现
图书管理系统是一个比较常见的系统,今天我们主要介绍如何使用javaswiingmysql去开发一个cs架构的图书管理系统,方便学生进行图书借阅。 功能分析: 宿舍报修管理系统的使用角色,一般分为管理员和学生,管理员主要进行学…...
图论 —— 强连通分量
概念 连通图 无向图 G G G 中,若对任意两点 V i , V j V_i, V_j V<...
计算机网络(二):物理层和链路层,通道复用,MAC地址,CSMA/CD协议,PPP点对点协议
文章目录一、物理层主机之间的通信方式通道复用技术常见的宽带接入技术二、链路层MAC地址和IP地址分别有什么作用为什么有了MAC地址之后还需要IP地址为什么有了IP地址还需要MAC地址以太网中的CSMA/CD协议数据链路层上的三个基本问题PPP协议一、物理层 主机之间的通信方式 单工…...
英语基础-定语从句的特殊用法及写作应用
1. 定语从句的引导词省略的情况 1. that 引导定语从句,从句中缺宾语/表语,that可省略; This is the book that he likes. I like the shirt that you gave me. We do not agree on the plan that you make. China is not the country th…...
[数据结构]---八大经典排序算法详解
🐧作者主页:king&南星 🏰专栏链接:c 文章目录一、八大排序算法复杂度对比二、基于比较的排序算法1.冒泡排序2.选择排序3.插入排序4.希尔排序5.直观感受四种算法的时间复杂度三、基于非比较的排序算法1.基数排序2.箱(桶)排序四…...
Go语言设计与实现 -- 反射
Go的反射有哪些应用? IDE中代码的自动补全对象序列化fmt函数的相关实现ORM框架 什么情况下需要使用反射? 不能明确函数调用哪个接口,需要根据传入的参数在运行时决定。不能明确传入函数的参数类型,需要在运行时处理任意对象。 …...
利用5G工业网关实现工业数字化的工业互联网解决方案
5G工业网关是一种用于将工业生产环境中的数据连接到工业互联网的解决方案。它可以利用高带宽、高速率、低时延的5G网络连接工业现场的PLC、传感器、工业设备和云端数据中心,从而实现工业数字化。 物通博联工业互联网解决方案 物通博联5G工业网关的使用步骤&#x…...
石湾做网站公司/怎么注册自己的网站域名
一、监视内存计数器要监视内存不足的状况,请从以下的对象计数器开始:1.内存信息:Memory\ Available BytesMemory\ Pages/secMemory\ Available Bytes如果您怀疑有内存泄露,请监视 Memory\Available Bytes 和 Memory\ Committed By…...
在线crm厂商/广州推广seo
这篇文章主要介绍了 python 中使用 xlrd、xlwt 操作 excel 表格详解, python 操作 excel 主要用到 xlrd 和 xlwt 这两个库,即 xlrd 是读 excel,xlwt 是写 excel 的库, 需要的朋友可以参考下 python 操作 excel 主要用到 xlrd 和 xlwt 这两个库࿰…...
大石桥网站制作/武汉今日头条最新消息
在刚刚结束的 IJCAI 2021 大会上,深度学习模型知识产权保护国际研讨会正式举行,这场研讨会由微众银行、马来亚大学、香港科技大学、上海交通大学共同主办。 机器学习,尤其是深度神经网络(DNN)技术,近年来在…...
网站做的自适应体验差/怎么能在百度上做推广
一 1.加入此行代码,注意不要比过去(左边为修改后,右为修改后),先修改framework下的AntiTheftManager.java文件(路径:alps\frameworks\base\packages\Keyguard\src\com\mediatek\keyguard\AntiTheft) 2.这里…...
wordpress子菜单位置/最经典最常用的网站推广方式
一、copy 头文件algorithm template <class InputIterator, class OutputIterator>OutputIterator copy (InputIterator first, InputIterator last, OutputIterator result);复制元素范围 将[first,last]范围内的元素复制到从result开始的范围内。 该函数…...
备案 网站起名/惊艳的网站设计
在数据处理业务中,经常要把文件结构相同或近似相同的数据文件合并成一个文件,或者将一个比较大的数据文件拆分成小的数据文件。本文将介绍文本文件和 Excel 文件合并及拆分会遇到的几种情况,并提供用 esProc SPL 编写的代码示例。esProc 是专…...