用Python编写从PDF中提取预览图像

在处理大量PDF文件时,有时需要快速浏览每个PDF的内容。一种常见的做法是为每个PDF生成预览图像,通常是文档第一页的屏幕截图。虽然一些PDF阅读器提供此功能,但如果需要批量处理大量文件,编写一个自定义脚本会更高效。

在本文中,我将介绍如何使用Python、wxPython和PyMuPDF库创建一个简单的GUI应用程序,从指定文件夹中的所有PDF文件生成第一页的预览图像。

程序概述

我们的应用程序包含以下主要组件:

1. wxPython GUI - 用于显示文件夹选择控件和"处理PDF"按钮
2. PyMuPDF库 - 用于打开和渲染PDF文件
3. Python文件操作 - 用于遍历文件夹和保存图像文件

下面是应用程序的用户界面:

使用步骤:

1. 运行程序
2. 选择包含PDF文件的输入文件夹
3. 选择用于保存预览图像的输出文件夹 
4. 点击"处理PDF"按钮

程序会遍历输入文件夹中的所有PDF文件,为每个PDF渲染第一页,然后将渲染结果以PNG格式保存到输出文件夹,文件名与原始PDF文件相同,但扩展名为.png。

C:\pythoncode\new\pdfTojpg.py

编程实现

import os
import wx
import fitz  # PyMuPDF库class PDFPreviewApp(wx.App):def __init__(self):super().__init__()self.frame = PDFPreviewFrame(None)self.frame.Show()class PDFPreviewFrame(wx.Frame):def __init__(self, parent):super().__init__(parent, title="PDF Preview")panel = wx.Panel(self)self.dir_picker = wx.DirPickerCtrl(panel, message="选择PDF文件夹")self.output_picker = wx.DirPickerCtrl(panel, message="选择输出文件夹")process_btn = wx.Button(panel, label="处理PDF")process_btn.Bind(wx.EVT_BUTTON, self.process_pdfs)sizer = wx.BoxSizer(wx.VERTICAL)sizer.Add(self.dir_picker, 0, wx.EXPAND | wx.ALL, 5)sizer.Add(self.output_picker, 0, wx.EXPAND | wx.ALL, 5)sizer.Add(process_btn, 0, wx.ALIGN_CENTER | wx.ALL, 5)panel.SetSizer(sizer)def process_pdfs(self, event):input_dir = self.dir_picker.GetPath()output_dir = self.output_picker.GetPath()for filename in os.listdir(input_dir):if filename.endswith(".pdf"):pdf_path = os.path.join(input_dir, filename)pdf = fitz.open(pdf_path)page = pdf[0]  # 获取第一页pix = page.get_pixmap()  # 渲染PDF页面output_path = os.path.join(output_dir, filename.replace(".pdf", ".png"))pix.save(output_path)  # 保存为PNG图像wx.MessageBox("处理完成!", "完成", wx.OK | wx.ICON_INFORMATION)if __name__ == "__main__":app = PDFPreviewApp()app.MainLoop()

代码分为三个主要部分:

1. **导入必需的库**
2. **定义wxPython GUI类**
3. **定义处理PDF的函数**

在定义GUI类时,我们创建一个wx.Frame及其wx.Panel,包含两个wx.DirPickerCtrl用于选择输入和输出文件夹,一个wx.Button供用户触发PDF处理。

处理PDF的process_pdfs函数首先获取输入和输出文件夹路径。然后,它遍历输入文件夹,对于每个PDF文件:

1. 使用PyMuPDF打开PDF
2. 获取第一页
3. 渲染页面为位图对象
4. 将位图保存为PNG文件到输出文件夹

最后,显示一个对话框通知用户处理已完成。

总结

通过结合wxPython、PyMuPDF和Python文件操作,我们创建了一个方便的工具,可以从文件夹中批量提取PDF的预览图像。这不仅对快速浏览文档内容很有用,也可以用作生成文档缩略图等其他用途的基础。你可以根据需要对代码进行进一步定制和扩展。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/702654.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

现货黄金在线交易有哪些优势_EE trade

现货黄金在线交易拥有几项独特优势,使其成为广受投资者青睐的贵金属投资方式: 1. 全天候交易 现货黄金市场几乎可以实现24小时不间断交易,投资者可以根据全球市场的变动随时参与交易,这提供了极大的灵活性和即时反应市场变化的能…

彩虹pdm系统的BOM协同管理方案

彩虹pdm系统的BOM协同管理方案 彩虹PDM系统的BOM协同管理方案旨在为企业提供高效、准确且协同的物料清单(Bill of Materials,简称BOM)管理解决方案。以下是该方案的详细介绍: 一、BOM数据全面管理 彩虹PDM系统以产品结构为中心…

哪款开放式耳机佩戴最舒服?2024五款备受推崇产品分享!

​开放式耳机的确给众多运动爱好者在他们挥洒汗水时带来最好的音乐与佩戴体验,特别对于经常跑步的人来说,它是运动的最佳拍档。然而市面上的开放式耳机质量不一,存在一些用料不佳,收音不好,降噪能力差的产品。那么面对…

Android Iptables 客制化方法及基本使用

Android Iptables 客制化方法及基本使用 Android netd 的自定义链NetdConstants.cpp 的 execIptablesRestore 方法IptablesRestoreController 的 execute 方法使用 oem-iptables-init.sh 添加自定义的防火墙规则oem-iptables-init.sh 示例文件 基本概念Iptables 链Iptables 表 …

二.PVE创建 Ubuntu CT

二.PVE创建 Ubuntu CT 浏览器地址栏输入访问pve系统的网址,利用web端进行管理。注意进入pve系统时默认显示的有访问地址。本步骤的web访问地址为:https://192.168.1.102:8006。 出现该页面,选择继续前往。 进入管理页面后,输入PVE系统的用户名和密码,登录该系统。 登…

成都欣丰洪泰文化传媒有限公司电商服务新典范

在数字化浪潮席卷而来的今天,电商行业作为新时代商业发展的重要引擎,正以其独特的魅力和无限潜力,吸引着越来越多的企业和个人投身其中。在这个充满机遇与挑战的领域中,成都欣丰洪泰文化传媒有限公司以其专业的电商服务&#xff0…

华为 2024 届实习校园招聘-硬件通⽤/单板开发——第六套

华为 2024 届实习校园招聘-硬件通⽤/单板开发——第六套 部分题目分享,完整版带答案(有答案和解析,答案非官方,未仔细校正,仅供参考)(共十套,每套四十题选择题)获取(WX:…

蓝桥杯练习系统(算法训练)ALGO-941 P0601字符删除

资源限制 内存限制:256.0MB C/C时间限制:1.0s Java时间限制:3.0s Python时间限制:5.0s 编写一个程序,先输入一个字符串str(长度不超过20),再输入单独的一个字符ch&#xff0c…

高通Android 11/12/13 通过包名设置默认launcher

背景&#xff1a;最近在封装供第三应用系统SDK 接口&#xff0c;遇到一个无法通过包名设置主launcher代码坑所以记录下。 涉及类roles.xml # <!---~ see com.android.settings.applications.defaultapps.DefaultHomePreferenceController~ see com.android.settings.appl…

你了解黑龙江等保测评么?

等保测评的全称是信息安全等级保护测评&#xff0c;是信息安全等级保护工作中的一项重要内容。 具体来说&#xff0c;等保测评是指按照国家相关标准和技术规范&#xff0c;对信息系统安全等级保护状况进行检测评估的活动。 其主要目的是发现信息系统存在的安全隐患和不足&…

Leetcode—3146. 两个字符串的排列差【简单】

2024每日刷题&#xff08;135&#xff09; Leetcode—3146. 两个字符串的排列差 实现代码 class Solution { public:int findPermutationDifference(string s, string t) {int maps[26];int mapt[26];for(int i 0; i < s.size(); i) {int idxs s[i] - a;int idxt t[i] …

一部手机、一段视频,快速开展自动无人直播获取潜在客户

​​直播已经成为一种全新的营销方式。对于实体门店而言&#xff0c;直播具有吸引潜在客户、提升品牌知名度以及促进销售的巨大潜能。然而&#xff0c;很多门店因缺乏专业的直播设备和人员而无法轻松实现直播。为此&#xff0c;我们隆重介绍一款手机自动直播门店助手&#xff0…