# -*- coding:utf-8 -*-
import os # 导入系统功能模块
from win32com.client import Dispatch, DispatchEx # 导入pywin32模块的client包下的函数
from win32com.client import constants # 导入pywin32模块的client包下的保存COM常量的类
from win32com.client import gencache # 导入pywin32模块的client包下的gencache函数
import re # 导入正则表达式模块
import sys, codecs # 导入标准模块
from PyPDF2 import PdfFileReader, PdfFileMerger # 导入第三方模块PyPDF2
'''
合并pdf文件,输出的pdf文件按输入的pdf文件名生成书签
'''
def mergefiles(path, output_filename, import_bookmarks=False):
''' 遍历目录下的所有pdf将其合并输出到一个pdf文件中, # 返回数字(将按该数字排序)输出的pdf文件默认带书签,
书签名为之前的文件名。默认情况下原始文件的书签不会导入,使用import_bookmarks=True可以将原文件所带的书签也
导入到输出的PDF文件中
'''
merger = PdfFileMerger() # 创建PDF合并对象
filelist = getfilenames(filepath=path,filelist_out=[], file_ext='.pdf') # 获取要合并的PDF文件
if len(filelist) == 0: # 判断是否存在要合并的文件
print("当前目录及子目录下不存在pdf文件")
sys.exit() # 退出文件系统
for filename in filelist: # 遍历文件列表
f = codecs.open(filename, 'rb') # 使用codecs的open()方法打开文件时,会自动转换为内部Unicode编码
file_rd = PdfFileReader(f)
short_filename = os.path.basename(os.path.splitext(filename)[0]) # 获取文件名称(不包括文件路径)
if file_rd.isEncrypted == True:
print('不支持的加密文件:%s'%(filename))
continue
merger.append(file_rd, bookmark=short_filename, import_bookmarks=import_bookmarks)
f.close() # 关闭文件对象
out_filename=os.path.join(os.path.abspath(path), output_filename) # 将文件名和路径连接为一个完整路径
merger.write(out_filename) # 写入内容
merger.close() # 关闭PDF合并对象
'''获取指定目录下的文件
filepath:要遍历的目录
filelist_out:输出文件列表
file_ext:文件的扩展名,默认为任何类型的文件
'''
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 # 返回文件完整路径列表
'''
功能:提取目录并保存到新的Word文档中
pdfpath:合并后的PDF文件绝对路径,包括文件名
listpath:目标路径
isPage:是否包含页码
level:目录层数
'''
def getPdfOutlines(pdfpath,listpath,isPage,level):
with open(pdfpath, "rb") as file:
doc = PdfFileReader(file)
outlines = doc.getOutlines() # 获取大纲
global returnlist # 全局变量,保存大纲的列表
returnlist = [] # 创建一个空列表
mylist = getOutline(outlines,isPage,level) # 递归获取大纲
w = DispatchEx("Word.Application") # 创建Word文档应用程序对象
w.Visible = 1
w.DisplayAlerts = 0
doc1 = w.Documents.Add()# 添加一个Word文档对象
range1 = doc1.Range(0,0)
for item in mylist: # 通过循环将获取的目录列表插入到Word文档对象中
range1.InsertAfter(item)
outpath = os.path.join(listpath,'list.docx') # 连接Word文档路径
doc1.SaveAs(outpath) # 保存文件
doc1.Close() # 关闭Word文档对象
w.Quit() # 退出Word文档应用程序对象
return outpath
'''
功能:提取指定层级的大纲
obj:Word文档的大纲对象
isPage:是否包含页码
selectLevel:目录层级,值为0~3的数。0表示全部大纲、1表示一级大纲……
'''
def getOutline(obj,isPage,selectLevel): # 获取指定层级的大纲
global returnlist
for o in obj:
if selectLevel == 1: # 只提取一级标题
if type(o).__name__ == 'Destination':
dealPage(o, isPage) # 输出大纲内容(处理是否包含页码)
elif selectLevel == 2: # 提取到二级标题
if type(o).__name__ == 'Destination':
dealPage(o, isPage) # 输出大纲内容(处理是否包含页码)
elif type(o).__name__ == 'list':
getOne(o, isPage)
elif selectLevel == 3: # 提取到三级标题
if type(o).__name__ == 'Destination':
dealPage(o, isPage) # 输出大纲内容(处理是否包含页码)
elif type(o).__name__ == 'list':
for o1 in o:
if type(o1).__name__ == 'Destination':
dealPage(o1, isPage) # 输出大纲内容(处理是否包含页码)
elif type(o1).__name__ == 'list':
getOne(o1, isPage)
return returnlist
def getOne(obj,isPage): # 获取当前一级大纲
for o in obj:
if type(o).__name__ == 'Destination':
dealPage(o, isPage) # 输出大纲内容(处理是否包含页码)
return returnlist
# 输出大纲内容(处理是否包含页码)
def dealPage(o,isPage):
if isPage: # 包括页码
returnlist.append(o.get('/Title') + "\t\t" + str(o.get('/Page') + 1) + "\n")
else: # 不包括页码
returnlist.append(o.get('/Title') + "\n")
# Word转换为PDF(多个文件)
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) = os.path.split(fullfilename) # 分割文件路径和文件名,其中,filepath表示文件路径;filename表示文件名
softfilename = os.path.splitext(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.Documents.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('转换失败!')
没有合适的资源?快使用搜索试试~ 我知道了~
温馨提示
平时办公的时候总有word文档转换pdf的操作,关键wps等转换工具都还是收费的。这里利用python代码把多个word文档转换成pdf文档的实现。代码运行需要几个必要库,没有下载安装的小伙伴可以看看下面闭坑。安装第一个就失败了,大家直接官网下载安装就行。后面两个包可以直接安装。查了下相关文章,说更新下pip能安装成功,反正我没成功。最后在官网下载的,选择匹配的python版本就可以了,
资源推荐
资源详情
资源评论
收起资源包目录
word转pdf.rar (1个子文件)
getlist.py 9KB
共 1 条
- 1
资源评论
逃逸的卡路里
- 粉丝: 1w+
- 资源: 4615
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功