当前位置:首页 > 天道酬勤 > 正文内容

流畅的python pdf(python重命名文件夹)

张世龙2021年12月21日 23:30天道酬勤740

来源:早起的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指定内容+批量重命名),大家可以自己找一些文件测试学习,如果对你有所帮助可以给本文来一波三连~

扫描二维码推送至手机访问。

版权声明:本文由花开半夏のブログ发布,如需转载请注明出处。

本文链接:https://www.zhangshilong.cn/work/26649.html

分享给朋友:

发表评论

访客

看不清,换一张

◎欢迎参与讨论,请在这里发表您的看法和观点。