日常工作中经常需要进行文件类型的转换,有时还要批量操作,如要把近百个 Word 文档需要转为 PDF, 怎么办?
难道要一个一个的导出吗?
确实,Office2010 以后版本的 Word 可以直接导出 PDF,是时候让 Python 来替我们干这个重复性的活了!
直接上代码:from win32com.client import Dispatch,constants,gencache
import time
import os
path = os.getcwd()
start_time = time.time()
files = os.listdir(path)
gencache.EnsureModule('{00020905-0000-0000-C000-000000000046}',0,8,4)
wd = Dispatch('Word.Application')
for file in files:
if file.split('.')[-1] in ['docx','doc']:
word_path = path + '\\'+ file
file_list = (file.split('.')[-2::-1])[::-1]
pdf_file = "".join(file_list)
pdf_path = path + '\\'+ pdf_file + '.pdf'
print('正在转换:')
print('《{}》'.format(file))
doc = wd.Documents.Open(word_path,ReadOnly=1)
doc.ExportAsFixedFormat(pdf_path,constants.wdExportFormatPDF,Item=constants.wdExportDocumentWithMarkup,CreateBookmarks=constants.wdExportCreateHeadingBookmarks)
print('上述文件转换完成!')
print('')
wd.Quit(constants.wdDoNotSaveChanges)
end_time = time.time()
print("该文件夹下的Word文件已转为PDF,用时:{:.2f}秒!".format(z,end_time-start_time))
time.sleep(5)
代码解释
这个程序可以操作任意文件夹,不受文件夹所在位置的影响。
只需要将它丢在需要转换的 Word 文件文件夹里,它就可以读取出所在文件夹下所有的 Word 文件,并进行转换。
主要用到了下面几个方法:
1、获取任意文件夹下文件名称import os
path = os.getcwd()
files = os.listdir(path)os.getcwd() :获取程序所在文件的路径,结果存入 path 中;
os.listdir():获取 path 路径下的所有文件名称,结果存入 files 中。
2、筛选出 Word 文件for file in files:
if file.split('.')[-1] in ['docx','doc']:
使用字符串的split函数,用.号将文件名称分割。
file.split('.')[-1]:将 Word 文件的名称以.号分割,形成一个列表,取出这个列表的最后一项(即 Word 文件后缀名称),判断其是不是docx或doc,如果是,则说明是 Word 文件,则生成两个路径:
3、计算出 Word、PDF 的路径word_path = path + '\\'+ file
file_list = (file.split('.')[-2::-1])[::-1]
pdf_file = "".join(file_list)
pdf_path = path + '\\'+ pdf_file + '.pdf'word_path:Word 文件路径,用来告诉程序打开哪一个 Word 文件;
pdf_path:PDF 文件路径,用来告诉程序,转换后的 PDF 文件名称和存储路径。
在计算 PDF 文件路径时,需要先去掉 Word 文件的后缀:docx或doc,再加上.pdf。
有时候,Word 文件的名称中可能含有多个.号,因为我们是通过.号将 Word 文件名称分割的,这样可能会导致计算的 PDF 文件名称和 Word 文件名称不同。
因此,为了避免出现这种样的错误,我们进行以下操作:(file.split('.')[-2::-1]):按照逆序,取出除了后缀名称外的内容。
(file.split('.')[-2::-1])[::-1]:转为正序,即正常的文件名称。
pdf_file = "".join(file_list):将列表拼接成一个字符串。
pdf_path = path + '\\'+ pdf_file + '.pdf':最后给文件名称加上.pdf的后缀。
这样就完成了 Word、PDF 的路径计算。
4、调用 Word 功能
下面这些代码的功能是调用 Word 程序:gencache.EnsureModule('{00020905-0000-0000-C000-000000000046}',0,8,4)
# 这是指向注册表的键,我们要调用它。
wd = Dispatch('Word.Application')
#启用 Word
doc = wd.Documents.Open(word_path,ReadOnly=1)
# 只读方式打开 Word 文档
wd.Quit(constants.wdDoNotSaveChanges)
# 关闭 Word
关键操作就是下面这行代码,它定义了按特定格式导出的参数,模拟人工操作。doc.ExportAsFixedFormat(pdf_path,constants.wdExportFormatPDF,Item=constants.wdExportDocumentWithMarkup,CreateBookmarks=constants.wdExportCreateHeadingBookmarks)