Python实现批量word文档转pdf并统计其页码
作者:逃逸的卡路里 发布时间:2023-08-19 13:29:40
pypdf2是一个Python模块,可以用来读取、写入和操作PDF文件。要安装pypdf2模块,请按照以下步骤操作:
确保你已经安装了Python。你可以在终端或命令提示符中输入python --version来检查Python是否已安装。
pypdf2模块的安装:
ModuleNotFoundError: No module named ‘PyPDF2’
安装完成后,你可以在Python中使用pypdf2模块来读取、写入和操作PDF文件。
例如,要读取一个PDF文件中的文本内容,你可以在Python脚本中导入pypdf2模块,然后使用PdfFileReader类读取文件并遍历每个页面。下面是一个简单的示例代码:
import pypdf2
pdf_file = pypdf2.PdfFileReader('example.pdf')
for page_num in range(pdf_file.getNumPages()):
page = pdf_file.getPage(page_num)
print(page.extractText())
这将打印出PDF文件中的每个页面的文本内容。
注意:
因PyPDF2 版本更新原因,一些类和函数已经过时,想要采用替代函数,例如获取pdf 页数 getNumPages 替换为直接使用 len(reader.pages)。
下面是两个报错的提示,把函数替换掉就行
PyPDF2.errors.DeprecationError: PdfFileReader is deprecated and was removed in PyPDF2 3.0.0. Use PdfReader instead.
PyPDF2.errors.DeprecationError: reader.getNumPages is deprecated and was removed in PyPDF2 3.0.0. Use len(reader.pages) instead.
利用Python代码实现批量word文档转换成PDF格式
并对转换的文档,进行页码统计,如下(代码示例)
# -*- 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函数
from PyPDF2 import PdfReader # 获取页码用
import re # 导入正则表达式模块
import pythoncom # 导入封装了OLE自动化API的模块,该模块为pywin32的子模块
'''获取指定目录下的文件
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: # 要获取除了Wrod文件以外的文件
filelist_out.append(fi_d) # 将文件路径添加到路径列表中
else:
pass
filelist_out.sort() # 对路径进行排序
return filelist_out # 返回文件完整路径列表
# Word转换为PDF(多个文件)
def wordtopdf(filelist,targetpath):
totalPages = 0 # 记录总页码
valueList = []
try:
pythoncom.CoInitialize() # 调用线程初始化COM库,解决调用Word 2007时出现“尚未调用CoInitialize”错误的问题
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): # 判断文件是否存在
# 获取页码
pages = getPdfPageNum(pdf_name) # 获取页码
valueList.append([fullfilename,str(pages)])
totalPages += pages # 累加页码
# os.remove(pdf_name) # 删除生成的PDF文件
else:
print('转换失败!')
return False
w.Quit(constants.wdDoNotSaveChanges) # 退出Word应用程序
return totalPages,valueList # 返回总页码和每个文档的页码
except TypeError as e:
print('出错了!')
print(e)
return False
'''
功能:统计文档页码
path:文件绝对路径
'''
def getPdfPageNum(path):
with open(path, "rb") as file:
doc = PdfReader(file)
pagecount = len(doc.pages)
return pagecount
if __name__ == '__main__':
sourcepath = r"C:/Users/Lenovo/Desktop/python代码示例/word/" # 指定源路径(Word文档所在路径)
targetpath = r"C:/Users/Lenovo/Desktop/python代码示例/pdf/" # 指定目标路径(PDF保存路径)
filelist = getfilenames(sourcepath,[],'.doc') # 获取Word文档路径
valueList = wordtopdf(filelist,targetpath) # 实现将Word文档批量转换为PDF
resultList = valueList[1] # 获取统计结果
if valueList:
for i in resultList:
print(i[0],i[1])
totalPages = str(valueList[0]) # 总页数
print("合计页数:",totalPages)
else:
print("没有要统计的文件或者统计失败!")
来源:https://blog.csdn.net/u014740628/article/details/130885683
猜你喜欢
- 首先来看一下代码:chars = "abcd"tmp = []for char in chars: tmp.append
- 最近产品妹子提出了一个体验issue —— 用 iOS 在手Q阅读书友交流区发表书评时,光标点击总是不好定位到正确的位置:如上图,具体表现是
- 在我看来学习不难,配置一些环境真的很痛苦,之前的caffe配置,一口老血。。不过用Python遇到了pip安装,真的赞,可是在用pip装te
- * 页爬取是爬虫学习中的一个难点。本文将以知名插画网站pixiv为例,简要介绍 * 页爬取的方法。写在前面本代码的功能是输入画师的pixi
- 我页面上有控制了只能输入数字的控件,禁止了输入法切换的,但是搜狗的云输入却控制不了,有没有办法在页面里面禁止它运行啊?发现这玩意儿真的很讨厌
- 很多朋友和我讨论了一些关于网站开发到底使用哪种语言最合适,尤其是到网站一定有一定流量的时候,到底那种web语言更适合做站呢,精灵这里根据自己
- Selenium对网页的控制是基于各种前端元素的,在使用过程中,对于元素的定位是基础,只有准去抓取到对应元素才能进行后续的自动化控制,我在这
- /** * 返回一个随机的小写字母 */ function getLowerCharacter(){ return getCharacter
- 1、说明curses提供了内置颜色可以让我们自定义前后背景。在使用彩色模式之前我们需要先使用使用curses.start_corlor()进
- 博主一直在维护一个导出PDF的服务,但是这个服务导出的PDF文件是真的巨大,动辄就上百MB。这里面主要是图片占据了大多数体积,所以考虑在导出
- 定时任务:1、 线程睡眠函数 sleep() ——粗暴!一直占有 CPU 资源,导致后续操作无法执行2、 threading.Timer(1
- 思考:测试用例执行后,如何生成一个直观漂亮的测试报告呢?分析:1.unittest单元测试框架本身带有一个textTestRunner类,可
- 前言大家都知道,Python自带的datetime库提供了将datetime转为ISO 8610格式的函数,但是对于时间间隔(inteval
- 如果您的网站面向世界各地的冲浪者或者对外开展商贸活动,检测来访者的浏览器语言类型就非常现实了。这里提供的脚本可以检测流露;浏览器
- 本文介绍了随机提取N条记录的例子,通过Sql server与access数据库的代码比较让你更快的掌握。随机提取10条记录的例子:Sql s
- 从有道词典网页获取某单词的中文解释。import reimport urllibword=raw_input('input a wo
- 提要:作为普通的Python开发者来讲,深入理解object、type不是必要的,但了解他们确实元编程这个词很多朋友都听过,可能用的却不多。
- 抽象方法和抽象类 在OOP 语言中,一个类可以有一个或多个子类,而每个类都有至少一个公有方法做为 外部代码访问其的接口。而抽象方法就是为了方
- 如下所示:将i前面加str(i)就可以了补充拓展:python 连接字符串和数字 python 连接字符串和数字的问题:首先要说的
- 如何用FILESYSTEMOBJECT组件来做一个站内搜索?看看下面我们提供的例子,主要由searchpage.htm和searchresu