当前位置: 首页 > news >正文

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组件及布局和槽函数已经开发完成了,应用的页面效果如下。

PDF图片转换器UI页面.png

然后,我们开始业务逻辑的开发。这里将业务逻辑使用单独的子线程开发避免和页面的主线程发生阻塞。

创建一个子线程的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_())

PDF图片转换.gif

往期精彩

假如有一个专属于python的终端工具,那绝对非他莫属!

如何解决python读取大数据量文件时造成的内存溢出?

python如何完成对 Excel文件的解密后读取?

相关文章:

python自制PDF转换.PNG格式图片(按每页生成图片完整源码)小工具!

使用PyQt5应用程序制作PDF转换成图片的小工具,可以导入PDF文档后一键生成对应的PNG图片。 PDF图片转换小工具使用的中间件: python版本:3.6.8 UI应用版本:PyQt5 PDF文件操作非标准库:PyPDF2 PNG图片生成库&#xff1…...

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是一种具有反馈循环的电路,可将反馈信号的相/频率保持与参考输入信号的相/频率相同(锁定)。 如下图所示,如果参考输入和反馈输入之间存在相位差,则…...

无数据库版Mirror照妖镜源码解析:如何安全改造为个人图片鉴黄工具

无数据库版Mirror照妖镜源码解析:如何安全改造为个人图片鉴黄工具 在当今内容爆炸的时代,图片审核成为许多个人开发者和内容创作者的刚需。传统解决方案往往依赖复杂的数据库系统和第三方API,而Mirror照妖镜的无数据库设计为轻量级图片审核提…...

从CCD到CMOS:HDR成像技术20年发展史与未来趋势

从CCD到CMOS:HDR成像技术20年演进与实战解析 在摄影器材展上,一位资深摄影师正用指尖轻抚不同年代的相机传感器——从2003年尼康D2H的CCD模块到2023年索尼A7RV的背照式CMOS,这个动作恰好勾勒出HDR技术演进的二十年轨迹。动态范围(…...

从轨迹到网络:广州休闲步行空间格局刻画 | 论文全解析与方法论深度拆解

从轨迹到网络:广州休闲步行空间格局刻画 | 论文全解析与方法论拆解 原文:From trajectories to network: Delineating the spatial pattern of recreational walking in Guangzhou》 一、论文核心概览:摘要与关键词 1.1 核心摘要解析 本文的核心内容可拆解为5个核心模块,…...

别再手动校正了!用Landsat 9 L2SP地表反射率数据,在QGIS里5分钟搞定NDVI和水体提取

遥感分析效率革命:用Landsat 9 L2SP数据在QGIS中实现5分钟精准制图 当遥感数据处理流程从传统数小时缩短至五分钟,这意味着什么?去年在亚马逊雨林监测项目中,我们团队曾因大气校正步骤延误错过了最佳干预时机。如今Landsat 9 L2SP…...

Pyodide vs Rust-Python vs WASI-NN:Python WASM性能终极对决(含13项微基准测试原始数据)

第一章:Pyodide vs Rust-Python vs WASI-NN:Python WASM性能终极对决(含13项微基准测试原始数据) WebAssembly 正在重塑 Python 在浏览器与边缘环境中的执行范式。本章基于统一测试平台(WASI SDK 20.0、Chrome 124、In…...

2026搜索量暴涨!这几款配音软件火到刷屏

如果你最近刷短视频,一定注意到了——声音比画面更抓人。从悬疑解说的低沉旁白,到小说推文的多角色演绎,再到带货视频的情绪播报,一条爆款视频的背后,往往藏着一款好用的配音软件。2026年,AI配音市场迎来爆…...

避坑指南:.NET MAUI页面跳转最常见的5个坑点及解决方案(2023最新版)

.NET MAUI页面导航避坑实战:5个高频问题与工业级解决方案 刚接触.NET MAUI的开发者常会在页面跳转环节踩坑——传参莫名丢失、导航堆栈突然崩溃、模态窗口关闭失效...这些问题往往消耗大量调试时间。本文将结合GitHub高星issue和StackOverflow热帖,拆解5…...

示波器安全操作与高压测量实践指南

示波器安全使用指南:从基础操作到高压测量实践1. 示波器使用安全概述示波器作为电子工程师的核心调试工具,其正确使用直接关系到测量结果的准确性和操作人员的人身安全。在实际工程应用中,约35%的测量事故源于不规范的示波器操作,…...

从LLaVA到Stable Diffusion:多模态融合选拼接还是交叉注意力?一张图帮你做技术选型

多模态融合技术选型指南:拼接与交叉注意力的深度对比与实践策略 在构建现代多模态AI系统时,工程师们常常面临一个关键决策点:如何有效地融合来自不同模态的信息?想象一下,你正在开发一个智能医疗影像分析系统&#xff…...

Kimi,Minimax教你的客服怎么做客服

Kimi,教你怎么做客服。下面是Kimi根据我提供的图片写的文章。不是说minimax全面领先kimi,至少我在不断的提高自己的kimi会员等级。但是有时候,这是被迫的消耗积分和额度。199的套餐也快消耗完了。消耗积分是应该的,关键是要用在刀…...