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

使用Python将Word文档转换为PNG图片

在这篇博客中,我将介绍一个使用Python编写的小工具,它能够将指定文件夹中的所有Word文档(.doc和.docx格式)转换为PNG图片。这个工具基于wxPython库构建图形用户界面,并结合了win32com和PyMuPDF库实现文档格式的转换。接下来,我将详细说明这个工具的功能及其实现。
D:\spiderdocs\wordtoscreenshot.py

全部代码

import os
import wx
from win32com import client as wc
import pythoncom
import sys
import traceback
import tempfile
import fitz  # PyMuPDFdef convert_word_to_pdf(word_path, pdf_path):pythoncom.CoInitialize()word = Nonedoc = Nonetry:word = wc.Dispatch("Word.Application")word.Visible = Falsedoc = word.Documents.Open(word_path)doc.ExportAsFixedFormat(pdf_path, 17)  # 17 is wdExportFormatPDFprint(f"Successfully exported {word_path} to {pdf_path}")except Exception as e:print(f"Error in convert_word_to_pdf: {str(e)}")print("Traceback:")traceback.print_exc()raisefinally:if doc:doc.Close(SaveChanges=False)if word:word.Quit()pythoncom.CoUninitialize()def convert_pdf_to_png(pdf_path, png_path):try:doc = fitz.open(pdf_path)page = doc.load_page(0)  # Load the first pagepix = page.get_pixmap()pix.save(png_path)doc.close()print(f"Successfully converted {pdf_path} to {png_path}")except Exception as e:print(f"Error in convert_pdf_to_png: {str(e)}")print("Traceback:")traceback.print_exc()raiseclass MyFrame(wx.Frame):def __init__(self):super().__init__(parent=None, title='Word to PNG Converter')panel = wx.Panel(self)self.folder_path = wx.TextCtrl(panel, pos=(5, 5), size=(350, 25))browse_button = wx.Button(panel, label='Browse', pos=(360, 5), size=(70, 25))browse_button.Bind(wx.EVT_BUTTON, self.on_browse)convert_button = wx.Button(panel, label='Convert', pos=(5, 35), size=(425, 25))convert_button.Bind(wx.EVT_BUTTON, self.on_convert)self.SetSize((450, 100))self.Show()def on_browse(self, event):dlg = wx.DirDialog(self, "Choose a directory:", style=wx.DD_DEFAULT_STYLE)if dlg.ShowModal() == wx.ID_OK:self.folder_path.SetValue(dlg.GetPath())dlg.Destroy()def on_convert(self, event):folder = self.folder_path.GetValue()if not folder:wx.MessageBox('Please select a folder first', 'Error', wx.OK | wx.ICON_ERROR)returnlog = []for filename in os.listdir(folder):if filename.endswith('.doc') or filename.endswith('.docx'):word_path = os.path.join(folder, filename)png_path = os.path.splitext(word_path)[0] + '.png'try:with tempfile.NamedTemporaryFile(suffix='.pdf', delete=False) as tmp_pdf:pdf_path = tmp_pdf.nameconvert_word_to_pdf(word_path, pdf_path)convert_pdf_to_png(pdf_path, png_path)os.unlink(pdf_path)  # Remove the temporary PDF filelog.append(f'Converted {filename} to PNG')except Exception as e:log.append(f'Error converting {filename}: {str(e)}')log_str = '\n'.join(log)with open('conversion_log.txt', 'w') as f:f.write(log_str)wx.MessageBox('Conversion completed. Check conversion_log.txt for details.', 'Info', wx.OK | wx.ICON_INFORMATION)if __name__ == '__main__':app = wx.App()frame = MyFrame()app.MainLoop()

功能概述

这个工具的主要功能包括:

  1. 选择文件夹:用户可以通过GUI界面选择包含Word文档的文件夹。
  2. 转换文档:将选择的文件夹中的所有Word文档转换为PNG图片,并记录转换日志。
  3. 显示消息:在转换完成后,显示一个消息框提示用户检查转换日志。

代码实现

导入必要的库

首先,我们需要导入一些必要的Python库:

import os
import wx
from win32com import client as wc
import pythoncom
import sys
import traceback
import tempfile
import fitz  # PyMuPDF

Word到PDF的转换函数

使用win32com库中的Word应用程序接口,我们可以将Word文档转换为PDF格式:

def convert_word_to_pdf(word_path, pdf_path):pythoncom.CoInitialize()word = Nonedoc = Nonetry:word = wc.Dispatch("Word.Application")word.Visible = Falsedoc = word.Documents.Open(word_path)doc.ExportAsFixedFormat(pdf_path, 17)  # 17 is wdExportFormatPDFprint(f"Successfully exported {word_path} to {pdf_path}")except Exception as e:print(f"Error in convert_word_to_pdf: {str(e)}")print("Traceback:")traceback.print_exc()raisefinally:if doc:doc.Close(SaveChanges=False)if word:word.Quit()pythoncom.CoUninitialize()

PDF到PNG的转换函数

接着,我们使用PyMuPDF库将PDF文件转换为PNG图片:

def convert_pdf_to_png(pdf_path, png_path):try:doc = fitz.open(pdf_path)page = doc.load_page(0)  # Load the first pagepix = page.get_pixmap()pix.save(png_path)doc.close()print(f"Successfully converted {pdf_path} to {png_path}")except Exception as e:print(f"Error in convert_pdf_to_png: {str(e)}")print("Traceback:")traceback.print_exc()raise

图形用户界面(GUI)

我们使用wxPython库创建一个简单的GUI,允许用户选择文件夹并启动转换:

class MyFrame(wx.Frame):def __init__(self):super().__init__(parent=None, title='Word to PNG Converter')panel = wx.Panel(self)self.folder_path = wx.TextCtrl(panel, pos=(5, 5), size=(350, 25))browse_button = wx.Button(panel, label='Browse', pos=(360, 5), size=(70, 25))browse_button.Bind(wx.EVT_BUTTON, self.on_browse)convert_button = wx.Button(panel, label='Convert', pos=(5, 35), size=(425, 25))convert_button.Bind(wx.EVT_BUTTON, self.on_convert)self.SetSize((450, 100))self.Show()def on_browse(self, event):dlg = wx.DirDialog(self, "Choose a directory:", style=wx.DD_DEFAULT_STYLE)if dlg.ShowModal() == wx.ID_OK:self.folder_path.SetValue(dlg.GetPath())dlg.Destroy()def on_convert(self, event):folder = self.folder_path.GetValue()if not folder:wx.MessageBox('Please select a folder first', 'Error', wx.OK | wx.ICON_ERROR)returnlog = []for filename in os.listdir(folder):if filename.endswith('.doc') or filename.endswith('.docx'):word_path = os.path.join(folder, filename)png_path = os.path.splitext(word_path)[0] + '.png'try:with tempfile.NamedTemporaryFile(suffix='.pdf', delete=False) as tmp_pdf:pdf_path = tmp_pdf.nameconvert_word_to_pdf(word_path, pdf_path)convert_pdf_to_png(pdf_path, png_path)os.unlink(pdf_path)  # Remove the temporary PDF filelog.append(f'Converted {filename} to PNG')except Exception as e:log.append(f'Error converting {filename}: {str(e)}')log_str = '\n'.join(log)with open('conversion_log.txt', 'w') as f:f.write(log_str)wx.MessageBox('Conversion completed. Check conversion_log.txt for details.', 'Info', wx.OK | wx.ICON_INFORMATION)if __name__ == '__main__':app = wx.App()frame = MyFrame()app.MainLoop()

代码解析

  1. 导入库:我们导入了os、wx、win32com、pythoncom、sys、traceback、tempfile和fitz库。这些库分别用于文件操作、创建GUI、与Word应用程序交互、处理异常、创建临时文件以及处理PDF文件。

  2. convert_word_to_pdf函数:这个函数使用win32com库将Word文档转换为PDF格式。它首先初始化COM库,然后创建一个Word应用程序实例,打开指定的Word文档,并将其导出为PDF格式。最后,它关闭文档并退出Word应用程序。

  3. convert_pdf_to_png函数:这个函数使用PyMuPDF库将PDF文件的第一页转换为PNG图片。它打开指定的PDF文件,加载第一页,生成图像并保存为PNG格式。

  4. MyFrame类:这是我们的GUI类,继承自wx.Frame。它包含一个文本框用于显示和输入文件夹路径,一个浏览按钮用于选择文件夹,以及一个转换按钮用于启动转换过程。on_browse方法用于处理浏览按钮点击事件,on_convert方法用于处理转换按钮点击事件。

  5. on_convert方法:这个方法首先获取用户选择的文件夹路径,然后遍历该文件夹中的所有Word文档,依次将其转换为PDF格式,再将PDF文件转换为PNG图片。转换过程中记录日志,并在转换完成后显示消息框。

  6. 主程序:在主程序中,我们创建一个wx.App实例,并创建MyFrame实例来显示GUI。

结果如下

在这里插入图片描述

总结

通过这篇博客,我们介绍了如何使用Python和wxPython库创建一个简单的GUI工具,将指定文件夹中的所有Word文档转换为PNG图片。这个工具使用了win32com库与Word应用程序交互,将Word文档导出为PDF格式,并使用PyMuPDF库将PDF文件转换为PNG图片。希望这篇博客对你有所帮助!

相关文章:

使用Python将Word文档转换为PNG图片

在这篇博客中,我将介绍一个使用Python编写的小工具,它能够将指定文件夹中的所有Word文档(.doc和.docx格式)转换为PNG图片。这个工具基于wxPython库构建图形用户界面,并结合了win32com和PyMuPDF库实现文档格式的转换。接…...

Qt创建Json对象时浮点数的精度控制

我们在Qt中使用Json都是使用QJsonDocument、QJsonArray、QJsonObject、QJsonValue等类。 当我们在QJsonObject中插入浮点数字段时&#xff0c;会发现浮点数的小数位数很长&#xff0c;如下所示&#xff1a; #include <QJsonDocument> #include <QJsonArray> #incl…...

【海贼王航海日志:前端技术探索】CSS你了解多少?(二)

目录 1 -> 字体属性 1.1 -> 设置字体 1.2 -> 字体大小 1.3 -> 字体粗细 1.4 -> 文字样式 2 -> 文本属性 2.1 -> 文本颜色 2.1.1 -> 认识RGB 2.1.2 -> 设置文本颜色 2.2 -> 文本对齐 2.3 -> 文本装饰 2.4 -> 文本缩进 2.5 -&g…...

软件测试面试200问(全)

1、你的测试职业发展是什么&#xff1f; 测试经验越多&#xff0c;测试能力越高。所以我的职业发展是需要时间积累的&#xff0c;一步步向着高级测试工程师奔去。而且我也有初步的职业规划&#xff0c;前 3 年积累测试经验&#xff0c;按如何做好测试工程师的要点去要求自己&a…...

【单片机毕业设计选题24106】-基于阿里云的心率呼吸监测系统

系统功能: 上电后OLED显示 “欢迎使用请稍后”&#xff0c;两秒后显示Connecting...表示 正在连接阿里云&#xff0c;正常连接阿里云后进入系统显示界面&#xff0c;如长时间显示Connecting...请 检查WiFi网络是否正确。 系统连接阿里云后可在阿里云界面查看到系统上报的温…...

leetcode28:找出字符串第一个匹配的下标

找出字符串第一个匹配的下标 给你两个字符串 haystack 和 needle &#xff0c;请你在 haystack 字符串中找出 needle 字符串的第一个匹配项的下标&#xff08;下标从 0 开始&#xff09;。如果 needle 不是 haystack 的一部分&#xff0c;则返回 -1 。 public int strStr(Str…...

Java二十三种设计模式-桥接模式(10/23)

桥接模式&#xff1a;解耦抽象与实现的灵活设计 引言 桥接模式&#xff08;Bridge Pattern&#xff09;是一种结构型设计模式&#xff0c;用于将抽象部分与其实现部分分离&#xff0c;使它们可以独立地变化。它是一种对象结构型模式&#xff0c;又称为柄体(Handle and Body)模…...

Java 面试指南

Java 面试指南 目录 引言Java 基础知识 数据类型运算符控制结构面向对象编程 Java 高级特性 异常处理集合框架泛型多线程与并发 Java 标准类库 java.lang 包java.util 包java.io 包 Java Web 开发 ServletJSPSpring 框架 数据库连接与JDBC JDBC 基础数据库连接池 设计模式 单…...

计算机毕业设计选题推荐-自习室座位预约系统-Java/Python项目实战

✨作者主页&#xff1a;IT毕设梦工厂✨ 个人简介&#xff1a;曾从事计算机专业培训教学&#xff0c;擅长Java、Python、微信小程序、Golang、安卓Android等项目实战。接项目定制开发、代码讲解、答辩教学、文档编写、降重等。 ☑文末获取源码☑ 精彩专栏推荐⬇⬇⬇ Java项目 Py…...

android13 删除兼容性警告窗口 deprecation warning 去除弃用警告

总纲 android13 rom 开发总纲说明 目录 1.前言 2.情况 3.问题分析 4.代码更改 5.编译测试 6.彩蛋 1.前言 在 Android 13 中,为了提高用户体验和应用的兼容性,系统引入了一些新的隐私和安全特性。这些特性可能会影响旧版应用的行为,因此当用户运行可能不完全兼容 An…...

JESD204B/C协议学习笔记

JESD204B基础概念 204B包含传输层&#xff0c;链路层&#xff0c;物理层。 应用层是对 JESD204B 进行配置的接口&#xff0c;在标准协议中是不含此层&#xff0c;只是为了便于理解&#xff0c;添加的一个层。 协议层指工程中生成的IP核JESD204B&#xff0c;负责处理输入的用户…...

网络安全-渗透测试工具及插件介绍和使用方法

1、Burp Suite Burp Suite 是用于攻击web 应用程序的集成平台。 是一款广泛使用的网络安全工具套件&#xff0c;主要用于测试Web应用程序的安全性。它可以帮助安全研究人员、渗透测试人员和开发人员发现和利用Web应用程序中的安全漏洞。 &#xff08;1&#xff09;下载和安装&a…...

JAVA WEB初步实验

Spring应用开发环境准备 安装配置Spring应用开发环境 熟悉IntelliJ IDEA开发工具 打开idea工具&#xff0c;创建普通Java工程 配置普通Java工程运行环境 得到基本的Java运行环境配置正常 修改pom.xml文件&#xff0c;搭建Spring IOC运行环境 更新pom文件 新建User、TestSpr…...

30 个 JavaScript 技巧,让你的代码更具可读性

1 、使用 !! 转换为布尔值 使用双重否定快速将任何值转换为布尔值。 let truthyValue !!1; // true let falsyValue !!0; // false 2 、 默认函数参数 设置函数参数的默认值以避免定义错误。 function greet(name "Guest") {return Hello, ${name}!; }greet(…...

电商行业中选择分账系统的关键因素!

分账是指将一笔交易的款项拆分成多个部分&#xff0c;按照预先设定的比例或规则分配给相关方。在电商行业中&#xff0c;分账通常是指将交易金额分给卖家、平台和其他相关方。 具体来说&#xff0c;分账可以帮助实现以下目标&#xff1a; 卖家结算&#xff1a;将顾客支付的货…...

通过继承实现状态模式(C++)

注意&#xff1a;先做类的声明和抽象基类的声明 抽象基类的函数方法中引入类&#xff0c;具体方法在类的实现后面声明。 在抽象基类的子类的函数中可以调用类的成员函数。 #include <iostream>using namespace std;class Contex;class state { public:virtual void Ha…...

全国多地公布2024下半年软考报名具体时间

下半年开考科目&#xff1a; 高级资格&#xff1a;系统分析师、系统架构设计师、网络规划设计师、系统规划与管理师 中级资格&#xff1a;软件设计师、网络工程师、信息安全工程师、信息系统监理师、多媒体应用设计师、系统集成项目管理工程师 初级资格&#xff1a;网络管理…...

【Python】requests的response.text 和 urllib.request 的 response.read()的区别

刚写代码的时候&#xff0c;我经常会把requests 和 urllib下的request 包搞混&#xff0c;这两个请求响应的方法看起来很相似&#xff0c;但是写获取的方法是不一样的。 前者requests 是用response.text 来获取源码&#xff0c;而 urllib.request是用 response.read() 来获取h…...

Obsidian插件安装与开发

大概背景 事情的起因还是因为做笔记&#xff0c;我喜欢利用插件Obsidian Git自动同步笔记到Gitee&#xff0c;写md文档有个问题就是关于图片如何存储。 我个人习惯是将所有图片都保存到指定的文件夹下&#xff0c;如图&#x1f447; 由于Obsidian对粘贴图片默认格式为这样的&…...

lvs的dr模式实现

目录 一、实验环境准备 1、五台红帽9系统的主机 2、关闭所有的防火墙以及关闭selinux 二、在lvs中配置 1、在lvs中安装lvs软件并设置开机启动 2、在lvs中打开内核路由功能&#xff0c;并把它写入/etc/sysctl.conf文件中 3、webserver1和webserver2下载httpd 4、在lvs主机…...

KubeSphere 容器平台高可用:环境搭建与可视化操作指南

Linux_k8s篇 欢迎来到Linux的世界&#xff0c;看笔记好好学多敲多打&#xff0c;每个人都是大神&#xff01; 题目&#xff1a;KubeSphere 容器平台高可用&#xff1a;环境搭建与可视化操作指南 版本号: 1.0,0 作者: 老王要学习 日期: 2025.06.05 适用环境: Ubuntu22 文档说…...

LeetCode - 394. 字符串解码

题目 394. 字符串解码 - 力扣&#xff08;LeetCode&#xff09; 思路 使用两个栈&#xff1a;一个存储重复次数&#xff0c;一个存储字符串 遍历输入字符串&#xff1a; 数字处理&#xff1a;遇到数字时&#xff0c;累积计算重复次数左括号处理&#xff1a;保存当前状态&a…...

基于当前项目通过npm包形式暴露公共组件

1.package.sjon文件配置 其中xh-flowable就是暴露出去的npm包名 2.创建tpyes文件夹&#xff0c;并新增内容 3.创建package文件夹...

mysql已经安装,但是通过rpm -q 没有找mysql相关的已安装包

文章目录 现象&#xff1a;mysql已经安装&#xff0c;但是通过rpm -q 没有找mysql相关的已安装包遇到 rpm 命令找不到已经安装的 MySQL 包时&#xff0c;可能是因为以下几个原因&#xff1a;1.MySQL 不是通过 RPM 包安装的2.RPM 数据库损坏3.使用了不同的包名或路径4.使用其他包…...

分布式增量爬虫实现方案

之前我们在讨论的是分布式爬虫如何实现增量爬取。增量爬虫的目标是只爬取新产生或发生变化的页面&#xff0c;避免重复抓取&#xff0c;以节省资源和时间。 在分布式环境下&#xff0c;增量爬虫的实现需要考虑多个爬虫节点之间的协调和去重。 另一种思路&#xff1a;将增量判…...

推荐 github 项目:GeminiImageApp(图片生成方向,可以做一定的素材)

推荐 github 项目:GeminiImageApp(图片生成方向&#xff0c;可以做一定的素材) 这个项目能干嘛? 使用 gemini 2.0 的 api 和 google 其他的 api 来做衍生处理 简化和优化了文生图和图生图的行为(我的最主要) 并且有一些目标检测和切割(我用不到) 视频和 imagefx 因为没 a…...

【笔记】WSL 中 Rust 安装与测试完整记录

#工作记录 WSL 中 Rust 安装与测试完整记录 1. 运行环境 系统&#xff1a;Ubuntu 24.04 LTS (WSL2)架构&#xff1a;x86_64 (GNU/Linux)Rust 版本&#xff1a;rustc 1.87.0 (2025-05-09)Cargo 版本&#xff1a;cargo 1.87.0 (2025-05-06) 2. 安装 Rust 2.1 使用 Rust 官方安…...

JS手写代码篇----使用Promise封装AJAX请求

15、使用Promise封装AJAX请求 promise就有reject和resolve了&#xff0c;就不必写成功和失败的回调函数了 const BASEURL ./手写ajax/test.jsonfunction promiseAjax() {return new Promise((resolve, reject) > {const xhr new XMLHttpRequest();xhr.open("get&quo…...

Golang——6、指针和结构体

指针和结构体 1、指针1.1、指针地址和指针类型1.2、指针取值1.3、new和make 2、结构体2.1、type关键字的使用2.2、结构体的定义和初始化2.3、结构体方法和接收者2.4、给任意类型添加方法2.5、结构体的匿名字段2.6、嵌套结构体2.7、嵌套匿名结构体2.8、结构体的继承 3、结构体与…...

android RelativeLayout布局

<?xml version"1.0" encoding"utf-8"?> <RelativeLayout xmlns:android"http://schemas.android.com/apk/res/android"android:layout_width"match_parent"android:layout_height"match_parent"android:gravity&…...