当前位置: 首页>编程语言>正文

pd series 命名列 pdf按内容命名


PDF文件拆分为单独页面且通过每页的相关内容重名命

  • 1. 前言
  • 2. 作用
  • 2.1 引申
  • 3. 安装包
  • 4. 代码实现
  • 4.1文件夹创建
  • 4.2 pdf转图片
  • 4.3 通过图片获取pdf特定文本内容
  • 4.3.1 图片文字读取
  • 4.3.2 获取图片文本子串
  • 4.3.3 改变图片方向
  • 4.3.4 通过图片获取pdf序列代码
  • 4.4 拆分pdf文档按页面命名为单页文档
  • 4.5 保存文档的名称重命名
  • 4.6 主函数
  • 5. 过程结果案例展示
  • 5.1 结果说明
  • 5.1.1 pdf_page
  • 5.1.2 png
  • 5.1.3 rename_pdf
  • 5.2 缺点及优化
  • 5.2.1 缺点
  • 5.2.2 优化


1. 前言

本文主要是将一个pdf文档通过文档拆分,图片识别,文档重命名三步完成了通过pdf页面内容某字符串对pdf进行重名名的目的。主要包括文件夹自动创建,字符串正则匹配,pdf拆分,pdf转图片,图片内容识别,内容提取等

2. 作用

适用大量PDF文件进行内容比对,同时取出其中部分内容重命名的场景。

2.1 引申

可通过pdf文档识别提取公有信息的PDF页。

3. 安装包

1.Tesseract-OCR

  • GitHub 地址
  • 安装包官方下载地址
  • Tesseract-OCR环境变量配置自行百度。
  • 其他包使用 pip instal 包名 安装

4. 代码实现

4.1文件夹创建

from PyPDF2 import PdfFileReader, PdfFileWriter
import os
import pytesseract
from PIL import Image
import fitz
import re
#图片目录创建
def png_MK_dir(pdf_path):
    pdf_dir = os.path.dirname(pdf_path)
    png_dir= os.path.join(pdf_dir,'png')
    if os.path.exists(png_dir):
        print("图片目录存在")
    else:
        print("图片目录不存在")
        print("正在为您创建目录")
        os.mkdir(png_dir)          #如果不存在则创建目标目录
        print("图片目录创建完成")
    return png_dir
#pdf分页后的单页目录创建
def PDF_MK_dir(pdf_path):
    pdf_dir = os.path.dirname(pdf_path)
    pdf_page_dir= os.path.join(pdf_dir,'pdf_page')
    if os.path.exists(pdf_page_dir):
        print("PDF目录存在")
    else:
        print("PDF目录不存在")
        print("正在为您创建目录")
        os.mkdir(pdf_page_dir)          #如果不存在则创建目标目录
        print("PDF目录创建完成")
    return pdf_page_dir
#pdf分页后的单页目录创建
def RENAME_PDF_MK_dir(pdf_path):
    pdf_dir = os.path.dirname(pdf_path)
    rename_pdf_dir= os.path.join(pdf_dir,'rename_pdf')
    if os.path.exists(rename_pdf_dir):
        print("RENAMEPDF目录存在")
    else:
        print("RENAMEPDF目录不存在")
        print("正在为您创建目录")
        os.mkdir(rename_pdf_dir)          #如果不存在则创建目标目录
        print("RENAMEPDF目录创建完成")
    return rename_pdf_dir

4.2 pdf转图片

#pdf转图片
def pdf_to_pic(list_pdf,png_dir):
    list_png_path=[]
    for pg_pdf_path in list_pdf:
        doc = fitz.open(pg_pdf_path)
        png_nm=os.path.split(pg_pdf_path)[1].split('.')[0]+'.png'
        print(png_nm)
        png_path=os.path.join(png_dir,png_nm)
        print(png_path)
        page = doc[0]
        rotate = int(0)
        # 每个尺寸的缩放系数为2,这将为我们生成分辨率提高四倍的图像。
        zoom_x = 2.0
        zoom_y = 2.0
        trans = fitz.Matrix(zoom_x, zoom_y).prerotate(rotate)
        pm = page.get_pixmap(matrix=trans, alpha=False)
        pm.save(png_path)
        list_png_path.append(png_path)
    return list_png_path

4.3 通过图片获取pdf特定文本内容

4.3.1 图片文字读取

#图片文字读取
def image2txt(png_path,tesseract_path):
    pytesseract.pytesseract.tesseract_cmd = tesseract_path
    text = pytesseract.image_to_string(Image.open(png_path),lang="chi_sim")
    # 去掉字符串中的所有空格
    text = text.replace(" ", "")
    #print(text)
    return text

4.3.2 获取图片文本子串

#获取图片文本子串
def get_str_sub(str1):
    for str_sn in str1.splitlines():
        str_sn.replace
        ret = re.match('SerialNumber.+',str_sn)
        if ret:
            str_sub=re.search("\d+",ret.group()).group()
            #print(str_sub)
            break
        else:
            str_sub=''       
    return(str_sub)

4.3.3 改变图片方向

#改变图片方向
def change_photos(png_path):
    im = Image.open(png_path)
    im_rotate = im.rotate(-90, expand=1)
    im_rotate.save(png_path)

4.3.4 通过图片获取pdf序列代码

