关于python:如何将Word文档批量转换为PDF文档

Q:

        我们在实际工作中很容易发现,有些时候我们需要将Word文档转换为PDF文档,如果只是一个文件,我们也只是需要通过Word提供的转换为PDF文档的功能就可以实现了。但是WPS需要收费才能使用将Word转换为PDF文档的服务,而且Microsoft Word安装更新等等一系列问题出现。而且当我们要转换文档非常多的时候,转换则变得费时费力;可见手动转换文档就成为了鸡肋。

       本篇博文将教会大家如何用Python程序实现自动化方式批量转换文件格式。

提前准备

       如果想要批量把Word文档转换为PDF文档,我们可以使用第三方模块win32com。步骤如下:

    (1)在CMD命令窗口中安装win32com模块,如果读者有Pycharm,可以在Pycharm的Terminal(控制台)中输入命令Pycharm对应命令:

pip install pywin32

引入模块函数

(2)通过导入pywin32模块,创建Python文件。在该文件中导入win32com模块及其他辅助模块。应用代码及注释如下:

import os    # 导入系统功能模块
from win32com.client import Dispatch,DispatchEx    # 导入win32com模块的client包下的函数
from win32com.client import constants    # 导入win32com模块的client包下的保存COM常量的类。
from win32com.client import gencache    # 导入win2com模块的client包下的gencache()函数
import re    # 导入正则表达式模块

自定义转换文件格式函数

(3)如果想要实现将Word文档转换为PDF文档,这里使用自定义方法定义函数:wordtopdf。该函数包含了两个参数,第一个参数表示要转换的文件路径列表;第二个参数表示转换后的文件保存的路径。在这个函数中,要注意的是首先调用win32com模块的Dispatch()函数获取Word应用程序对象;然后通过遍历文件列表中的Word文件名称,并且生成对应名称的PDF文件;最后通过Word应用程序对象的文档对象的open()方法打开Word文档并且进行转换。具体逻辑如下:

def wordtopdf(filelist,targetpath):
    valueList = []
    try:
        gencache.EnsureModule('{00020905-0000-0000-C000-000000000046}',0,8,4)
        # 开始转换
        w = Dispatch("Word.Application")
        for fullfilename in filelist:
            # 分割文件路径和文件名,其中,filepath表示文件路径,filename表示文件名
            (filepath,filename) = os.path.spilt(fullfilename)
            softfilename = os.path.split(filename)  # 分割文件名和扩展名
            os.chdir(filepath)
            doc = os.path.abspath(filename)
            os.chdir(targetpath)
            pdfname = softfilename[0]+".pdf"
            output = os.path.abspath(pdfname)
            pdf_name = output
            
            # 文档路径需要为绝对路径,Word启动之后的当前路径不是调用脚本时的当前路径
            try:
                doc = w.Document.Open(doc,ReadOnly = 1)
                doc.ExportAsFixedFormat(output,constants.wdExportFormatPDF,
                                        Item = constants.wdExportDocumentWithMarkup,
                                        CreateBookmarks = constants.wdExportCreateHeadingBookmarks)
            except Exception as e:          # 处理异常
                print(e)
            if os.path.isfile(pdf_name):        # 判断文件是否存在
                valueList.append(pdf_name)      # 添加到文件列表中
            else:
                print('转换失败!!!')
                return False
            w.Quit(constants.wdDoNotSaveChanges)        # 退出Word应用程序
            return valueList
    except TypeError as e:
        print('出错了!!!')
        print(e)
        return False

自定义遍历路径下文件格式 

  (4)由于要转换多个Word文档,索引需要实现或许指定的路径下全部的Word文件路径的功能。接下来我们再定义一个函数:getfilenames(),用于获取到指定路径下的指定扩展名的文件路径(也包括子目录下的文件)。在这个自定义的函数中,根据传递的路径遍历出该路径下的指定扩展名的文件。如果是Word文档,需要它同时遍历出.doc和.docx格式的文档。getfilenames()函数的具体逻辑如下:

def getfilenames(filepath='',filelist_out = [],file_ext = 'all'):
    # 遍历filepath下的所有文件,包括子目录下的文件
    for fpath,dirs,fs in os.walk(filepath):
        for f in fs:
            fi_d = os.path.join(fpath,f)
            if file_ext == '.doc':                          # 遍历Word文档文件
                if os.path.splitext(fi_d)[1] in ['.doc','.docx']:   # 判断是否为Word文件
                    filelist_out.append(re.sub(r'\\','/',fi_d))     # 添加到路径列表中
            else:
                if file_ext =='all':                                # 要获取所有文件的情况
                    filelist_out.append(fi_d)                       # 将文件路径添加到路径列表中
                elif os.path.splitext(fi_d)[1]==file_ext:           # 要获取除了Word文件以外的文件
                    filelist_out.append(fi_d)                       # 将文件路径添加到路径列表中
                else:
                    pass
        filelist_out.sort()                                         # 对路径进行排序
    return filelist_out                                             # 返回文件完整路径中

调用前两个自定义函数    

(5)第五步就是要进行函数调用的过程,对两个函数体中的变量在该函数中进行赋值,然后执行已经声明的方法,在函数体中进行调用。分别实现单个的Word文件转换为PDF文件和多个Word文件进行转换。首先实现的是利用getfilename()函数得到要转换的文件路径,然后再使用wordtopdf()函数实现批量转换文件格式。

if __name__ == '__main__':
    sourcepath =r"C:\Users\Administrator\Desktop\转换格式文档"        # 这里要指定路径(Word文档所在路径)
    targetpath =r"C:\Users\Administrator\Desktop\转换格式文档"        # 这里要及性能指定目标路径(PDF文件保存路径)
    filelist = getfilenames(sourcepath,[],'.doc')                    # 获取Word文件路径
    valuelist = wordtopdf(filelist,targetpath)                       # 实现Word文件批量转换为PDF文件
    if valuelist:
        print("转换成功!!!")
    else:
        print("转换失败!!!")

效果图:关于python:如何将Word文档批量转换为PDF文档_第1张图片

关于python:如何将Word文档批量转换为PDF文档_第2张图片

 

你可能感兴趣的:(Python,解决方案)