流畅的python pdf(python重命名文件夹)
来源:早起的Python
作者: dddmj
40个Python案例集
你好,我是早起的人。 本文将分享一个典型的办公场景中的Python自动化案例。 主要包括以下两个内容
Python提取基于图像的PDF内容。 Python批量重命名了文件
一、需求描述
。 在一个文件夹的货物列表中有一个包含多个货物列表的复制版PDF。 分别命名为文件(1).PDF文件).PDF…文件) 20 ).PDF,如下所示。
PDF是纯图像类型,不能手动复制其中的文字信息。 另外,在本例中,所有图像都向左旋转了90度。 大致如下图所示。 马赛克部分是无关的内容。
我们必须做的是“获取图中红色框部分的跟踪#和REF2冒号之后的字符串,连接后重命名该PDF文件”。
这意味着需要为每个PDF内容重命名大量文件,最终会产生以下效果
二、逻辑梳理与基础配置
本需求是批处理问题,需要对许多文件执行类型的操作。 基本的想法是,首先完成一个文件的处理,然后使用glob模块获取符合指定路径的所有文件路径,执行批处理框架,最后的操作首先对文件(1).pdf进行需求的最大难题是,PDF是图像类型,无法按常规方法提取文件。 解决方案是利用光学文字识别(OCR )识别图像中的文字,然后进行后续操作。 这里涉及到一些优先级。
向右旋转图像,使其返回到正位置
剪切想要识别的图像的一部分
将切取的图像传递给OCR以获取字符串
要完成OCR,需要在电脑上安装三个软件。
Ghostscript 32位元
影像32位元
tesseract-OCR 32位元
3个软件的下载安装没有什么特别之处,读者可以自己搜索下载和配置。 (tesseract的配置有点复杂,但网络上有很多教程。 ) ) )。
三、代码实现
首先引入必要的模块:来自wand.imageimportimage
fromPILimportImageasPI
导入程序
importpyocr.builders
导入io
导入地球
导入
导入程序
导入套件
具体的模块用途请参考以下具体代码。 其中,wand和pyocr是非标准库,必须单独安装。 打开命令行输入:
pipinstallwand
pipinstallpyocr
为了便于测试和之后的实际运行,需求中的货物清单这个文件夹可以放在桌面上。 为了获取其内容,首先明确桌面的路径。 每个电脑的桌面路径都不一样,直接复制现在电脑的桌面路径的话,为了更换电脑或者其他用户进行调试,需要进行追加的修改。 桌面路径可以从以下基于操作系统模块的代码中获取:
获取# # #桌面路径并包装到函数中
defGetDesktopPath () :
返回操作系统路径(操作系统路径)
xpanduser("~"), 'Desktop') path = GetDesktopPath() + r'\货物清单' # 获取 货物清单 文件夹路径获取配置好的 tesseract 便于后面调用:
tool = pyocr.get_available_tools()[0]以 文件 (1).pdf 为例,通过 wand 模块将 PDF 文件转化为分辨率为 300 的 jpeg 图片形式:
image_pdf = Image(filename=path + r'\文件 (1).pdf', resolution=300) image_jpeg = image_pdf.convert('jpeg')将图片解析为二进制矩阵:
image_lst = [] for img in image_jpeg.sequence: img_page = Image(image=img) image_lst.append(img_page.make_blob('jpeg'))用 io 模块的 BytesIO 方法读取二进制内容为图片形式:
new_img = PI.open(io.BytesIO(image_lst[0]))由于图片现在处于左旋 90 度的水平位,将其转为正位可以用 rotate() 方法,注意该方法是逆时针旋转,因此回正位需要逆时针旋转 270 度。完善上面的代码,并为 new_img.show() 预览图片:
new_img = PI.open(io.BytesIO(image_lst[0])).rotate(270) new_img.show()弹出图片并恢复到了正位,接下来分别截取需要提取部位字符串的图片了,尽量让图片中只有需要识别的部分,获取识别出来容易简单处理获得需要的内容 截取图片用 image.crop((left, top, right, bottom)) 四个参数需要反复调试才能确定。首先提取 TRACKING# 部位需要的内容,经确定四个参数分别是 350 600 1350 730,尝试截取和预览图片:
### 解析1Z开头码 left = 350 top = 600 right = 1300 bottom = 730 image_obj1 = new_img.crop((left, top, right, bottom)) image_obj1.show()截取成功后可以交给 OCR 了,代码为 tool.image_to_string()
txt1= tool.image_to_string(image_obj1) print(txt1)通过正则提取红框内需要的内容:
req = 'TRACKING #: (.*)' txt1_real = ''.join(re.findall(req, txt1)[0].split()) print(txt1_real)用同样的办法也可以提取另一个红框的文字:
### 解析C开头码 left = 205 top = 1170 right = 2450 bottom = 1200 image_obj2 = new_img.crop((left, top, right, bottom)) txt2 = tool.image_to_string(image_obj2) req = 'C.\d+\d' txt2_real = re.findall(req, txt2)[0]最后将两个字符串和 & 拼接为长字符串,然后通过 os.rename() 完成重命名文件的目的:
file_name = txt1_real + '&' + txt2_real os.rename(path + r'\文件 (1).pdf', path + r'\{}.pdf'.format(file_name))至此我们就完成了需求的一大步,接下来只需要借助 glob 模块遍历目标文件夹,对获取的每一个文件执行上面的操作即可,这样就将全部需求完成,所有的PDF均按照指定字段进行重命名
本文的分享就到这里,上面的 Python办公自动化 案例可以扩展到很多使用场景(核心为提取PDF指定内容+批量重命名),大家可以自己找一些文件测试学习,如果对你有所帮助可以给本文来一波三连~