Python自制一个PDF转PNG图片小工具

使用PyQt5应用程序制作PDF转换成图片的小工具,可以导入PDF文档后一键生成对应的PNG图片。

PDF图片转换小工具使用的中间件:

  • python版本:3.6.8
  • UI应用版本:PyQt5
  • PDF文件操作非标准库:PyPDF2
  • PNG图片生成库:PyMuPDF
pip install PyQt5

pip install PyPDF2

pip 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 the
        attributes 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 = True
        self.parent = parent

    def __del__(self):
        """
        A destructor. It is called when the object is destroyed.
        """
        self.working = False

    def 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)
                return

            self.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自制一个PDF转PNG图片小工具的详细内容,更多关于Python PDF转PNG的资料请关注我们其它相关文章!

(0)

相关推荐

  • Python使用PIL.image保存图片

    目录 1.原图 1.首先PIL保存图片的时候,图片类型一定要是ndarray类型,不能是tensor类型,否则报错 2.tensor转成ndarray类型保存 3.如果不进行归一化处理,也会报错 总结 1.原图 1.首先PIL保存图片的时候,图片类型一定要是ndarray类型,不能是tensor类型,否则报错 img=cv2.imread("./epoch034_iter100_target.png") img1=torch.tensor(img) image_pil=Image.fr

  • Python Matplotlib中使用plt.savefig存储图片的方法举例

    目录 前言 主要功能: 函数源码:(根据需要进行选择) 参数解释: 注意事项: 补充:解决plt.savefig() 保存多张图片有重叠的问题 总结 前言 plt.show()展示图片的时候,截图进行保存,图片不是多么清晰 如何保存高清图也是一知识点 函数包名:import matplotlib.pyplot as plt 主要功能: 保存绘制数据后创建的图形.使用此方法可以将创建的图形保存 函数源码:(根据需要进行选择) savefig(fname, dpi=None, facecolor='

  • Python实现普通图片转ico图标的方法详解

    目录 简介 历史攻略 下载安装包 下载地址 安装后缀pythonmagick - whl文件 案例源码 效果图 简介 ICO是一种图标文件格式,图标文件可以存储单个图案.多尺寸.多色板的图标文件.一个图标实际上是多张不同格式的图片的集合体,并且还包含了一定的透明区域.它是图标文件格式的一种,可以存储单个图案.多尺寸.多色板的图标文件.图标是具有明确指代含义的计算机图形.其中桌面图标是软件标识,界面中的图标是功能标识. 历史攻略 pip安装第三方库全攻略:普通安装.安装whl后缀文件.使用国内镜像

  • 图片去摩尔纹简述实现python代码示例

    目录 1.前言 2.网络结构复现 3.数据预处理 4.模型训练 总结 1.前言 当感光元件像素的空间频率与影像中条纹的空间频率接近时,可能产生一种新的波浪形的干扰图案,即所谓的摩尔纹.传感器的网格状纹理构成了一个这样的图案.当图案中的细条状结构与传感器的结构以小角度交叉时,这种效应也会在图像中产生明显的干扰.这种现象在一些细密纹理情况下,比如时尚摄影中的布料上,非常普遍.这种摩尔纹可能通过亮度也可能通过颜色来展现.但是在这里,仅针对在翻拍过程中产生的图像摩尔纹进行处理. 翻拍即从计算机屏幕上捕获

  • 详解python实现多张多格式图片转PDF并打包成exe

    目录 转PDF初始代码 转PDF最终代码 GUI界面设计代码 打包成可执行文件 完整代码 附录 转PDF初始代码 从文件夹中读取图片数据,然后将他们保存为PDF格式. 不长,大概10行代码. from PIL import Image from os import * def PictureToPDF(picture_path, name): pictures = [] picture_file = listdir(picture_path) for file in picture_file:

  • Python自制一个PDF转PNG图片小工具

    使用PyQt5应用程序制作PDF转换成图片的小工具,可以导入PDF文档后一键生成对应的PNG图片. PDF图片转换小工具使用的中间件: python版本:3.6.8 UI应用版本:PyQt5 PDF文件操作非标准库:PyPDF2 PNG图片生成库:PyMuPDF pip install PyQt5 pip install PyPDF2 pip install PyMuPDF==1.18.17 将需要使用到的python标准库或非标准库全部导入到我们的代码块中进入开发环节. # Importing

  • Python 实现一个颜色色值转换的小工具

    需求说明 公司的 UI 设计小哥,已经转用 Zeplin 很久了.Zeplin 的设计稿展示页面的颜色色值使用十进制的 RGB 表示的,在 Android 中的颜色表示大多情况下都需要十六进制的 RGB 表示.我的数学没有好到直接看到十进制就可以心算得到十六进制的结果,所以我需要一个工具,输入十进制的 RGB ,得到十六进制的色值,最好可以方便复制. Zeplin 的颜色色值显示示例 原有处理方式 因为我会 Python (仅限于终端输入 python 然后当做计算器算,或者用 hex() 函数

  • Python实现一个Git日志统计分析的小工具

    前言 本文介绍的是利用Python实现的一个小工具,用于分析Git commit log,获得Git Project每个成员的简单行为数据. Warning:代码量不能代表程序员能力水平! 启动参数 共5个. Repo地址 Commit 起始日期 Commit 结束日期 Git仓库子目录 统计分析结果CSV文件目标路径 exec_git Git Log命令: git -C {} log --since={} --until={} --pretty=tformat:%ae --shortstat

  • Python 制作查询商品历史价格的小工具

    一年一度的双十一就快到了,各种砍价.盖楼.挖现金的口令将在未来一个月内充斥朋友圈.微信群中.玩过多次双十一活动的小编表示一顿操作猛如虎,一看结果2毛5.浪费时间不说而且未必得到真正的优惠,双十一电商的"明降暗升"已经是默认的潜规则了.打破这种规则很简单,可以用 Python 写一个定时监控商品价格的小工具. 思路 第一步抓取商品的价格存入 Python 自带的 SQLite 数据库 每天定时抓取商品价格 使用 pyecharts 模块绘制价格折线图,让低价一目了然 抓取京东价格 从商品

  • 利用Python自制一个批量图片水印添加器

    前段时间写了个比较简单的批量水印添加的python实现方式,将某个文件夹下面的图片全部添加上水印. 今天正好有时间就做了一个UI应用的封装,这样不需要知道python直接下载exe的应用程序使用即可. 下面主要来介绍一下实现过程. 首先,还是老规矩介绍一下在开发过程中需要用到的python非标准库,由于这些库都是之前使用过的. 所以这里就直接导入到代码块中,如果没有的话直接使用pip的方式进行安装即可. # It imports all the classes, attributes, and 

  • 使用Python自制一个回收站清理器

    经常笔记本电脑的回收站存储了很多的文件,需要打开回收站全部选中进行清理. 但是要是做成python自动化,再将其配置成定时任务就不需要再去手动操作了.或者就是直接双击运行即可完成所有回收站的文件清理. 由于实现过程需要调用windows的终端命令,所以需要安装winshell.然而有的小伙伴没有安装pypiwin32就会报错没有win32con模块,因此,新的python环境安装这两个非标准库就OK了. pip install winshell pip install pypiwin32 其实真

  • 基于Python编写一个宝石消消乐小游戏

    目录 开发工具 环境搭建 原理简介 开发工具 python版本:3.6.4 相关模块: pygame:以及一些python自带的模块. 环境搭建 安装python并添加到环境变量,pip安装需要的相关模块即可. 原理简介 游戏规则: 玩家通过鼠标交换相邻的拼图,若交换后水平/竖直方向存在连续三个相同的拼图,则这些拼图消失,玩家得分,同时生成新的拼图以补充消失的部分,否则,交换失败,玩家不得分.玩家需要在规定时间内获取尽可能高的得分. 实现过程: 首先加载一些必要的游戏素材: 加载背景音乐: py

  • 用Python写一个无界面的2048小游戏

    以前游戏2048火的时候,正好用其他的语言编写了一个,现在学习python,正好想起来,便决定用python写一个2048,由于没学过python里面的界面编程,所以写了一个极其简单的无界面2048.游戏2048的原理和实现都不难,正好可以拿来练手,要是不知道这游戏的话,可以去网上查一下,或者下载一个到手机来玩一下,我就不在说其原理.我知道不放图的话大家一点兴趣都没,下面首先放一张游戏成型图,然后我们在来讲如何一步步用最基础的知识来实现. 一.生成4*4的矩阵 游戏的第一步便是生成一个4*4的矩

  • 基于Python的一个自动录入表格的小程序

    ## 帮阿雪写的一个小程序 --------------------------------------------------------------------------------------------------- 上大学的时候,总是会由很多表格需要同学们去搞,尤其是刚开学的那个时候,显然是很烦躁, 阿雪刚开学的时候,作为班干部,表示有时候刚录表不是很熟悉经常会弄到很晚,甚至还会弄错, 这就让我很是触动,所以想帮她搞一搞,顺便增强一下我们的友谊/hhhhhh ------------

  • 使用Python 统计文件夹内所有pdf页数的小工具

    1.首先安装 PyPDF2 库: pip install PyPDF2 2.然后保存下面文件(已带注释,具体实现请自己思考) import os import PyPDF2 #获取文件夹内所有pdf文件,以及打印文件数量 def GetFileInfo(path, fileType=()): fileList = [] # root 表示当前正在访问的文件夹路径 # dirs 是 list , 表示该文件夹中所有的目录的名字(不包括子目录) # files 是 list , 表示内容是该文件夹中

随机推荐