import os
import comtypes.client
# The comtypes package — comtypes 1.1.3 documentation
# https://pythonhosted.org/comtypes/#accessing-properties
# 指定要转换的文件类型
EXTENSIONS = ['.doc', '.docx', '.xls', '.xlsx']
# 定义转换失败的文件列表
failed_files = []
# 定义转换函数
def convert_to_pdf(fp):
try:
# 从待转换文件的路径,你才可以获取文件名(包括拓展名的文件名)
filename = os.path.basename(fp)
# 获取文件名和扩展名
name, ext = os.path.splitext(filename)
# 先预设打开文件对象为None,如果文件成功打开,就不会是None了
file = None
# 判断文件类型是否在指定的扩展名列表中
if ext in EXTENSIONS:
# 创建转换器
pdf_format_key = "Word.Application" if ext in [".doc", ".docx"] else "Excel.Application"
converter = comtypes.client.CreateObject(pdf_format_key)
# 保存为PDF格式
new_name = name + '.pdf'
# 判定文件类型
if pdf_format_key == "Word.Application":
# 打开文件
file = converter.Documents.Open(os.path.abspath(fp))
file.SaveAs(os.path.abspath(new_name), FileFormat=17)
elif pdf_format_key == "Excel.Application":
# https://www.cnpython.com/qa/373468
file = converter.Workbooks.Open(os.path.abspath(fp))
file.ExportAsFixedFormat(0, new_name, 1, 0)
except Exception as e:
# 记录转换失败的文件
failed_files.append(filename)
print(f"转换失败: {filename},错误信息: {e}")
finally:
# 关闭文件
if file is not None:
file.Close()
# 定义处理文件夹函数
def process_folder(folder):
for dirpath, dirnames, files in os.walk(folder):
for filename in files:
# 转换文件,你这里传入的是路径
convert_to_pdf(os.path.join(dirpath, filename))
# 定义主函数
if __name__ == '__main__':
# 指定要处理的文件夹
folder = r'E:\temp'
# 处理文件夹中的所有子文件夹
process_folder(folder)
# 输出转换失败的文件列表
if failed_files:
print('以下文件转换失败:')
for filename in failed_files:
print(filename)
else:
print('所有文件已成功转换为 PDF 文件')
- 我大致改了改,也没跑这段代码
- 我最近是用
pathlib 而非os.path 来处理路径
- 你给
convert_to_pdf 传的肯定是文件路径,而不仅仅是文件名
- 在函数里需要重新获取下文件名,比如用 os.path.basename
- 另外,也有其他人提到的,打开word和打开excel用的API是不一样的,比如Workbooks.Open和Documents.Open
- 因为我之前转pdf用的都是pywin32,所以我记得导出的时候FileFormat的值也不同
- 然后我搜了一下 comtyps excel 转 pdf,发现有一篇文章提到用的是 ExportAsFixedFormat。
- 我建议你导出的时候也指定一下导出文件夹。
|