Python将目录下的doc和docx文件转为pdf文件

好久都没有写过Python相关的文章了,其实也是因为我好久都没有碰Python了,今天收到了很多的练习题,但是发现全都是doc格式的,有一个docx格式的,网上找了找没有啥好用的在线转换,我总不可能自己一个一个打开然后另存新档吧?(虽然也是可以啦),所以就写了这么一段能够将目录下所有的档案都转换为pdf档案的东西。

注意:其实没有写检测是不是全部都是docx或者doc,如果其中混入了其他档案可能会崩溃,不过我自己个人用就没太在意。

前期准备

需要一个库,pywin32comtypes这两个二择一,我个人试过comtypes没办法弄之后查了一下发现pywin32的好像兼容性高一些(可能是我的电脑垃圾),所以就用了下面的 win32com,如果也是选用这个的话其实可以把 import comtypes.client 删掉,不然也可以两个都安装,安装指令:

pip install pywin32
pip install comtypes

那基本上其实就是安装一下库就行了,然后把所有的doc或者docx文件都放到一个目录,并且替换代码中的 input_pathoutput_path ,一个是输入目录,一个是输出目录,因为是在Win系统测试的关系,所以写的是Win的格式的目录,如果在Linux上运行的话可能就是写Linux的,不过我估计会崩(毕竟那个库叫 pywin32 嘛)

遇到的困难

写这个小程序真的是一波三折,首先上面也有提到过,一开始我用 comtypes 死活过不了,然后才转的pywin32,然而就是因为一开始在疯狂乱搞,搞出了一个以~$的乱码文件,然后我一时之间没注意到,搞到后面一直就是处理不了,我又花了十多分钟重写了一次也是这样,最好笑的是我进去那个文件夹,居然找不到这个乱码文件,最后只能靠切片来进行(就是 for file in files 切成 for file in files[1:]

代码

# -*- coding: UTF-8 -*-

from ntpath import join
import os
import sys
import comtypes.client
import win32com.client

input_path = r"C:\\Users\\Administrator\\Desktop\\doc_files\\"
output_path = r"C:\\Users\\Administrator\\Desktop\\Python\\doc2pdf\\result\\"
# w=win32com.client.constants

print("正在开始转化", input_path,"目录下的word文件到pdf文件到", output_path, "目录")

files = os.listdir(input_path)
word = win32com.client.Dispatch('Word.Application')
for file in files:

    input_file = os.path.abspath(join(input_path, file))
    output_file = os.path.abspath(join(output_path, file.replace('docx', 'pdf').replace('doc', 'pdf')))
    
    print('正在处理文件:', input_file, '转换为', output_file)

    
    # word.Visible = False
    doc = word.Documents.Open(input_file)
    doc.ExportAsFixedFormat(OutputFileName=output_file,
                            ExportFormat=17, #17 = PDF output, 18=XPS output
                            OpenAfterExport=False,
                            OptimizeFor=0,  #0=Print (higher res), 1=Screen (lower res)
                            CreateBookmarks=1, #0=No bookmarks, 1=Heading bookmarks only, 2=bookmarks match word bookmarks
                            DocStructureTags=True
                            )
    doc.Close()


    print('处理完成文件:', input_file)

word.Quit()
print("文件全部处理完成")