本文介绍了一种使用 Python 脚本来完成这项工作的方法,该脚本基于 PyMuPDF、pdf2image 和 win32com 库实现,可以帮助您快速地将 Word 文档转换为 PDF 文件,并将 PDF 文件转换为 PNG 图片。
一、安装所需的库和软件
在开始使用该脚本之前,您需要先安装所需的 Python 模块和相关的软件。具体来说,您需要安装 PyMuPDF、pdf2image 和 win32com 三个库,以及 Microsoft Word 软件和 Poppler 程序。可以通过以下命令来安装 Python 模块:
pip install PyMuPDF
pip install pdf2image
pip install pypiwin32
PyMuPDF 库用于将 PDF 文件转换为图片;pdf2image 库用于将 PDF 文件转换为 PNG 图片;pypiwin32 库用于与 Microsoft Word 软件进行交互和文档转换。另外,还需要下载并安装 Microsoft Word 软件,并将 Poppler 程序的路径添加到系统环境变量中。
二、加载并转换 Word 文档
在完成所需的库和软件安装后,就可以开始使用脚本了。脚本主要分为三个部分,分别是将 Word 文档转换为 docx 文件、将 docx 文件转换为 PDF 文件、将 PDF 文件转换为 PNG 图片。
首先,我们需要加载并转换 Word 文档。在代码中,我们使用os.listdir()方法读取指定路径下的所有文件名,然后使用split()方法将文件名按“.”分割成文件名和文件后缀。如果文件后缀为“doc”,则使用 win32com 库打开 Word 应用程序,并使用 Dispatch() 方法从文档对象中创建了一个新的 Word 应用程序。然后,将相应路径下的当前文件打开,并将其转换为 docx 格式文件。最后关闭 Word 应用程序,并等待 3 秒钟,系统释放资源。
for i in os.listdir(path):
file_name,file_suffix = i.split(".")
if file_suffix == "doc":
word = Dispatch('Word.Application')
doc = word.Documents.Open(path+f"{i}")
# 将 Word 文档转换为 docx 格式文件
doc.SaveAs(path+f"{file_name}.docx",FileFormat=12)
print(i,"转换完成")
doc.Close()
word.Quit()
sleep(3)
SaveAs() 方法接受两个参数,分别是输出文件路径和输出文件格式。其中,FileFormat 参数用于指定输出文件的格式,12 表示输出为 docx 格式文件
三、加载并转换 pdf文档
将上诉代码修改为:
# 将 Word 文档转换为 docx 格式文件
doc.SaveAs(path+f"{file_name}.docx",FileFormat=17)
FileFormat 参数用于指定输出文件的格式,17 表示输出为 PDF 格式文件。
四、将 PDF 文件转换为 PNG 图片
完成 PDF 文件的转换后,我们就可以将其转换为 PNG 图片了。在代码中,我们使用 PyMuPDF 库打开指定路径下的 PDF 文件,并获取该文件的总页数。然后,使用 pdf2image 库中的 convert_from_path() 方法遍历 PDF 中的每一页,并将其转换为 PNG 格式的图片。最后,将 PNG 图片保存到指定路径下,并输出转换进度。
for filename in os.listdir(path):
if filename.endswith(".pdf"):
# 获取当前 PDF 文件的总页数
doc = fitz.open(path + filename)
total_pages = doc.page_count
doc.close()
print(f"正在转换 {filename},共 {total_pages} 页...")
for i, page in enumerate(convert_from_path(path + filename, grayscale=False), start=1):
# 构造文件名
output_filename = os.path.splitext(filename)[0] + "_" + str(i) + ".png"
# 保存图片
page.save(path_images + output_filename, "png")
# 输出转换进度
print(f"已完成第 {i}/{total_pages} 页的转换")
五、完整代码
# -*- coding: utf-8 -*-
"""
Created on Wed May 31 17:10:27 2023
@author: ypzhao
"""
import os
import fitz
from pdf2image import convert_from_path
from time import sleep
from win32com.client import Dispatch
# 定义PDF文件路径和输出区间路径
# 待转换pdf文件路径
path = "C:/Users/ypzhao/Desktop/pdf/"
# doc/docx转换后的路径
path_convert = "C:/Users/ypzhao/Desktop/pdf/"
# 转换后的图片路径
path_images = "C:/Users/ypzhao/Desktop/images/"
print("-----doc开始转换为docx-----")
for i in os.listdir(path):
file_name,file_suffix = i.split(".")
if file_suffix == "doc":
word = Dispatch('Word.Application')
doc = word.Documents.Open(path+f"{i}")
doc.SaveAs(path+f"{file_name}.docx",FileFormat=12)
print(i,"转换完成")
doc.Close()
word.Quit()
sleep(3)
print("-----开始转换为pdf-----")
for i in os.listdir(path):
file_name,file_suffix = i.split(".")
if file_suffix == "docx":
word = Dispatch('Word.Application')
doc = word.Documents.Open(path+f"{i}")
doc.SaveAs(path_convert+f"{file_name}.pdf",FileFormat=17)
print(i,"...转换完成")
doc.Close()
word.Quit()
sleep(3)
else:
pass
# 循环遍历PDF文件,并转换为图片
for filename in os.listdir(path):
if filename.endswith(".pdf"):
# 获取当前 PDF 文件的总页数
doc = fitz.open(path + filename)
total_pages = doc.page_count
doc.close()
print(f"正在转换 {filename},共 {total_pages} 页...")
#按照原图输出pdf文件为word
#若想黑白输出pdf为图片格式,修改grayscale=False为grayscale=True
for i, page in enumerate(convert_from_path(path + filename, grayscale=False), start=1):
# 构造文件名
output_filename = os.path.splitext(filename)[0] + "_" + str(i) + ".png"
# 保存图片
page.save(path_images + output_filename, "png")
# 输出转换进度
print(f"已完成第 {i}/{total_pages} 页的转换")
print("-----已完成所有转换-----")