# 通过图片获取pdf序列代码
def get_pdf_nm(list_png_path,tesseract_path):
    new_dic_pdf_nm={}
    for png_path in list_png_path:
        #获取图片序号:
        key=os.path.split(png_path)[1].split('.')[0]
        for i in range(4):
            #获取图片信息
            str1=image2txt(png_path,tesseract_path)
            #获取子字符串
            pdf_nm=get_str_sub(str1)
            #print(pdf_nm)
            #判断子串是否为空
            if pdf_nm=='':
                #为空则顺时针旋转90°
                change_photos(png_path)        
            else:
                new_dic_pdf_nm[key]=pdf_nm
                break
    return new_dic_pdf_nm

4.4 拆分pdf文档按页面命名为单页文档

# 拆分pdf文档按页面命名为单页文档。
def pdf_separate(pdf_page_dir,pdf_path):
    list_pdf=[]
    # 读取pdf
    with open(pdf_path, 'rb') as in_pdf:
        pdf_file = PdfFileReader(in_pdf)
        # 从pdf中取出指定页,逐一取出
        for pg in range(0,pdf_file.numPages):
            # 初始化一个pdf(因要拆成单页,所以每次得初始化)
            output = PdfFileWriter()
            output.addPage(pdf_file.getPage(pg))
            pdf_nm='_'+str(pg)+'.pdf'
            #print(pdf_nm)
            pdf_out=os.path.join(pdf_page_dir,pdf_nm)
            #print(pdf_out)
            with open(pdf_out, 'ab') as out_pdf:
                output.write(out_pdf)
            #print(pdf_out)
            list_pdf.append(pdf_out)
    return list_pdf

4.5 保存文档的名称重命名

def pdf_reName(new_dic_pdf_nm,list_pdf,renm_pdf_dir):
    pdf_dir = os.path.dirname(list_pdf[0])
    for pdf_path in list_pdf:
        key=os.path.split(pdf_path)[1].split('.')[0]
        print(key)
        new_pdf_nm=new_dic_pdf_nm[key]
        new_pdf_path = os.path.join(renm_pdf_dir,new_pdf_nm+'.pdf')
        print(new_pdf_path)
         # 读取pdf
        with open(pdf_path, 'rb') as in_pdf:
            pdf_file = PdfFileReader(in_pdf)
            print(pdf_file)
            output = PdfFileWriter()
            output.addPage(pdf_file.getPage(0))
            print(output)
            # 写出pdf
            with open(new_pdf_path,'ab') as out_pdf:
                output.write(out_pdf)
    print('重命名已完成')

4.6 主函数

def main():
    pdf_path='D:\其他\pdf分页\1.pdf'
    #Tesseract-OCR 安装位置
    tesseract_path=r'F:\Tesseract-OCR\tesseract.exe'
    #判断pdf分页地址是否存在
    pdf_page_dir = PDF_MK_dir(pdf_path)
    print(pdf_page_dir)
    #判断图片目录创建
    png_dir = png_MK_dir(pdf_path)
    print(png_dir)
    #判段重命名PDF文件目录创建
    renm_pdf_dir=RENAME_PDF_MK_dir(pdf_path)
    #拆分pdf。
    list_pdf = pdf_separate(pdf_page_dir,pdf_path)
    print(list_pdf)
    #pdf转图片
    list_png_path=pdf_to_pic(list_pdf,png_dir)
    print(list_png_path)
    #获取图片序列号
    new_dic_pdf_nm=get_pdf_nm(list_png_path,tesseract_path)
    print(new_dic_pdf_nm)
    #pdf单页重命名
    pdf_reName(new_dic_pdf_nm,list_pdf,renm_pdf_dir)
if __name__ == '__main__':
	#需分页的PDF文件地址
    pdf_path=input('请输入pdf文件地址,如:D:\其他\pdf分页\1.pdf')
    #Tesseract-OCR 安装位置
    tesseract_path=input('请输入Tesseract-OCR 安装位置地址,如 F:\Tesseract-OCR\tesseract.exe')
    main()

5. 过程结果案例展示

5.1 结果说明

1.pdf为原文档

2.pdf_page为将1.pdf拆分后的子pdf文件

3.PNG 为通过子pdf文件转化的图片文件

4.rename_pdf 为通过图片识别的特定内容重命名的子pdf文件目录。

pd series 命名列 pdf按内容命名,pd series 命名列 pdf按内容命名_重命名,第1张

5.1.1 pdf_page

pd series 命名列 pdf按内容命名,pd series 命名列 pdf按内容命名_python_02,第2张

5.1.2 png

pd series 命名列 pdf按内容命名,pd series 命名列 pdf按内容命名_分页_03,第3张

5.1.3 rename_pdf

pd series 命名列 pdf按内容命名,pd series 命名列 pdf按内容命名_重命名_04,第4张

5.2 缺点及优化

5.2.1 缺点

  • 在进行文件读取与写入时为了满足将一个大文件拆分为以页面为一个单位的小文件,文件生成器多次生成
  • 图片识别读取过程耗时较长
  • 过程中形成多余的文件夹

5.2.2 优化

  • 以上缺点处可考虑优化
  • 可再拔高一层形成class 类。

★★以上是我的学习的捣鼓笔记,如有不足或错误之处欢迎指正,谢谢!



https://www.xamrdz.com/lan/5a41938522.html

相关文章: