当前位置:   article > 正文

Python自动化办公:提取 PDF 指定内容,并批量重命名文件_python批量提取pdf中的信息

python批量提取pdf中的信息

本文将分享一个常见办公场景下的Python自动化案例,主要将涉及以下两个内容

  • Python提取图片型PDF内容
  • Python批量重命名文件

一、需求描述

有一个文件夹 货物清单 中含有多张货物清单的影印版 PDF,分别命名为 文件 (1).pdf 文件 (2).pdf ... 文件 (20).pdf,如下所示:

PDF 是纯图片类型,里面的文字信息无法手动复制,同时本例中所有的图片都向左旋转 90 度,大致如下图所示(马赛克部分为无关内容):

我们需要做的是 「 获取图中红框部分 TRACKING# 以及 REF2 冒号后的字符串,用 & 连接后重命名这个 PDF 文件 」 !

也就是需要根据每个PDF内容来批量重命名一大堆文件,最终效果如下

二、逻辑梳理与基础配置

本需求是一个批处理问题,即需要对诸多文件执行类型的操作,基本思路是先完成对一份文件的处理,然后借助 glob 模块获取指定路径所有符合要求的文件路径,执行批处理框架,固后面的操作先针对 文件 (1).pdf

需求中最大的难题在于,PDF 是图片类型,无法按常规方法提取文件。解决思路是利用光学字符识别(OCR)将图片中的文字识别出,然后进行后续操作,这里就涉及到一些先后顺序:

  1. 将图片向右旋转回正位
  2. 截取需要识别的部分图片
  3. 将截取的图片交给 OCR 获取字符串

为了完成 OCR,需要在电脑上安装三个软件:

  1. Ghostscript 32 位
  2. ImageMagick 32 位
  3. tesseract-OCR 32 位

三个软件的下载安装没有特殊的地方(tesseract 配置稍复杂但网络有上诸多教程,这里不再赘述),读者可自行搜索下载及配置

三、代码实现

首先导入需要的模块:

  1. from wand.image import Image
  2. from PIL import Image as PI
  3. import pyocr
  4. import pyocr.builders
  5. import io
  6. import glob
  7. import re
  8. import os
  9. import shutil

具体的模块用途可以参考下面具体代码。其中 wand 和 pyocr 由于是非标准库需要自行额外安装。打开命令行输入:

  1. pip install wand
  2. pip install pyocr

作为测试以及方便后面的实际运行,需求中的 货物清单 这一文件夹可以放在桌面上。为了获取其中的内容首先我们要明确桌面的路径。每个人每台电脑的桌面路径都不相同,如果直接复制当前电脑桌面的路径,更换电脑或者其他用户调试就需要额外修改。可通过下面基于 os 模块的代码获取桌面路径:

  1. # 获取桌面路径包装成一个函数
  2. def GetDesktopPath():
  3.     return os.path.join(os.path.expanduser("~"), 'Desktop')
  4. path = GetDesktopPath() + r'\货物清单' # 获取 货物清单 文件夹路径

获取配置好的 tesseract 便于后面调用:

tool = pyocr.get_available_tools()[0]

以 文件 (1).pdf 为例,通过 wand 模块将 PDF 文件转化为分辨率为 300 的 jpeg 图片形式:

  1. image_pdf = Image(filename=path + r'\文件 (1).pdf', resolution=300)
  2. image_jpeg = image_pdf.convert('jpeg')

将图片解析为二进制矩阵:

  1. image_lst = []
  2. for img in image_jpeg.sequence:
  3.     img_page = Image(image=img)
  4.     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() 预览图片:

  1. new_img = PI.open(io.BytesIO(image_lst[0])).rotate(270)
  2. new_img.show()

弹出图片并恢复到了正位,接下来分别截取需要提取部位字符串的图片了,尽量让图片中只有需要识别的部分,获取识别出来容易简单处理获得需要的内容截取图片用 image.crop((left, top, right, bottom)) 四个参数需要反复调试才能确定。首先提取 TRACKING# 部位需要的内容,经确定四个参数分别是 350 600 1350 730,尝试截取和预览图片:

  1. ### 解析1Z开头码
  2. left = 350
  3. top = 600
  4. right = 1300
  5. bottom = 730
  6. image_obj1 = new_img.crop((lefttoprightbottom))
  7. image_obj1.show()

截取成功后可以交给 OCR 了,代码为 tool.image_to_string()

  1. txt1= tool.image_to_string(image_obj1)
  2. print(txt1)

5

通过正则提取红框内需要的内容:

  1. req = 'TRACKING #: (.*)'
  2. txt1_real = ''.join(re.findall(req, txt1)[0].split())
  3. print(txt1_real)

用同样的办法也可以提取另一个红框的文字:

  1. ### 解析C开头码
  2. left = 205
  3. top = 1170
  4. right = 2450
  5. bottom = 1200
  6. image_obj2 = new_img.crop((lefttoprightbottom))
  7. txt2 = tool.image_to_string(image_obj2)
  8. req = 'C.\d+\d'
  9. txt2_real = re.findall(req, txt2)[0]

最后将两个字符串和 & 拼接为长字符串,然后通过 os.rename() 完成重命名文件的目的:

  1. file_name = txt1_real + '&' + txt2_real
  2. os.rename(path + r'\文件 (1).pdf', path + r'\{}.pdf'.format(file_name))

至此我们就完成了需求的一大步,接下来只需要借助 glob 模块遍历目标文件夹,对获取的每一个文件执行上面的操作即可,这样就将全部需求完成,所有的PDF均按照指定字段进行重命名

本文的分享就到这里,上面的 Python办公自动化 案例可以扩展到很多使用场景

Python经验分享

学好 Python 不论是就业还是做副业赚钱都不错,但要学会 Python 还是要有一个学习规划。最后大家分享一份全套的 Python 学习资料,给那些想学习 Python 的小伙伴们一点帮助!

Python学习路线

这里把Python常用的技术点做了整理,有各个领域的知识点汇总,可以按照上面的知识点找对应的学习资源。
在这里插入图片描述

学习软件

Python常用的开发软件,会给大家节省很多时间。
在这里插入图片描述

学习视频

编程学习一定要多多看视频,书籍和视频结合起来学习才能事半功倍。
在这里插入图片描述

100道练习题

在这里插入图片描述

实战案例

光学理论是没用的,学习编程切忌纸上谈兵,一定要动手实操,将自己学到的知识运用到实际当中。
在这里插入图片描述
最后祝大家天天进步!!

上面这份完整版的Python全套学习资料已经上传至CSDN官方,朋友如果需要可以直接微信扫描下方CSDN官方认证二维码免费领取【保证100%免费】。

在这里插入图片描述

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/article/detail/51497
推荐阅读
相关标签
  

闽ICP备14008679号